Ý chính: Hàng đợi chỉ hấp thụ được các đợt tăng tải ngắn. Nếu nhận việc không giới hạn, nó chỉ biến quá tải thành thời gian chờ dài hơn.
Thuật ngữ trong bài: Queue: hàng đợi công việc; backpressure: giảm nhận việc khi xử lý không kịp; dead-letter queue: nơi giữ các công việc đã thử nhiều lần nhưng vẫn lỗi.
Bài toán thực tế
Tăng số tiến trình theo độ dài hàng đợi có thể làm quá tải cơ sở dữ liệu hoặc dịch vụ bên thứ ba. Một khách hàng nhập dữ liệu số lượng lớn cũng có thể chiếm hết năng lực xử lý nếu hệ thống không có hạn mức công bằng.
Số lượng tác vụ trong hàng đợi không phản ánh đầy đủ tác động tới khách hàng: mười email khác hoàn toàn mười tác vụ mã hóa video. Tín hiệu hữu ích hơn là thời gian chờ của tác vụ cũ nhất theo từng nhóm dịch vụ.
Tăng worker có thể làm hàng đợi ngắn lại nhưng khiến cơ sở dữ liệu hoặc nhà cung cấp bên ngoài quá tải. Mỗi nhóm tác vụ cần giới hạn xử lý đồng thời dựa trên năng lực thật của hệ thống phía sau.
Thiết kế và triển khai
- Phân loại tác vụ theo mục tiêu độ trễ, chi phí xử lý và khách hàng trước khi đưa vào hàng đợi.
- Mỗi tác vụ cần khóa chống xử lý trùng, giới hạn thử lại và chính sách rõ khi đã thử hết số lần.
- Mở rộng theo thời gian chờ của tác vụ cũ nhất, nhưng không vượt giới hạn của cơ sở dữ liệu và dịch vụ bên ngoài.
Mã minh họa: Xử lý tác vụ an toàn khi broker giao trùng
job = broker.receive(visibilityTimeout = 60s)
if inbox.exists(job.id): ACK
with dependencyLimiter.acquire(job.kind):
result = handle(job.payload)
transaction(inbox.insert(job.id), save(result))
ACKThời gian giữ quyền xử lý phải dài hơn thời gian chạy thông thường; tác vụ dài cần gửi tín hiệu duy trì để gia hạn.
Rủi ro cần tính trước
- Quyền xử lý hết hạn khi worker vẫn đang chạy, khiến cùng một tác vụ được thực thi đồng thời hai lần.
- Bão thử lại xuất hiện khi dịch vụ phụ thuộc mới chỉ phục hồi một phần.
- Hàng đợi lỗi tăng âm thầm và biến thành mất dữ liệu nếu không có cảnh báo cùng người phụ trách.
Nên theo dõi gì?
| Tín hiệu | Điều tín hiệu cho biết |
|---|---|
| Thời gian chờ của tác vụ cũ nhất theo nhóm | Đo trực tiếp khả năng đáp ứng mục tiêu độ trễ. |
| Số lần thử và nguyên nhân lỗi | Cho biết thử lại đang giúp phục hồi hay chỉ nhân một lỗi vĩnh viễn. |
| Số tác vụ đang xử lý theo khách hàng | Phát hiện một khách hàng đang chiếm phần lớn năng lực dùng chung. |
Đưa vào production từng bước
Đo thời gian chờ và nguyên nhân thử lại trước khi thay đổi số worker. Tách một loại tác vụ rủi ro sang nhóm riêng, áp dụng giới hạn ở chế độ quan sát, rồi mới bật bắt buộc cho một nhóm khách hàng nhỏ và diễn tập phát lại từ hàng đợi lỗi.
Điều cần nhớ
Hàng đợi trong production là một cơ chế kiểm soát năng lực, không phải vùng đệm vô hạn để nhận mọi công việc.
