# Batch và stream là gì? Hiểu nhanh qua một mô phỏng

> Batch gom dữ liệu rồi xử lý một lần, stream xử lý ngay khi dữ liệu đến. Tự chạy mô phỏng để thấy cái giá của mỗi cách, kèm bảng so sánh và ví dụ thực tế.

Canonical URL: https://learn.chabulab.com/vi/system-design/batch-va-stream-la-gi. Kiểm tra thông tin: 2026-11-03.

- Batch xử lý một tập dữ liệu đã chốt, theo lịch, rồi tắt. Rẻ và dễ làm đúng, nhưng kết quả đến muộn.
- Stream xử lý từng sự kiện ngay khi nó đến và chạy 24/7. Kết quả nhanh, nhưng tốn máy và khó làm đúng hơn.
- Câu hỏi để chọn: nếu kết quả chậm một giờ, có ai thiệt không? Không thì bắt đầu với batch.

Cùng một dòng dữ liệu có hai cách xử lý: gom lại rồi làm một lần, hoặc làm ngay khi dữ liệu vừa đến. Hai ví dụ bạn gặp hằng ngày:

- **Batch là sao kê cuối tháng.** Ngân hàng gom mọi giao dịch của cả tháng, tính một lần rồi gửi bạn một bản sao kê.
- **Stream là tin nhắn biến động số dư.** Mỗi lần bạn quẹt thẻ, tin nhắn đến sau vài giây vì hệ thống xử lý từng giao dịch ngay khi nó xảy ra.

## Tự chạy thử: hai cách xử lý khác nhau thế nào?

Cả hai làn dưới đây nhận cùng các đơn hàng của một cửa hàng online. Làn Batch đợi đến nhịp rồi xử lý cả mẻ. Làn Stream xử lý từng đơn ngay khi nó đến.

*Mô phỏng hai làn xử lý cùng một dòng đơn hàng. Kéo thanh trượt và bấm nút để thấy cái giá của mỗi cách.*

Thử lần lượt:

1. Kéo "Nhịp chạy của Batch" từ 8 lên 20 giây. Độ trễ của Batch tăng theo nhịp, còn Stream giữ nguyên.
2. Bấm "Bùng nổ 30 đơn". Stream phải xếp hàng vì mỗi đơn cần một khoảng xử lý riêng. Batch gom cả cụm vào mẻ kế tiếp và xử lý gọn hơn.
3. Nhìn dòng "Thời gian máy phải bật". Batch chỉ bật khi chạy mẻ. Stream phải bật liên tục để chờ đơn.
4. Kéo "Đơn hàng đến" lên 12 đơn/giây. Stream không còn theo kịp và hàng đợi dài ra mãi.

## Khác biệt gốc của batch và stream nằm ở đâu?

Khác biệt gốc nằm ở hình dạng của dữ liệu. Batch làm việc với dữ liệu **hữu hạn (bounded)**, đã có điểm kết thúc, ví dụ toàn bộ đơn hàng ngày 25/10. Stream làm việc với dữ liệu **vô hạn (unbounded)**, chưa biết khi nào dừng.

## Batch processing hoạt động thế nào?

Batch xử lý một tập dữ liệu đã thu thập sẵn. Job bắt đầu, đọc toàn bộ dữ liệu của kỳ, tính toán, ghi kết quả rồi kết thúc. Lần chạy sau bắt đầu lại với tập dữ liệu mới.

Nguồn dữ liệu → Data lake → Job theo lịch → Data warehouse → Báo cáo, ML

Đặc điểm của batch:

- **Dữ liệu hữu hạn.** Có điểm đầu và điểm cuối rõ ràng, ví dụ toàn bộ giao dịch của ngày hôm qua.
- **Chạy theo lịch.** Mỗi đêm, mỗi giờ hoặc khi có yêu cầu. Giữa các lần chạy, máy có thể tắt.
- **Thông lượng cao.** Đọc và tính cả khối lớn rất hiệu quả.
- **Độ trễ cao.** Kết quả có sau vài phút, vài giờ hoặc sang ngày hôm sau.
- **Dễ chạy lại.** Sai logic thì sửa rồi chạy lại trên cùng dữ liệu. Job idempotent cho kết quả giống nhau mỗi lần.

Ví dụ: tính lương, sao kê thẻ, hoá đơn tiền điện, báo cáo doanh thu ngày, đối soát thanh toán, huấn luyện mô hình học máy trên dữ liệu cả năm.

## Stream processing hoạt động thế nào?

