1 DLQ(Dead-Letter Queue)
- Amazon SQS는 메시지 처리 실패 시 메시지를 저장하는 Dead-Letter Queue(DLQ)를 제공합니다.
- DLQ는 메시지를 격리하여 디버깅 및 재처리할 수 있는 유용한 도구입니다.
- DLQ를 사용하면 메시지 손실 없이 안정적으로 애플리케이션을 운영할 수 있습니다.
2 DLQ 설정 이유
- 네트워크 문제나 코드 오류 등으로 인해 메시지가 처리되지 않는 경우 발생할 수 있는 문제를 해결합니다.
- 실패한 메시지를 저장하여 나중에 다시 처리하거나 분석할 수 있습니다.
- 모든 메시지가 최종적으로 처리되도록 보장할 수 있습니다.
3 DLQ 설정 방법
3.1 DLQ 큐 생성
- AWS Management Console에 로그인합니다.
- Amazon SQS 콘솔로 이동합니다.
- "Create queue" 버튼을 클릭하여 새 큐를 생성합니다.
- 큐 이름을 입력하고 필요한 설정을 완료한 후 "Create Queue"를 클릭합니다.
3.2 DLQ로 설정
- 소스 큐를 선택하고 "Edit" 버튼을 클릭합니다.
- "Redrive policy" 섹션에서 "Configure dead-letter queue"를 클릭합니다.
- 생성한 큐를 DLQ로 선택합니다.
maxReceiveCount
값을 설정합니다. 이 값은 메시지가 소스 큐에서 최대 몇 번까지 수신될 수 있는지를 정의합니다.
- 설정을 저장합니다.
4 DLQ 정책
- Redrive policy: 메시지가 최대 몇 번까지 수신될 수 있는지를 정의합니다.
maxReceiveCount
는 메시지가 소스 큐에서 소비자에 의해 최대 몇 번 수신될 수 있는지를 설정합니다. 이 값이 낮을수록 한 번의 실패로도 메시지가 DLQ로 이동할 수 있습니다.
- Redrive allow policy: 어떤 소스 큐가 DLQ를 사용할 수 있는지를 지정합니다.
- 기본 설정은 모든 소스 큐가 DLQ를 사용할 수 있도록 허용합니다.
- 특정 소스 큐만 허용하려면
byQueue
옵션을 사용하고 최대 10개의 소스 큐 ARN을 지정할 수 있습니다.
denyAll
을 선택하면 해당 큐는 DLQ로 사용되지 않습니다.
5 메시지 보존 기간
5.1 표준 큐
- 메시지의 유효 기간은 원래 큐에 들어간 시점을 기준으로 합니다.
- DLQ로 이동해도
enqueue timestamp
는 변경되지 않습니다.
ApproximateAgeOfOldestMessage
메트릭은 메시지가 DLQ로 이동한 시점을 나타냅니다.
- 예를 들어, 메시지가 원래 큐에서 1일을 보낸 후 DLQ로 이동하고, DLQ의 보존 기간이 4일인 경우 메시지는 DLQ에서 3일 후에 삭제됩니다.
- 최적의 성능을 위해 원래 큐의 보존 기간보다 DLQ의 보존 기간을 더 길게 설정하는 것이 좋습니다.
5.2 FIFO 큐
- 메시지가 DLQ로 이동하면
enqueue timestamp
가 초기화됩니다.
ApproximateAgeOfOldestMessage
메트릭은 메시지가 DLQ로 이동한 시점을 나타냅니다.
- 예를 들어, 메시지가 원래 큐에서 1일을 보낸 후 DLQ로 이동하고, DLQ의 보존 기간이 4일인 경우 메시지는 DLQ에서 4일 후에 삭제됩니다.
6 DLQ 모니터링 및 관리
- Amazon CloudWatch를 사용하여 DLQ에서 처리되지 않은 메시지를 모니터링할 수 있습니다.
- CloudWatch 알람을 설정하여 DLQ의 메시지 수가 일정 수치를 초과할 경우 알림을 받을 수 있습니다.
- DLQ에서 메시지를 주기적으로 확인하고 필요한 경우 수동으로 재처리할 수 있습니다.
7 DLQ를 소스 큐로 리드라이브(Redrive)하기
- 수동 검사 및 디버깅 후, 코드가 수정된 후에는 DLQ의 메시지를 소스 큐로 리드라이브할 수 있습니다.
- 이를 통해 커스텀 코드를 작성하지 않고도 배치로 메시지를 재전송할 수 있습니다.