Poison / DLQ + unblock: lane chính sống lại. Nếu không ai đọc DLQ = xóa có thêm bước (và lương tâm giả).
Bài này: vòng đời sau khi message nằm trong dead-letter.
DLQ để làm gì
- Unblock consumer / partition.
- Giữ bằng chứng để sửa (payload, error, metadata).
- Redrive sau khi code/data đúng — có kiểm soát.
Thiếu (2)(3): bạn chỉ đạt (1) — business gap vẫn đó (missing trên read).
Pipeline triage
1. Alert DLQ depth > 0 hoặc rate tăng (không chờ đầy đĩa)
2. Classify bug code | schema | data xấu | dependency | poison cố ý
3. Fix deploy / sửa payload / đổi mapping
4. Redrive bound concurrency + idempotent + ngoài peak nếu nặng
5. Drop chỉ khi ignore hợp lệ + document + metric
6. Postmortem nếu systemic (không chỉ “xóa queue”)
Phân loại nhanh
- Code bug: fix + redrive cả lô cùng lỗi.
- Schema / version: migrate consumer; không redrive trước khi deploy.
- Data một bản ghi: sửa tay hoặc drop có ticket.
- Dependency tạm: đôi khi redrive sau khi dependency khỏe — cẩn thundering.
Redrive cẩn
- Bound in-flight — inventory, backpressure.
- Handler idempotent — EOS thực dụng.
- Purpose: write/read/shared — đừng nhét lại shared topic nếu chỉ một group cần.
- Order: redrive có thể xáo; projection cần strategy.
- Metric success/fail sau redrive; age trong DLQ.
Anti-pattern
DLQ không alert
Cron “xóa DLQ mỗi đêm”
Redrive all lúc Black Friday traffic
Redrive không idempotent “cho xong ticket”
Ignore hàng loạt để lag xanh
Một câu để nhớ
DLQ là phòng chờ có chủ — không phải thùng rác.
Unblock xong phải có người (hoặc bot) triage.