

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon SQS 메시지 중복 제거 및 그룹화
<a name="best-practices-message-deduplication"></a>

이 주제에서는 Amazon SQS에서 일관된 메시지 처리를 보장하는 모범 사례를 제공합니다. 다음 기능의 사용 방법을 설명합니다.
+ FIFO 대기열에서 중복 메시지를 방지하는 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html#API_SendMessage_RequestSyntax](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html#API_SendMessage_RequestSyntax)
+ 고유한 메시지 그룹 내에서 메시지 순서를 관리하는 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)

****주제****
+ [Amazon SQS에서 일관되지 않은 메시지 처리 방지](avoiding-inconsistent-message-processing.md)
+ [메시지 중복 제거 ID 사용](using-messagededuplicationid-property.md)
+ [메시지 그룹 ID 사용](using-messagegroupid-property.md)
+ [수신 요청 시도 ID 사용](using-receiverequestattemptid-request-parameter.md)

# Amazon SQS에서 일관되지 않은 메시지 처리 방지
<a name="avoiding-inconsistent-message-processing"></a>

Amazon SQS는 분산 시스템이므로 메시지가 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) API 메서드 직접 호출에서 성공적으로 반환되고 Amazon SQS에서 전달된 것으로 표시되더라도 소비자가 해당 메시지를 받지 못할 수 있습니다. 이 경우 Amazon SQS는 소비자가 수신한 적이 없는 메시지를 한 번 이상 배달된 것으로 기록합니다. 이 상태에서는 메시지 배달이 추가로 시도되지 않으므로 [배달 못한 편지 대기열](sqs-dead-letter-queues.md)의 최대 수신 수를 1로 설정하지 않는 것이 좋습니다.

# Amazon SQS에서 메시지 중복 제거 ID 사용
<a name="using-messagededuplicationid-property"></a>

[https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)는 중복 메시지 전달을 방지하기 위해 Amazon SQS FIFO 대기열에서만 사용되는 토큰입니다. 이를 통해 5분 중복 제거 기간 내에 동일한 중복 제거 ID를 가진 메시지의 인스턴스 한 개만 처리되고 전달됩니다.

Amazon SQS가 특정 중복 제거 ID가 있는 메시지를 이미 수락한 경우 ID가 동일한 후속 메시지는 승인되지만 소비자에게는 전달되지 않습니다.

**참고**  
Amazon SQS는 메시지가 수신되어 삭제된 후에도 중복 제거 ID를 계속 추적합니다.

**Topics**
+ [Amazon SQS에서 메시지 중복 제거 ID를 제공해야 하는 경우](providing-message-deduplication-id.md)
+ [Amazon SQS에서 단일 생산자/소비자 시스템에 대한 중복 제거 활성화](single-producer-single-consumer.md)
+ [Amazon SQS의 중단 복구 시나리오](designing-for-outage-recovery-scenarios.md)
+ [Amazon SQS에서 가시성 제한 시간 구성](working-with-visibility-timeouts.md)

# Amazon SQS에서 메시지 중복 제거 ID를 제공해야 하는 경우
<a name="providing-message-deduplication-id"></a>

생산자는 다음 시나리오에서 메시지 중복 제거 ID를 지정해야 합니다.
+ 고유하게 처리해야 하는 동일한 메시지 본문을 전송하는 경우
+ 콘텐츠는 동일하지만 메시지 속성은 다른 메시지를 전송할 때 각 메시지가 별도로 처리되도록 하는 경우
+ 콘텐츠가 다르지만(예: 메시지 본문의 재시도 카운터) Amazon SQS에 해당 메시지를 중복으로 인식하도록 요구하는 경우

# Amazon SQS에서 단일 생산자/소비자 시스템에 대한 중복 제거 활성화
<a name="single-producer-single-consumer"></a>

애플리케이션별 메시지 ID가 본문에 포함되어 있기 때문에 단일 생산자, 단일 소비자, 고유 메시지가 있으면 다음 모범 사례를 따르세요.
+ 대기열에서 콘텐츠 기반 중복 제거 기능을 활성화합니다(각 메시지에는 고유한 본문이 있음). 생성자는 메시지 중복 제거 ID를 생략할 수 있습니다.
+ Amazon SQS FIFO 대기열에 대해 콘텐츠 기반 중복 제거가 사용 설정되고 메시지가 중복 제거 ID와 함께 전송되면 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) 중복 제거 ID가 생성된 콘텐츠 기반 중복 제거 ID를 재정의합니다.
+ 소비자가 각 요청별 수신 요청 시도 ID를 제공하지 않아도 되지만, 이렇게 하면 실패-재시도 시퀀스가 빠르게 실행되기 때문에 이는 권장되는 모범 사례입니다.
+ 전송 또는 수신 요청은 FIFO 대기열에서 메시지 정렬을 방해하지 않기 때문에 이 요청을 다시 시도할 수 있습니다.

