Chuyển đến nội dung
Xử lý data theo từng Batch

Xử lý data theo từng Batch

Team tài chính cần doanh thu ngày hôm qua trước 7 giờ sáng. Họ không cần con số đổi sau từng giây; họ cần kết quả đầy đủ và có thể đối soát.

Batch Processing (xử lý theo lô) gom một tập data có giới hạn rồi xử lý trong một lần chạy. Lô có thể là order trong một ngày, một file vừa nhận hoặc các row mới kể từ lần chạy trước.

    flowchart TD
    A["00:00–23:59<br/>Order được tạo"]
    B["01:00<br/>Chốt lô hôm qua"]
    C["01:05<br/>Transform và kiểm tra"]
    D["01:20<br/>Bảng doanh thu sẵn sàng"]
    A --> B --> C --> D
  

Một lô có ranh giới

Job nhận hai tham số:

start_time = 2026-09-08 00:00:00
end_time   = 2026-09-09 00:00:00
SELECT * FROM orders
WHERE created_at >= TIMESTAMP '2026-09-08 00:00:00'
  AND created_at <  TIMESTAMP '2026-09-09 00:00:00';

Khoảng này gồm start_time nhưng không gồm end_time, nên order đúng lúc nửa đêm không bị tính ở cả hai ngày.

order_id created_at amount
ORD-1042 2026-09-08 12:02:10 120000
ORD-1043 2026-09-08 12:07:31 85000

Job có thể tổng hợp thành:

order_date total_orders revenue
2026-09-08 2 205000

Full Load và Incremental Load

Full Load đọc toàn bộ data mỗi lần. Nó đơn giản và có thể đủ tốt khi bảng nhỏ. Incremental Load chỉ đọc phần mới hoặc thay đổi, nhanh hơn khi lịch sử lớn nhưng dễ bỏ sót update.

Cách đọc Ưu điểm Rủi ro
Full Load Dễ hiểu và tái tạo Chậm khi data lớn
Incremental Load Chỉ xử lý phần cần Có thể tạo khoảng trống

Nên bắt đầu bằng cách đơn giản nhất đáp ứng thời gian chạy.

Data đến muộn

Thanh toán của ngày 8 có thể đến vào sáng ngày 9 vì hệ thống nguồn bị chậm. Pipeline có thể đọc lại ba ngày gần nhất hoặc cho phép chạy lại một ngày cụ thể. Output phải có Idempotency để lần chạy lại không cộng doanh thu lần thứ hai.

Thất bại giữa chừng

Nếu job ghi 600 trong 1.000 row rồi dừng, người dùng có thể thấy một ngày chưa hoàn tất. Cách an toàn hơn là ghi vào vùng tạm, kiểm tra rồi mới thay partition chính.

    flowchart TD
    A["Tính lô ngày 08-09"]
    B["Ghi vào vùng tạm"]
    C["Kiểm tra kết quả"]
    D["Thay partition chính"]
    A --> B --> C --> D
  

Batch phù hợp khi người dùng chấp nhận data trễ vài phút, vài giờ hoặc một ngày, input đến theo file, hoặc kết quả cần chốt theo kỳ. Nếu tài xế cần nhận order mới trong vài giây, đợi batch mỗi giờ là quá chậm. Nhưng với nhiều report và đối soát, Batch vẫn rõ ràng, dễ vận hành và đủ nhanh.