Amazon Simple Queue Service(Amazon SQS) 선입선출(FIFO) 대기열에서 ReceiveMessage API를 호출해도 일부 메시지가 반환되지 않습니다.
해결 방법
FIFO 대기열 사용 시 특정 메시지 그룹 ID로부터 메시지를 수신하도록 요청할 수 없습니다. 또한 ReceiveMessage API 호출을 필터링하여 한 번에 하나의 메시지 그룹 내에 있는 메시지만 반환하도록 할 수 없습니다.
ReceiveMessage API 호출에서 MaxNumberOfMessages 파라미터를 지정하면 SQS는 동일한 메시지 그룹 ID를 가진 메시지를 가능한 한 많이 반환합니다. ReceiveMessage API 호출은 사용 가능한 다른 메시지 그룹으로부터 메시지를 반환할 수도 있습니다.
FIFO 대기열의 경우, 특정 메시지 그룹 ID에 속하는 메시지를 받으면 다음 지침을 참고하세요.
- 동일한 메시지 그룹 ID 내에서 더 많은 메시지를 수신하려면 먼저 현재 메시지 그룹 ID에서 메시지를 삭제해야 합니다.
- 수신되었지만 아직 삭제되지 않은 메시지는 전송 중 상태입니다. 전송 중 메시지는 동일한 메시지 그룹 내에서 사용 가능한 메시지 전송을 차단합니다.
- 메시지가 전송 중 상태인 일반적인 이유는 소비자 클라이언트가 예기치 않게 실패하기 때문입니다. 또 다른 이유는 다운스트림 AWS Lambda 소비자 함수에서 예외가 발생하거나 최대 동시성에 도달한 경우입니다.
- ChangeMessageVisibility API는 전송 중 메시지의 가시성 제한 시간을 연장하거나 단축할 수 있습니다.
- 메시지 가시성 제한 시간이 만료될 때까지 기다려 메시지를 재전송할 수 있습니다.
모든 FIFO 대기열과 Amazon SQS 할당량 한도에 대해서는 다음 지침을 참고하세요.
- FIFO 대기열에는 최대 20,000개의 전송 중 메시지가 있습니다.
참고 Amazon SQS는 할당량 한도를 초과하는 오류 메시지를 반환하지 않습니다.
- FIFO 대기열은 높은 처리량을 활성화하지 않고도 초당 최대 300개의 트랜잭션(TPS)을 처리할 수 있습니다. 300TPS를 초과하는 요청은 대기열에 있는 메시지를 사용할 수 있는 경우에도 ‘ThrottlingException’ 오류가 발생합니다.
- SQS FIFO 대기열 메시지는 파티션에 저장됩니다. 각 파티션은 전송, 수신 및 삭제 작업에 대해 최대 300TPS를 지원합니다. 자세한 내용은 파티션 사용률 최적화를 참조하세요.
- 처리량이 높은 FIFO 대기열은 하나의 파티션을 여러 메시지 그룹과 공유할 수 있습니다. 메시지 그룹이 해당 파티션의 300TPS를 초과하는 경우 제한으로 인해 해당 파티션에 있는 다른 그룹의 메시지가 전달되지 않습니다.
- 초당 FIFO 대기열의 높은 처리량 트랜잭션은 AWS 리전에 따라 다릅니다. 자세한 내용은 메시지 관련 할당량을 참조하세요.
FIFO 대기열의 Amazon SQS 처리량 제한을 줄이려면 다음 지침을 참고하세요.
FIFO 대기열은 처음 20,000개의 메시지를 검토하여 사용 가능한 메시지 그룹을 결정합니다. 전송 중 메시지로 인해 처음 20,000개 메시지의 메시지 그룹이 차단된 경우, 처음 20,000개 이상의 다른 그룹에서 보낸 메시지는 반환되지 않습니다. 자세한 내용은 ](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html#avoiding-having-a-large-backlog-of-messages-with-the-same-message-group-id)동일한 그룹 ID를 가진 대규모 메시지 백로그 방지[를 참조하세요.
예시 A
FIFO 대기열에는 총 20,001개의 메시지가 있습니다. 처음 20,000개의 메시지는 메시지 그룹 1에 속하고, 마지막 메시지는 메시지 그룹 2에 속합니다. 대기열에서 메시지를 수신하려고 하면 그룹 1에서만 메시지를 받게 됩니다. 연속으로 ReceiveMessage API 호출을 하면 빈 수신이 됩니다. 이는 FIFO가 그룹 1에 속하는 메시지만 검토하여 해당 그룹이 현재 호출에 의해 차단되기 때문에 발생합니다.
예시 B
FIFO 대기열에는 총 20,000개의 메시지가 있습니다. 처음 19,999개의 메시지는 메시지 그룹 1에 속하고, 마지막 메시지는 메시지 그룹 2에 속합니다. 대기열에서 메시지를 수신하려고 하면 첫 번째 ReceiveMessage 호출은 그룹 1에 속한 메시지를 받습니다. 두 번째 ReceiveMessage 호출은 그룹 2에 속한 메시지를 받습니다. 두 그룹 모두 현재 호출에 의해 차단되므로 추가적인 ReceiveMessage 호출은 빈 수신이 됩니다.
관련 정보
Amazon SQS FIFO(선입선출) 대기열
Amazon SQS 메시지 그룹 ID 사용