# Amazon SQS의 중단 복구 시나리오
<a name="designing-for-outage-recovery-scenarios"></a>

FIFO 대기열의 중복 제거 프로세스는 시간에 민감합니다. 애플리케이션을 설계할 때 생산자와 소비자 둘 다 중복이나 처리 실패 없이 클라이언트 또는 네트워크 중단으로부터 복구할 수 있도록 합니다.

생산자 고려 사항
+ Amazon SQS는 5분의 중복 제거 기간을 적용합니다.
+ 생산자가 5분 후에 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) 요청을 재시도하면 Amazon SQS는 요청을 새 메시지로 취급하여 잠재적으로 중복을 생성할 수 있습니다.

소비자 고려 사항
+ 소비자가 가시성 제한 시간이 만료되기 전에 메시지를 처리하지 못하면 다른 소비자가 메시지를 수신하고 처리하여 중복 처리로 이어질 수 있습니다.
+ 애플리케이션의 처리 시간에 따라 가시성 제한 시간을 조정합니다.
+ [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibility.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibility.html) API를 사용하여 메시지가 처리되는 동안 제한 시간을 연장합니다.
+ 메시지가 반복적으로 처리에 실패하는 경우 무기한 재처리되도록 허용하는 대신 [Dead Letter Queue(DLQ)](sqs-dead-letter-queues.md)로 라우팅합니다.
+ 생산자는 대기열의 중복 제거 간격을 알고 있어야 합니다. Amazon SQS의 중복 제거 간격은 5분입니다. 중복 제거 간격이 만료된 이후에 `SendMessage` 요청을 재시도하면 대기열에 중복 메시지가 생성될 수 있습니다. 예를 들어, 자동차 안의 모바일 디바이스에서 순서가 중요한 메시지를 전송할 수 있습니다. 승인을 받기 전에 일정 기간 동안 자동차의 셀룰러 연결이 끊길 경우, 셀룰러가 다시 연결되고 나서 요청을 다시 시도하면 중복이 생성될 수 있습니다.
+ 제한 시간 초과가 만료되기 전에 메시지를 처리하지 못할 위험을 최소화해 주는 제한 시간 초과를 소비자에게 적용해야 합니다. 메시지를 처리하는 동안 제한 시간 초과를 연장하려면 `ChangeMessageVisibility` 작업을 호출합니다. 그렇지만, 제한 시간 초과가 만료된 경우 다른 소비자가 메시지를 바로 처리할 수 있고, 이렇게 되면 한 메시지를 여러 번 처리하게 됩니다. 이 시나리오를 방지하려면 [배달 못한 편지 대기열](sqs-dead-letter-queues.md)을 구성합니다.

# Amazon SQS에서 가시성 제한 시간 구성
<a name="working-with-visibility-timeouts"></a>

안정적인 메시지 처리를 보장하려면 표시 제한 시간을 AWS SDK 읽기 제한 시간보다 길게 설정합니다. 이는 짧은 폴링 및 긴 폴링 둘 다와 함께 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) API를 사용하는 경우에 적용됩니다. 가시성 제한 시간이 길면 원래 요청이 완료되기 전에 다른 소비자가 메시지를 사용할 수 없어 중복 처리 위험이 줄어듭니다.

# Amazon SQS FIFO 대기열에서 메시지 그룹 ID 사용
<a name="using-messagegroupid-property"></a>

First-In-First-Out(FIFO) 대기열에서 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)는 메시지를 고유한 그룹으로 구성하는 속성입니다. 동일한 메시지 그룹 내의 메시지는 항상 한 번에 하나씩 엄격한 순서로 처리되므로 동일한 그룹의 두 메시지가 동시에 처리되지 않습니다. 표준 대기열에서 `MessageGroupId`를 사용하면 [공정 대기열](sqs-fair-queues.md)이 활성화됩니다. 엄격한 순서 지정이 필요한 경우 FIFO 대기열을 사용합니다.

**Topics**
+ [Amazon SQS에서 여러 개의 정렬된 메시지 그룹 인터리브](interleaving-multiple-ordered-message-groups.md)
+ [Amazon SQS의 다중 생산자/소비자 시스템에서 중복 처리 방지](avoding-processing-duplicates-in-multiple-producer-consumer-system.md)
+ [Amazon SQS에서 메시지 그룹 ID가 동일한 메시지의 대규모 백로그 방지](avoid-backlog-with-the-same-message-group-id.md)
+ [Amazon SQS의 가상 대기열에서 동일한 메시지 그룹 ID 재사용 방지](avoiding-reusing-message-group-id-with-virtual-queues.md)

# Amazon SQS에서 여러 개의 정렬된 메시지 그룹 인터리브
<a name="interleaving-multiple-ordered-message-groups"></a>

