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.
- 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. - Idempotent: chạy lại job 1 ngày ghi đè đúng phân vùng đó, kết quả giống hệt. Có test.
- Chạy lại lịch sử (backfill) 7 ngày bằng 1 lệnh.
Bài 2: Pipeline stream
- 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.
- 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. - 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.
- Giết 1 node giữa chừng. Stream vẫn ghi được với
W = 2. Ghi lại. - 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.
- 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.
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.mdcó 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.