Bỏ qua tới nội dung
Tôi là MQ
Quay lại

Kafka 4.4: share group cuối cùng cũng có dead-letter queue

Read in English

Kafka có share group (Kafka Queues) từ 4.2, nhưng có một chỗ làm tôi chưa dám dùng: message lỗi đi đâu? Một record bị consumer reject, hoặc retry quá số lần cho phép, sẽ chuyển sang trạng thái Archived. Nói gọn là biến mất. Kafka 4.4, ra ngày 22/10, lấp chỗ này bằng KIP-1191.

DLQ giờ nằm ở broker

Với consumer group thường, tôi quen làm DLQ ở phía client: Spring Kafka có DeadLetterPublishingRecoverer, bắt exception rồi tự publish sang topic .DLT. Mỗi service tự cấu hình, mỗi team một kiểu đặt tên.

Với share group, broker biết mỗi record đã được giao bao nhiêu lần (share.delivery.count.limit, mặc định 5). Nên KIP-1191 để broker tự ghi record ra DLQ khi nó bị reject hoặc vượt giới hạn delivery. Cần bật ở ba tầng:

# 1. Topic đích phải cho phép làm DLQ
kafka-configs.sh --bootstrap-server localhost:9092 --alter \
  --entity-type topics --entity-name dlq.orders \
  --add-config errors.deadletterqueue.group.enable=true

# 2. Group trỏ tới DLQ, có copy cả record gốc hay không
kafka-configs.sh --bootstrap-server localhost:9092 --alter \
  --entity-type groups --entity-name order-workers \
  --add-config errors.deadletterqueue.topic.name=dlq.orders,errors.deadletterqueue.copy.record.enable=true

# 3. Cluster phải chạy share.version=2
kafka-features.sh --bootstrap-server localhost:9092 upgrade --feature share.version=2

Vài chi tiết dễ vấp. Tên DLQ topic mặc định phải bắt đầu bằng dlq. (đổi qua errors.deadletterqueue.topic.name.prefix). Auto-create DLQ topic mặc định tắt. Và copy.record.enable mặc định là false: DLQ chỉ chứa header ngữ cảnh như __dlq.errors.topic, __dlq.errors.offset, __dlq.errors.delivery.count, __dlq.errors.message, không có payload. Muốn replay thì phải bật lên.

Đọc kỹ đoạn “không atomic”

KIP ghi rõ: việc ghi DLQ không atomic với cập nhật state của share group, nên trong vài trường hợp hiếm “có thể có nhiều hơn một DLQ record” cho cùng một record gốc. Lỗi ghi DLQ không retriable thì broker log error rồi vẫn archive record.

Tôi từng nghĩ DLQ là chỗ “chắc chắn có, đúng một bản”. Hóa ra không. Consumer đọc DLQ để replay phải idempotent, dedupe theo topic + partition + offset từ header.

Vì sao tôi quan tâm

Phần lớn sự cố message tôi từng gặp không nằm ở chỗ hệ thống chậm. Chúng là một poison message bị nuốt im lặng, rồi vài ngày sau mới có người hỏi “đơn này đâu?”. DLQ ở phía broker nghĩa là service mới không thể quên cấu hình nó. Đổi lại, nó trở thành việc của người vận hành cluster, nên cần thống nhất quy ước đặt tên ngay từ đầu.

Nếu bạn đang thử share group, chạy kafka-features.sh describe trước. Chưa thấy share.version ở mức 2 thì DLQ chưa hoạt động, dù bạn đã đặt config cho group.

Nguồn: Apache Kafka 4.4.0 Release Announcement, KIP-1191: Dead-letter queues for share groups, Kafka 4.4 Group Configs


Chia sẻ bài viết:

Bài sau
Khi agent viết code nhanh hơn git chịu nổi