App: pipeline batch vs stream và CAP

Xây pipeline dữ liệu kép: batch đúng dần, stream realtime, đối chiếu chênh lệch, phân tích đánh đổi CAP khi node chết.
Chuyên giaThuật toán ~120 phút

Ôn lại trước khi học

Giới thiệu

Bài này xây pipeline đếm doanh thu 2 nhánh. Nhánh nhanh báo liền, nhánh chậm chốt số chuẩn.

Kiến thức cần nhớ

Batch đúng dần

  • Batch quét toàn bộ log ngày rồi tính lại từ đầu.
  • Chạy định kỳ, idempotent chạy lại vẫn ra 1 kết quả.
  • Throughput cao, chính xác nhưng trễ cả ngày.
  • Ví dụ đời thường: cuối ngày cộng lại sổ thu chi cả ngày.

Stream realtime

  • Stream cập nhật mỗi phút theo event chảy tới.
  • Dùng cửa sổ và watermark để chờ event trễ.
  • Event trễ quá watermark ghi riêng rồi hiệu chỉnh sau.
  • Event time chống sai khi xử lý chậm hơn thực tế.

CAP khi node chết

  • CAP: khi chia mạng phải chọn trả lời hay chọn đúng.
  • Giết 1 trong 3 node mà stream vẫn trả lời là chọn A.
  • Chia mạng mà bên thiểu số từ chối ghi là chọn C.
  • Ngày thường không chia mạng thì vẫn có cả 2.

Ví dụ

  • Input: không trễ không trùng. Output: stream khớp batch 100% cuối kỳ.
  • Giải thích: không sự cố thì nhánh nhanh và nhánh chuẩn trùng nhau.
  • Input: trễ 5% event. Output: stream sai tạm rồi đuổi kịp batch, sai cuối dưới 1%.
  • Giải thích: event trễ tới muộn được hiệu chỉnh bổ sung sau.

💻 Bài tập

Ngôn ngữ: Python 3. Dùng code ngày 60, 105. Nộp vào day-143-pipeline/.

Bài 1: Pipeline batch

Dữ liệu: log truy cập web 7 ngày (sinh giả, 10^6 dòng/ngày) ts, user_id, url, status, bytes.

  1. Job batch tính mỗi ngày: số user duy nhất, top 10 URL, tỉ lệ lỗi 5xx theo giờ. Ghi Parquet theo phân vùng date=YYYY-MM-DD.
  2. Idempotent: chạy lại job 1 ngày ghi đè đúng phân vùng đó, kết quả giống hệt. Có test.
  3. Chạy lại lịch sử (backfill) 7 ngày bằng 1 lệnh.

Bài 2: Pipeline stream

  1. Cùng các chỉ số nhưng cập nhật mỗi phút, cửa sổ tumbling 1 phút theo thời gian sự kiện.
  2. 5% event đến trễ 1-10 phút. Watermark 3 phút. Event trễ hơn watermark ghi vào late/ rồi job batch cuối ngày hiệu chỉnh.
  3. So kết quả stream (sau hiệu chỉnh) với batch của cùng ngày. Phải khớp.
Tổng request ngày D: stream_realtime + late_corrections == batch

Bài 3: CAP trên cụm 3 node (nâng cao)

Dùng kho nhân bản ngày 60 làm nơi lưu bộ đếm stream.

  1. Giết 1 node giữa chừng. Stream vẫn ghi được với W = 2. Ghi lại.
  2. Chia mạng 1 | 2. Bên thiểu số từ chối ghi (chọn C). Bên đa số vẫn chạy.
  3. Chuyển sang chế độ AP: cả 2 bên ghi, sau khi nối lại gộp bộ đếm bằng G-Counter (CRDT): mỗi node giữ đếm riêng, giá trị = tổng, gộp bằng max từng node. Chứng minh không mất đếm.
  4. README.md: sơ đồ pipeline, bảng batch vs stream (độ trễ, độ chính xác, chi phí), lựa chọn CAP cho từng chỉ số.

✅ Tiêu chí hoàn thành

  • Job batch idempotent, có test chạy lại.
  • Stream sau hiệu chỉnh khớp batch.
  • G-Counter gộp đúng sau chia mạng.
  • README.md có sơ đồ và bảng so sánh.

❓ Câu hỏi ôn tập

  • Batch và stream mỗi nhánh mạnh điều gì?
  • Watermark giúp xử lý event trễ thế nào?
  • Trùng event khử bằng cách nào?
  • CAP buộc chọn A hay C khi nào?

🌕 Bạn đã hoàn thành ngày 143. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.