본문으로 건너뛰기

Dead-Letter-Queue

1 DLQ(Dead-Letter Queue)

  • Amazon SQS는 메시지 처리 실패 시 메시지를 저장하는 Dead-Letter Queue(DLQ)를 제공합니다.
  • DLQ는 메시지를 격리하여 디버깅 및 재처리할 수 있는 유용한 도구입니다.
  • DLQ를 사용하면 메시지 손실 없이 안정적으로 애플리케이션을 운영할 수 있습니다.

2 DLQ 설정 이유

  • 네트워크 문제나 코드 오류 등으로 인해 메시지가 처리되지 않는 경우 발생할 수 있는 문제를 해결합니다.
  • 실패한 메시지를 저장하여 나중에 다시 처리하거나 분석할 수 있습니다.
  • 모든 메시지가 최종적으로 처리되도록 보장할 수 있습니다.

3 DLQ 설정 방법

3.1 DLQ 큐 생성

  1. AWS Management Console에 로그인합니다.
  2. Amazon SQS 콘솔로 이동합니다.
  3. "Create queue" 버튼을 클릭하여 새 큐를 생성합니다.
  4. 큐 이름을 입력하고 필요한 설정을 완료한 후 "Create Queue"를 클릭합니다.

3.2 DLQ로 설정

  1. 소스 큐를 선택하고 "Edit" 버튼을 클릭합니다.
  2. "Redrive policy" 섹션에서 "Configure dead-letter queue"를 클릭합니다.
  3. 생성한 큐를 DLQ로 선택합니다.
  4. maxReceiveCount 값을 설정합니다. 이 값은 메시지가 소스 큐에서 최대 몇 번까지 수신될 수 있는지를 정의합니다.
  5. 설정을 저장합니다.

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의 메시지를 소스 큐로 리드라이브할 수 있습니다.
  • 이를 통해 커스텀 코드를 작성하지 않고도 배치로 메시지를 재전송할 수 있습니다.