Backpressure: khi producer nhanh gấp 3, làm sao queue không tràn?
Tóm tắt
Backpressure là cơ chế để phía nhận báo ngược cho phía gửi “chậm lại”. Buffer có ngưỡng trên (high watermark) để phát tín hiệu PAUSE và ngưỡng dưới (low watermark) để phát RESUME. Nhờ vậy queue không tràn và cả hệ thống chạy đúng tốc độ của consumer.
Cơ chế watermark (buffer 8 chỗ)
| Mốc | Điều xảy ra |
|---|---|
| Chạm high watermark 6/8 | Tín hiệu PAUSE gửi ngược lên producer. |
| Lên đỉnh 7/8 | 2 message đang bay vẫn tới nơi — ngưỡng đặt dưới sức chứa chính là để hấp thụ phần này. |
| Tụt về low watermark 2/8 | Tín hiệu RESUME, producer gửi tiếp. |
Producer nhanh gấp 3 cũng không kéo throughput lên: hệ thống luôn chạy đúng 1 msg/s của consumer.
Áp dụng thế nào?
- Đừng dùng queue không giới hạn trong code production — đó là cách nhanh nhất dẫn tới OOM.
- Chọn chiến lược khi đầy: chặn producer (backpressure), bỏ bớt message (drop/sample), hoặc trả lỗi 429 cho client.
- Có sẵn trong nhiều công cụ: Node.js streams (
highWaterMark, sự kiệndrain), Reactive Streams/RxJS, TCP flow control, Kafka consumer lag. - Giải quyết tận gốc: nếu producer luôn nhanh hơn, cần scale consumer — backpressure chỉ giữ hệ thống không sập.