System Design

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/8Tín hiệu PAUSE gửi ngược lên producer.
Lên đỉnh 7/82 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/8Tí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ện drain), 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.