기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon SQS 제한 시간 초과
소비자가 대기열에서 메시지를 수신하고 처리하면 메시지는 계속 대기열에 있습니다. Amazon SQS는 메시지를 자동으로 삭제하지 않습니다. Amazon SQS는 분산 시스템이므로 소비자가 메시지를 실제로 받는지 보장할 수 없습니다(예를 들어, 연결 문제 또는 소비자 애플리케이션 문제로 인해). 또한, 소비자는 메시지를 수신하고 처리한 후 대기열에서 이 메시지를 삭제해야 합니다.
![가시성 제한 시간 동안 요청이 처리되는 방식을 보여주는 타임라인 그래프](images/sqs-visibility-timeout-diagram.png)
메시지를 수신한 직후에는 메시지가 대기열에 그대로 있습니다. 다른 소비자가 메시지를 다시 처리하는 것을 방지하기 위해, Amazon SQS에서 모든 소비자가 메시지를 수신하고 처리할 수 없도록 차단하는 기간인 제한 시간 초과를 설정합니다. 메시지의 제한 시간 초과는 30초입니다. 최소 시간은 0초입니다. 최대 시간은 12시간입니다. 콘솔을 사용하여 대기열의 제한 시간 초과를 구성하는 방법에 대한 자세한 내용은 Amazon SQS 콘솔을 사용하여 대기열 파라미터 구성 섹션을 참조하세요.
참고
표준 대기열에서 제한 시간 초과는 메시지가 두 번 수신되지 않도록 보장하지 않습니다. 자세한 정보는 아마존 SQS at-least-once 배송을 참조하세요.
FIFO 대기열에서는 다음과 같이 생산자 또는 소비자가 여러 번 재시도할 수 있도록 허용합니다.
-
생성자가 실패한
SendMessage
작업을 감지한 경우, 동일한 메시지 중복 제거 ID를 사용하여 필요한 횟수 만큼 여러 번 재전송을 시도할 수 있습니다. 생성자가 중복 제거 간격이 만료되기 전에 최소 한 개의 승인을 수신한다고 가정하면 여러 번 재시도를 해도 메시지의 순서에 영향을 미치지도 복제를 도입하지도 않습니다. -
소비자가 실패한
ReceiveMessage
작업을 감지한 경우, 동일한 수신 요청 시도 ID를 사용하여 필요한 횟수 만큼 여러 번 재시도할 수 있습니다. 소비자가 제한 시간 초과가 만료되기 전에 최소 한 개의 승인을 수신한다고 가정하면 여러 번 재시도를 해도 메시지의 순서에는 영향을 미치지 않습니다. -
메시지 그룹 ID가 있는 메시지를 수신한 경우, 동일한 메시지 그룹 ID에 대한 메시지는 그 메시지를 삭제하거나 메시지가 표시되는 경우가 아니라면 더 이상 반환되지 않습니다.
처리 중인 메시지
Amazon SQS 메시지에는 세 가지 기본 상태가 있습니다.
-
생산자가 대기열로 전송.
-
소비자가 대기열에서 수신.
-
대기열에서 삭제.
메시지는 생산자가 대기열로 전송했지만 소비자가 대기열에서 아직 수신하지 않은 후에(즉, 상태 1과 2 사이) 저장된 것으로 간주됩니다. 저장된 메시지 수에는 할당량이 없습니다. 메시지는 소비자가 대기열에서 수신했지만 아직 대기열에서 삭제되지 않은 경우(즉, 상태 2와 3 사이) 처리 중인 것으로 간주됩니다. 처리 중인 메시지 수에는 할당량이 있습니다.
중요
처리 중인 메시지에 적용되는 할당량은 저장된 메시지 수의 무제한과 관련이 없습니다.
대부분의 표준 대기열(대기열 트래픽 및 메시지 백로그에 따라 다름)의 경우 최대 약 120,000개의 이동 중 메시지(소비자가 대기열에서 수신했지만 대기열에서 아직 삭제되지 않은 메시지)가 있을 수 있습니다. 짧은 폴링을 사용하는 동안 이 할당량에 도달하면 Amazon SQS에서 OverLimit
오류 메시지를 반환합니다. 긴 폴링을 사용하는 경우에는 Amazon SQS에서 오류 메시지를 반환하지 않습니다. 이 할당량에 도달하지 않도록 하려면 메시지를 처리한 후 대기열에서 삭제해야 합니다. 또한 메시지를 처리하는 데 사용하는 대기열의 수를 늘릴 수 있습니다. 할당량 증가를 요청하려면 지원 요청을 제출
FIFO 대기열의 경우 최대 20,000개의 이동 중인 메시지(소비자가 대기열에서 수신했지만 대기열에서 아직 삭제되지 않은 메시지)가 있을 수 있습니다. 이 할당량에 도달해도 Amazon SQS에서는 오류 메시지를 반환하지 않습니다.
중요
FIFO 대기열로 작업할 때 제한 시간 초과 기간 외에 요청이 수신되면 DeleteMessage
작업이 실패합니다. 제한 시간 초과가 0초인 경우 메시지는 전송된 밀리초 이내에 삭제되어야 하며, 그렇지 않으면 중단된 것으로 간주됩니다. 이로 인해 MaxNumberOfMessages
파라미터가 1보다 큰 경우 Amazon SQS가 ReceiveMessage
작업에 대한 동일한 응답에 중복 메시지를 포함할 수 있습니다. 자세한 내용은 Amazon SQS FIFO API 작동 방식
제한 시간 초과 설정
제한 시간 초과는 Amazon SQS가 메시지를 반환할 때 시작됩니다. 이 시간 동안 소비자는 메시지를 처리하고 삭제합니다. 하지만 소비자가 메시지를 삭제하기 전에 실패할 경우 제한 시간 초과가 만료되기 전에 시스템에서 해당 메시지에 대한 DeleteMessage
작업을 호출하지 않으면 다른 소비자가 메시지를 볼 수 있게 되고 메시지가 다시 수신됩니다. 메시지가 한 번만 수신되어야 하는 경우 소비자는 제한 시간 초과 기간 내에 메시지를 삭제해야 합니다.
모든 Amazon SQS 대기열에는 30초의 기본 제한 시간 초과 설정이 있습니다. 전체 대기열에 대해 이 설정을 변경할 수 있습니다. 일반적으로 애플리케이션에서 대기열의 메시지를 처리하고 삭제하는 데 소요되는 최대 시간으로 제한 시간 초과를 설정해야 합니다. 메시지를 수신할 때 전체 대기열 제한 시간을 변경하지 않고도 반환된 메시지에 대해 특별한 제한 시간 초과를 설정할 수도 있습니다. 자세한 내용은 Amazon SQS에서 메시지를 적시에 처리 단원의 모범 사례를 참조하십시오.
메시지를 처리하는 데 걸리는 시간을 모르는 경우 소비자 프로세스에 대한 하트비트를 생성합니다. 초기 표시 제한 시간(예: 2분)을 지정한 다음 소비자가 메시지에서 계속 작업하는 경우 표시 제한 시간을 1분마다 2분씩 연장합니다.
중요
최대 표시 제한 시간은 Amazon SQS가 ReceiveMessage
요청을 수신한 시간으로부터 12시간입니다. 표시 제한 시간을 연장해도 최대 12시간이 재설정되지는 않습니다.
또한 ReceiveMessage
요청으로 타이머가 시작되기 때문에 개별 메시지의 제한 시간을 전체 12시간(예: 43,200초)으로 설정하지 못할 수도 있습니다. 예를 들어 메시지를 수신한 후 VisibilityTimeout
이 43,200초인 ChangeMessageVisibility
호출을 전송하여 즉시 최대 12시간을 설정하면 실패할 가능성이 높습니다. 하지만 43,195초 값을 사용하면 ReceiveMessage
를 통해 메시지를 요청하는 것과 표시 제한 시간을 업데이트하는 것 사이에 상당한 지연이 있는 경우가 아니면 작동합니다. 소비자가 12시간 이상 필요한 경우 Step Functions 사용을 고려하세요.
메시지에 대한 제한 시간 초과 변경
대기열에서 메시지를 수신하여 처리하기 시작하다 보면 이 대기열의 표시 제한 시간이 부족해질 수 있습니다(처리한 메시지를 삭제해야 하는 경우도 있음). 메시지의 제한 시간을 단축하거나 늘리기 위해 ChangeMessageVisibility
작업을 사용하여 새 제한 시간 값을 지정할 수 있습니다.
예를 들어 대기열의 시간 제한이 60초이고 메시지를 받은 뒤로 15초가 흘렀는데 VisibilityTimeout
을 10초로 설정하여 ChangeMessageVisibility
호출을 보내면, ChangeMessageVisibility
호출 시점으로부터 10초를 세기 시작합니다. 따라서 표시 제한 시간(총 25초)을 처음 변경하고 10초가 지난 뒤에 이를 변경하려 하거나 메시지를 삭제하려고 하면 오류가 발생합니다.
참고
새로운 제한 시간은 ChangeMessageVisibility
작업을 호출한 시간부터 적용됩니다. 또한, 새 제한 시간은 특정 메시지 수신에만 적용됩니다. ChangeMessageVisibility
는 메시지 수신이나 이후 대기열의 제한 시간에 영향을 미치지 않습니다.
메시지에 대한 제한 시간 초과 종료
대기열에서 메시지를 수신할 때 실제로 해당 메시지를 처리 및 삭제하지 않아도 됨을 알 수 있습니다. Amazon SQS를 통해 특정 메시지의 제한 시간 초과를 종료할 수 있습니다. 그리고 나면 메시지가 시스템의 다른 구성 요소에 즉시 표시되어 처리할 수 있습니다.
ReceiveMessage
를 호출한 후 메시지의 제한 시간 초과를 종료하려면 VisibilityTimeout
을 0초로 설정하여 ChangeMessageVisibility
를 호출하세요.