단일 FIFO 대기열 내에서 순서가 지정된 여러 메시지 그룹을 인터리브하려면 각 그룹(예: 서로 다른 사용자의 세션 데이터)에 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)를 할당합니다. 이렇게 하면 여러 소비자가 대기열에서 동시에 읽을 때 동일한 그룹 내의 메시지가 순서대로 처리되도록 할 수 있습니다.

특정 `MessageGroupId`가 포함된 메시지가 처리 중이고 보이지 않는 경우 가시성 제한 시간이 만료되거나 메시지가 삭제될 때까지 다른 소비자는 동일한 그룹의 메시지를 처리할 수 없습니다.

# Amazon SQS의 다중 생산자/소비자 시스템에서 중복 처리 방지
<a name="avoding-processing-duplicates-in-multiple-producer-consumer-system"></a>

메시지 순서 지정이 우선순위가 아닌 처리량이 높고 지연 시간이 짧은 시스템에서 생산자는 각 메시지에 고유한 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)를 할당할 수 있습니다. 이렇게 하면 다중 생산자/다중 소비자 설정에서도 Amazon SQS FIFO 대기열이 중복을 제거할 수 있습니다. 이 접근 방식은 중복 메시지를 방지하지만 각 메시지가 독립적인 그룹으로 취급되므로 메시지 순서가 보장되지 않습니다.

생산자와 소비자가 여럿인 시스템에서는 항상 중복으로 전달될 위험이 있습니다. 소비자가 가시성 제한 시간이 만료되기 전에 메시지를 처리하지 못하면 Amazon SQS는 메시지를 다시 사용할 수 있도록 하여 잠재적으로 다른 소비자가 메시지를 픽업할 수 있도록 합니다. 이를 완화하려면 처리 시간에 따라 메시지 승인 및 가시성 제한 시간 설정이 적절한지 확인합니다.

# Amazon SQS에서 메시지 그룹 ID가 동일한 메시지의 대규모 백로그 방지
<a name="avoid-backlog-with-the-same-message-group-id"></a>

FIFO 대기열은 최대 12만 개의 진행 중 메시지(소비자가 수신했지만 아직 삭제되지 않은 메시지)를 지원합니다. 이 한도에 도달하면 Amazon SQS는 오류를 반환하지 않지만 처리에 영향을 미칠 수 있습니다. [AWS Support](https://docs.aws.amazon.com/awssupport/latest/user/create-service-quota-increase.html)에 문의하여 한도 증가를 요청할 수 있습니다.

FIFO 대기열은 처음 12만 개의 메시지를 스캔하여 사용 가능한 메시지 그룹을 결정합니다. 대규모 백로그가 단일 메시지 그룹에 쌓이면 나중에 전송된 다른 그룹의 메시지는 백로그가 처리될 때까지 차단된 상태로 유지됩니다.

**참고**  
소비자가 반복적으로 메시지를 처리하지 못하면 메시지 백로그가 발생할 수 있습니다. 이는 메시지 콘텐츠 문제 또는 소비자 측 장애 때문일 수 있습니다. 메시지 처리 지연을 방지하려면 여러 번 실패한 후 처리되지 않은 메시지를 이동하도록 [Dead Letter Queue(DLQ)](sqs-dead-letter-queues.md)를 구성합니다. 이렇게 하면 동일한 메시지 그룹의 다른 메시지를 처리할 수 있으므로 시스템 병목 현상을 방지할 수 있습니다.

# Amazon SQS의 가상 대기열에서 동일한 메시지 그룹 ID 재사용 방지
<a name="avoiding-reusing-message-group-id-with-virtual-queues"></a>

공유 호스트 대기열과 함께 가상 대기열을 사용하는 경우 서로 다른 가상 대기열에서 동일한 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)를 재사용하지 마세요. 여러 가상 대기열이 동일한 호스트 대기열을 공유하고 동일한 `MessageGroupId`의 메시지를 포함하는 경우 해당 메시지가 서로를 차단하여 효율적인 처리를 방해할 수 있습니다. 원활한 메시지 처리를 위해 서로 다른 가상 대기열의 메시지에 고유한 `MessageGroupId` 값을 할당합니다.

# Amazon SQS 수신 요청 시도 ID 사용
<a name="using-receiverequestattemptid-request-parameter"></a>

수신 요청 시도 ID는 Amazon SQS에서 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) 직접 호출을 중복 제거하는 데 사용되는 고유한 토큰입니다. 네트워크 중단 또는 애플리케이션과 Amazon SQS 간의 연결 문제가 발생하는 경우 다음을 수행하는 것이 가장 좋습니다.
+ `ReceiveMessage` 직접 호출 시 수신 요청 시도 ID를 제공합니다.
+ 작업이 실패할 경우 동일한 수신 요청 시도 ID를 사용하여 재시도합니다.