Skip to main content

NATS Dead Letter Queue


Max Deleveries

Consumer의 Max Deleveries에 정의된 횟수많큼 메시지를 받은 후에도 처리가 되지 않은 메시지는 $JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.<streamName>.<consumerName> subject로 아래와 같은 메시지가 전달됩니다.

{
"type": "io.nats.jetstream.advisory.v1.max_deliver",
"id": "hqEOPR3rYFuICTKm1eo2Tm",
"timestamp": "2023-01-02T03:04:05Z",
"stream": "<streamName>",
"consumer": "<consumerName>",
"stream_seq": <streamSeq>,
"deliveries": <maxDeliveries>
}

아래 명령어를 통해 여러번 전달된 메시지가 무엇인지 확인할 수 있습니다.

nats stream get <streamName> <streamSeq>

Dead Letter Queue Stream

이벤트 메시지를 받았을 때 에러처리가 가능한 경우 Max Deleveries 조건에 걸리기 전에 에러 이벤트로 변경하여 처리한 것으로 간주하고 에러는 개발자가 확인하여 처리하도록 할 수 있습니다.

에러 처리된 이벤트는 dead-letter라는 subject로 전달하고, dead-letter$JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.>를 구독하는 Stream을 생성하여 해당 스트림에 이벤트가 전달되면 Slack이나 이메일 등으로 알림을 전달하도록 하면 장애처리를 효과적으로 할 수 있습니다.

장애 처리 방식에 따라 dead-letter의 이벤트 스키마도 Max Deleveries 이벤트와 동일하게 개발하는 것이 편할 수 있습니다.

dead-letter.yaml
apiVersion: jetstream.nats.io/v1beta2
kind: Stream
metadata:
name: dead-letter
namespace: event
spec:
name: dead-letter
subjects:
- dead-letter
- $JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.>
storage: file
retention: limits
discard: old
replicas: 3
# data:
# type:
# type: string
# id: string
# timestamp: string
# stream: string
# consumer: string
# stream_seq: number
# deliveries: number
# example:
# type: io.nats.jetstream.advisory.v1.max_deliver
# id: hqEOPR3rYFuICTKm1eo2Tm
# timestamp: 2023-01-02T03:04:05Z
# stream: test
# consumer: test
# stream_seq: 1
# deliveries: 3