Preview Bản nháp chờ review — title, nội dung, link có thể sửa trước khi bỏ nhãn.

Một message schema sai. Consumer retry 50 lần. Lag tăng. Mọi payment/mail/projection đứng sau trên cùng partition — không vì Kafka chết, vì lane bị một xác chặn.

Recovery playbook liệt kê strategy. Bài này đặt tên mục tiêu hay bị quên khi team “cố xử lý bằng được”: unblock — nhả hàng, để phần còn lại của business sống.

Demo (lane block vs DLQ nhả hàng): unblock · poison chặn vs nhả.

Block lane ≠ “đang xử lý cẩn thận”

Release/retry mãi một poison:

  • Head-of-line blocking trên partition/queue.
  • Lag tăng → read side stale hàng loạt.
  • Write side: action phía sau không chạy (mất continuity).
  • On-call chỉ thấy “consumer chậm”, không thấy “1 message độc”.

Unblock theo purpose

Cùng write / read / shared:

Write   — block consumer ≈ block một phần business
          → unblock thường gấp (delayed resend, error queue, DLQ)

Read    — block có thể giữ order, tránh wrong
          → skip/DLQ = rủi ro missing; stale đôi khi chấp nhận hơn corrupt
          → park + alert, backfill có quy trình

Shared  — resend shared log có thể double group khác
          → error channel / DLQ private; không “nhét lại topic” mù

Công cụ nhả hàng (nhanh)

Instant retry     — chỉ transient; không đủ với permanent
Delayed resend    — nhả chỗ, thử sau (write hay OK; stream cần lane phụ)
Error channel     — chuyển riêng, main đi tiếp
DLQ               — cất + alert; main đi tiếp (bắt buộc triage sau)
Ignore            — ack bỏ; unblock mạnh — correctness tùy purpose
Release/rewind    — giữ order; dễ kẹt nếu mãi fail

Poison / DLQ là unblock có địa chỉ. Không triage = thùng rác có thêm bước.

Khi correctness được ưu tiên hơn unblock

  • Ledger / số dư: wrong đắt hơn trễ vài phút.
  • Projection bắt buộc per-key order: release có chủ đích, không skip bừa.
  • Còn lại nhiều hệ nghiệp vụ: kẹt mãi đắt hơn một message vào DLQ + alert.

Nói to trade-off trong runbook — tránh tranh cãi lúc 2h sáng giữa “đừng mất event” và “cả hàng chết”.

Metric cho unblock

  • Lag / age of oldest message (không chỉ success rate).
  • Retry count per message; % hit max retry.
  • DLQ rate + age trong DLQ (cất rồi quên cũng là fail).
  • Time-to-unblock sau poison (SLO ops).

Đọc tiếp

Một câu để nhớ

Đôi khi mục tiêu đúng là nhả hàng, không phải “xử lý bằng được” message hỏng trên lane chính.
Unblock có tên — để trade-off được nói to.