Dead Letter Queue in Kafka
by Gunju Ko
Dead Letter Queue in Kafka
Dead Letter Queue
- 메시지를 어떠한 이유로 처리할 수 없는 경우엔 Dead Letter Queue(토픽)로 보낸다. 아래와 같은 이유로 메시지 처리가 실패할 수 있다
- 메시지를 deserialize할 수 없는 경우
- 데이터가 예상과 다른 경우 (예를 들어 값이 항상 양수인 필드에 음수가 들어간 경우)
Kafka Connect
Kafka Connect에서는 처리할 수 없는 메시지를 dead letter queue로 보내도록 설정할 수 있다. dead letter로 보내진 메시지는 무시되거나 수정 및 재처리 될 수 있다.

이미지 출처 : https://www.confluent.io/blog/kafka-connect-deep-dive-error-handling-dead-letter-queues/
dead letter queue을 사용하려면 아래 2가지 속성을 설정해주어야 한다.
- errors.tolerance = all
- errors.deadletterqueue.topic.name
더 자세한 설정은 confluent - Error Handling and Dead Letter Queue 를 참고하길 바란다.
Spring Kafka
- Spring Kafka에서는
SeekToCurrentErrorHandler를 통해서 메시지 처리를 재시도할 수 있다. 그리고 최대 실패수만큼 재시도가 실패한 경우에 Recorerer가 동작하도록 설정할 수 있다. Spring Kafka는DeadLetterPublishingRecoverer를 제공하는데 해당 Recoverer는 실패한 메시지를 다른 토픽으로 보낸다. - 실패한 메시지는
<originalTopic>.DLT로 보내진다. 그리고 실패한 메시지의 파티션과 같은 파티션으로 보내진다. 그러므로 기본 동작으로 설정한 경우엔 Dead Letter 토픽은 Original 토픽의 파티션보다 크거나 같아야한다. Dead Letter 토픽의 이름과 파티션을 직접 정하도록 설정하는것도 가능하다. - Dead Letter 토픽에 레코드를 보낼때 아래 헤더가 추가되어 보내진다.
- ` KafkaHeaders.DLT_EXCEPTION_FQCN`: The Exception class name.
KafkaHeaders.DLT_EXCEPTION_STACKTRACE: The Exception stack trace.KafkaHeaders.DLT_EXCEPTION_MESSAGE: The Exception message.KafkaHeaders.DLT_ORIGINAL_TOPIC: The original topic.KafkaHeaders.DLT_ORIGINAL_PARTITION: The original partition.KafkaHeaders.DLT_ORIGINAL_OFFSET: The original offset.KafkaHeaders.DLT_ORIGINAL_TIMESTAMP: The original timestamp.KafkaHeaders.DLT_ORIGINAL_TIMESTAMP_TYPE: The original timestamp type.