DynamoDB Streams의 Lambda IteratorAge 지표가 증가하는 이유는 무엇입니까?

4분 분량
0

AWS Lambda가 Amazon DynamoDB Streams의 레코드를 사용할 때 Lambda IteratorAge 지표가 급증하는 것을 확인할 수 있습니다.

간략한 설명

Lambda IteratorAge 지표는 레코드가 DynamoDB Streams에 추가되는 시점과 함수가 해당 레코드를 처리하는 시점 사이의 지연 시간을 측정합니다. IteratorAge의 증가는 Lambda가 DynamoDB Streams에 기록된 레코드를 효율적으로 처리하지 못한다는 것을 의미합니다.

다음과 같은 이유로 IteratorAge가 증가할 수 있습니다.

  • 호출 오류
  • 스로틀 발생
  • 낮은 Lambda 처리량

해결 방법

호출 오류

Lambda는 레코드 배치를 순서대로 처리한 다음, 오류가 발생하면 재시도하도록 설계되었습니다. 함수가 호출될 때마다 오류를 반환하면 Lambda는 레코드가 만료될 때까지 계속 재시도합니다. 또는 Lambda는 이벤트 소스 매핑에 구성된 최대 기간을 초과할 때까지 계속 재시도합니다. DynamoDB Streams 보존 기간은 24시간입니다. Lambda는 최대 1일 동안 계속 재시도합니다. 그 후에는 다음 레코드 배치로 이동합니다.

호출 오류가 IteratorAge 급증의 근본 원인인지 확인하려면 Lambda 오류 지표를 확인하세요. 호출 오류가 원인인 경우 Lambda 로그를 확인하여 오류를 디버깅한 다음, 코드를 수정하세요. 오류를 처리할 때 코드에 try-catch 문을 포함해야 합니다.

이벤트 소스 매핑 구성에는 IteratorAge 급증을 방지하는 데 유용할 수 있는 파라미터가 세 가지 있습니다.

  • 재시도 횟수: 이 파라미터는 함수가 오류를 반환할 때 Lambda가 재시도하는 최대 횟수를 설정합니다.
  • 레코드의 최대 기간: 이 파라미터는 Lambda가 함수에 보내는 레코드의 최대 기간을 설정합니다. 이 파라미터를 사용하면 너무 오래된 레코드를 폐기할 수 있습니다.
  • 오류 시 배치 분할: 이 파라미터는 더 작은 배치로 재시도하여 잘못된 레코드를 분리하고 시간 초과 문제를 해결하는 데 도움이 됩니다. 함수가 오류를 반환하면 재시도하기 전에 배치를 분할합니다.
    참고: 배치 분할은 재시도 할당량에 포함되지 않습니다.

폐기된 이벤트를 유지하려면 실패한 배치에 관한 세부 정보를 Amazon Simple Queue Service(Amazon SQS) 대기열에 보내도록 이벤트 소스 매핑을 구성합니다. 또는 세부 정보를 Amazon Simple Notification Service(SNS) 토픽에 보내도록 이벤트 소스 매핑을 구성합니다. 이렇게 구성하려면 실패 시 대상 파라미터를 사용합니다.

스로틀 발생

이벤트 레코드를 순차적으로 읽기 때문에 현재 호출을 스로틀하면 Lambda 함수는 다음 레코드로 진행할 수 없습니다.

DynamoDB Streams를 사용하는 경우 동일한 스트림 샤드에서 소비자를 둘 이하로 구성해야 합니다. 샤드에 리더가 셋 이상인 경우 함수가 스로틀될 수 있습니다. 자세한 내용은 스트림 판독 및 처리를 참조하세요.

단일 스트림 샤드에 세 개 이상의 리더가 필요하다면 팬아웃 패턴을 사용합니다. 스트림의 레코드를 사용하도록 Lambda 함수를 구성한 다음, 다른 다운스트림 Lambda 함수 또는 Amazon Kinesis 스트림에 전달합니다. Lambda의 경우 동시 실행 제한을 사용하여 스로틀을 방지합니다.

Lambda 처리량

런타임 기간

Lambda 함수의 기간 지표가 높으면 함수의 처리량이 감소하고 IteratorAge가 증가합니다.

함수의 런타임 기간을 줄이려면 다음 방법 중 하나 또는 모두를 사용합니다.

Lambda 동시 실행

최대 동시 Lambda 실행 수는 다음과 같이 계산됩니다.

동시 실행 수 = 샤드 수 x 샤드당 동시 배치 수(병렬화 인자)

  • 샤드 수: DynamoDB Streams에는 테이블의 파티션 수와 스트림 샤드 수 사이에 일대일 매핑이 있습니다. 테이블의 크기와 테이블의 처리량에 따라 파티션 수가 결정됩니다. 테이블의 각 파티션은 읽기 요청 최대 3,000개, 쓰기 요청 1,000개 또는 이 두 가지를 선형적으로 조합해 사용할 수 있습니다. 동시성을 높이려면 테이블의 프로비저닝된 용량을 늘려 샤드 수를 늘립니다.
  • 샤드당 동시 배치 수(병렬화 인자): 이벤트 소스 매핑에서 샤드당 동시 배치 수를 구성할 수 있습니다. 기본값은 1이며 최대 10까지 늘릴 수 있습니다.

예를 들어 테이블에 파티션이 10개 있고 샤드당 동시 배치 수가 5로 설정된 경우 최대 50개의 동시 실행이 가능합니다.

참고: 항목 수준 수정을 언제든 올바른 순서로 처리하기 위해 파티션 키가 동일한 항목은 동일한 배치로 이동됩니다. 테이블 파티션 키의 카디널리티가 높은지 그리고 트래픽이 단축키를 생성하지 않는지 확인하세요. 예를 들어 샤드당 동시 배치 값을 10으로 설정하고 쓰기 트래픽이 단일 파티션 키를 대상으로 하는 경우 샤드당 동시 실행은 하나만 가능합니다.

배치 크기

Lambda 처리량을 늘리려면 배치 크기 값을 조정합니다. 배치당 적은 레코드 수를 처리하면 스트림이 더 느리게 처리됩니다. 배치당 레코드 수가 많은 경우 함수 실행 기간이 늘어날 수 있습니다. 사용 사례에 가장 적합한 값을 찾으려면 여러 값을 사용하여 배치 크기를 테스트하는 것이 가장 좋습니다.

함수의 런타임 기간이 이벤트의 레코드 수와 독립적인 경우 함수의 배치 크기를 늘리면 함수의 반복기 수명이 줄어듭니다.

관련 정보

Amazon DynamoDB와 함께 AWS Lambda 사용

AWS 공식
AWS 공식업데이트됨 3달 전