Stream coi dữ liệu là một dòng sự kiện không có điểm kết thúc. Mỗi sự kiện, như một lần quẹt thẻ hay một số đo cảm biến, được xử lý ngay khi đến, thường trong vài mili giây đến vài giây. Ứng dụng chạy liên tục và nhớ trạng thái giữa các sự kiện.

Nguồn sự kiện → Message broker → Stream processor → Đích → Hành động

Đặc điểm của stream:

- **Dữ liệu vô hạn.** Sự kiện đến liên tục, không biết khi nào dừng.
- **Chạy liên tục 24/7.** Máy phải luôn bật để chờ sự kiện.
- **Độ trễ thấp.** Kết quả có sau mili giây đến vài giây.
- **Có trạng thái.** Bộ đếm, tổng tiền, phiên đăng nhập được giữ lại giữa các sự kiện.
- **Khó làm đúng hơn.** Phải xử lý thứ tự sự kiện, dữ liệu đến trễ, lỗi giữa chừng và tránh xử lý trùng.

Ví dụ: chặn giao dịch nghi gian lận, vị trí tài xế trên bản đồ, cảnh báo khi lỗi tăng đột biến, dashboard ngày khuyến mãi lớn, giám sát cảm biến nhà máy.

## So sánh batch và stream

| Tiêu chí | Batch | Stream |
| --- | --- | --- |
| Dữ liệu | Hữu hạn, đã chốt trước khi xử lý | Vô hạn, đến liên tục |
| Khi nào chạy | Theo lịch hoặc khi có yêu cầu | Liên tục 24/7 |
| Độ trễ kết quả | Vài phút đến vài giờ | Mili giây đến vài giây |
| Thông lượng | Rất cao, tối ưu cho khối lớn | Cao, nhưng mỗi sự kiện có chi phí riêng |
| Chi phí máy | Bật khi chạy, tắt khi xong | Luôn bật, cần dư tải cho giờ cao điểm |
| Độ phức tạp | Thấp hơn, dễ kiểm tra | Cao hơn: trạng thái, thứ tự, dữ liệu trễ |
| Khi gặp lỗi | Chạy lại cả job, miễn là idempotent | Khôi phục từ checkpoint và offset |
| Tính đầy đủ | Thấy toàn bộ dữ liệu của kỳ | Cập nhật dần, có thể chỉnh khi dữ liệu trễ đến |

## Hiểu lầm hay gặp

- **Stream không luôn tốt hơn.** Nó tốn máy chạy liên tục và khó làm đúng hơn. Nếu người dùng chỉ xem báo cáo mỗi sáng thì batch rẻ và đơn giản hơn.
- **Có cách ở giữa: micro-batch.** Spark Structured Streaming mặc định chia dòng thành các lô rất nhỏ. Flink xử lý từng sự kiện. Cả hai đều được gọi là streaming.
- **Real-time có nhiều mức.** Dashboard cập nhật mỗi phút, cảnh báo trong 1 giây và chặn gian lận trong 100 mili giây là ba yêu cầu khác nhau, chi phí cũng khác. Hãy hỏi độ trễ chấp nhận được trước khi chọn công nghệ.

> Mô phỏng ở trên là mô hình đơn giản hoá để thấy xu hướng, không phải số đo của một hệ thống thật.

## Kiểm tra lại

1. Ứng dụng ngân hàng gửi tin nhắn ngay sau khi bạn quẹt thẻ. Đó là cách xử lý nào?
   Xem đáp án: Stream, vì mỗi giao dịch được xử lý ngay khi xảy ra. Tin nhắn phát sinh từ từng sự kiện giao dịch và đến sau vài giây. Đó là đặc trưng của stream. Sao kê cuối tháng mới là batch.
2. Dữ liệu vô hạn (unbounded) nghĩa là gì?
   Xem đáp án: Dữ liệu tiếp tục đến và chưa biết khi nào dừng. Vô hạn nói về việc dòng dữ liệu không có điểm kết thúc, không nói về dung lượng. Một file 10 TB vẫn là dữ liệu hữu hạn.
3. Trong mô phỏng, đơn hàng đến dồn dập vượt khả năng xử lý. Làn stream gặp chuyện gì?
   Xem đáp án: Hàng đợi dài ra, độ trễ tăng dần. Mỗi đơn cần một khoảng xử lý riêng. Khi đơn đến nhanh hơn tốc độ xử lý, hàng đợi dài ra. Thực tế ta thêm máy hoặc chia partition, và việc đó tốn thêm chi phí.

## Nguồn

- [Apache Flink: tài liệu về stream processing](https://nightlies.apache.org/flink/flink-docs-stable/docs/concepts/overview/)
- [Apache Spark: Structured Streaming](https://spark.apache.org/docs/latest/streaming/index.html)
