Amazon Simple Queue Service(Amazon SQS) FIFO(First in, First out, 선입 선출) 이벤트 소스의 메시지 그룹 ID 또는 최대 동시성 값보다 높은 동시성 문제를 해결하고 싶습니다.
간략한 설명
Amazon SQS FIFO 이벤트 소스와 함께 Lambda를 사용하는 경우 동시성은 대기열에 있는 MessageGroupIds의 수와 같거나 작습니다.
다음과 같은 이유로 인해 함수의 동시성이 대기열에 있는 고유한 활성 MessageGroupIds의 수보다 많을 수 있습니다.
- 여러 이벤트 소스가 동일한 함수를 사용하고 있습니다.
- 보존 기간이 함수의 런타임보다 짧습니다.
- Lambda 동시성 지표가 MessageGroupIds의 수보다 많습니다.
- Lambda 확장을 사용합니다.
해결 방법
여러 이벤트 소스가 동일한 함수 사용
함수에 이벤트 소스가 하나만 있는지 확인하십시오. 함수에 이벤트 소스가 여러 개 있는 경우 다른 이벤트 소스가 해당 함수를 사용하고 있어 동시성이 높아질 수 있습니다.
보존 기간이 함수 런타임보다 짧음
대기열에 구성된 보존 기간이 함수의 런타임보다 짧으면 대기열의 보존 기간을 늘리십시오.
또한 Lambda는 동일한 MessageGroupId의 메시지를 추적하지 않고 메시지가 사용 가능한 즉시 폴링하기 때문에 동시성이 증가합니다.Lambda 함수 작업 중에 메시지가 만료되지 않도록 하려면 SQS FIFO 대기열 보존 기간을 늘리십시오. 메시지는 MessageGroupId에 대해 FIFO 순서로 처리됩니다.
Lambda 동시성 지표가 MessageGroupIds의 수보다 많음
지표가 생성되는 방식 때문에 Lambda 동시성 지표가 MessageGroupIds의 수보다 많을 수 있습니다. 더 많은 메시지가 동시에 간접 호출되지 않습니다. 대신 Lambda는 간접 호출된 모든 메시지에 대해 동시성 카운터를 1씩 늘린 다음 반환된 응답으로 간접 호출이 완료되면 동시성 카운터를 줄입니다.
이벤트 소스 매핑의 경우 동시성은 병렬로 실행되는 Lambda 핸들러 작업의 수입니다. Lambda 백엔드의 경우 핸들러 코드 작업을 완료하고 현재 사후 처리 단계에 있는 함수는 전체 동시성에 포함됩니다.
또한 Lambda는 예약된 동시성을 이벤트 소스 매핑과 유사하게 취급합니다. 예약된 동시성을 설정하지 않는 것이 좋습니다. 예약된 동시성을 설정해야 하는 경우 MessageGroupIds의 수보다 약간 높은 값으로 설정하십시오.
참고: 새 메시지는 이전 메시지가 완료된 후에만 간접 호출됩니다. 메시지는 항상 순서대로 처리됩니다.
Lambda 확장으로 인해 높은 동시성 발생
Lambda 작업이 완료된 후에도 확장이 계속 실행되기 때문에 Lambda 확장을 사용할 때 높은 동시성이 발생할 수 있습니다. 예를 들어 확장 프로그램이 연결되어 있고 /next를 직접 호출하지 않았지만 런타임에서는 /next를 직접 호출했습니다.
Lambda 확장이 높은 동시성을 유발하는지 검사하려면 다음 작업을 수행하십시오.
- PostRuntimeExtensionsDuration 성능 지표를 모니터링하여 런타임 Next API와 마지막 확장 Next API 간의 누적 시간을 확인합니다.
- Lambda 함수가 완료된 후에도 Lambda 확장이 계속 실행되고 있는지 검사하고 환경을 유지합니다.
- Lambda 인스턴스가 함수 동시성을 초과하는지 검사합니다. 두 인스턴스가 동시에 같은 환경에 있는 경우 스로틀링이 발생합니다. 자세한 내용은 Lambda 확장 API를 사용하여 확장 생성을 참조하십시오.
- ConcurrentExecutions 지표를 PostRuntimeExtensionsDuration 지표와 비교합니다. 최대 ConcurrentExecutions가 Amazon SQS 이벤트 소스의 할당량보다 많은지 검사합니다. 자세한 내용은 동시성 모니터링을 참조하십시오.
관련 정보
Amazon SQS를 통한 Lambda 사용