Amazon DynamoDB Streams를 처리하는 데 왜 그렇게 시간이 오래 걸리는지 알고 싶습니다.
해결 방법
AWS Lamdba를 통해 DynamoDB Streams를 사용하는 경우, 테이블에 기록되지만 Lambda에서 처리하지 않는 레코드가 있을 수 있습니다. 이러한 레코드를 처리하는 데 몇 시간이 걸릴 수도 있습니다. 원인을 해결하려면 Lambda IteratorAge 지표를 검토하십시오.
IteratorAge가 증가하면 Lambda는 DynamoDB Streams에 기록된 레코드를 효율적으로 처리하지 못합니다. 다음과 같은 이유로 IteratorAge 지표가 증가할 수 있습니다.
호출 오류
Lambda는 레코드 배치를 순서대로 처리하고 오류가 발생하면 재시도하도록 설계되었습니다. 함수가 호출될 때마다 함수가 오류를 반환하면 Lambda 함수는 계속해서 레코드 처리를 시도합니다. 함수는 레코드가 만료되거나 레코드가 이벤트 소스 매핑에 구성된 최대 기간을 초과할 때까지 계속해서 레코드 처리를 시도합니다. 스트림에 있는 레코드가 처리되지 않기 때문에 IteratorAge 지표에 스파이크가 있을 수 있습니다. Lambda 오류 지표에서 오류 지표의 스파이크를 확인할 수 있습니다. 또는 Lambda 로그에서 자세한 내용을 검토하십시오.
호출 오류로 인해 IteratorAge 지표에 스파이크가 발생하지 않도록 하려면 레코드를 Dead Letter Queue(DLQ)로 전송하십시오. 이벤트 소스 매핑을 생성할 때 특정 파라미터에 대해 다음 정보를 입력합니다.
- 재시도 횟수: 이 파라미터는 함수에 오류가 있을 때 Lambda 함수가 실행되는 횟수입니다. 사용 사례에 따라 이 값을 업데이트하고 함수가 특정 횟수만큼 재시도한 후 레코드를 DLQ로 전송합니다.
- 오류 시 배치 분할: 이 파라미터는 함수가 배치를 재시도하기 전에 배치를 두 개의 배치로 분할합니다. 이 파라미터를 사용하여 배치를 분할하고 더 작은 배치로 호출을 계속할 수 있습니다. 배치를 분할하면 호출 오류를 일으키는 잘못된 레코드를 분리하는 데 도움이 될 수 있습니다.
스로틀링 오류
DynamoDB Streams를 사용할 때는 스로틀링을 방지하기 위해 샤드당 소비자가 두 명을 넘지 않는 것이 가장 좋습니다. Lambda는 레코드를 순차적으로 처리하므로 현재 호출이 제한되면 Lambda는 레코드를 계속 처리할 수 없습니다. 두 명이 넘는 소비자를 사용해야 하는 경우 Amazon Kinesis 또는 팬아웃 패턴을 사용하십시오. 또는 Lambda에서 동시 실행 제한을 사용하여 스로틀링을 방지합니다.
Lambda 처리량
Lambda 처리량은 Lambda 함수를 한 번 호출하여 레코드 또는 레코드 배치를 처리하는 데 걸리는 시간입니다. Lambda 함수의 처리량에 영향을 줄 수 있는 요인은 다음과 같습니다.
런타임 기간
기간 지표 값이 높으면 함수의 처리량이 낮고 결과적으로 함수에 대한 IteratorAge 지표가 증가합니다. 함수의 런타임 기간을 줄이려면 함수에 할당된 메모리를 늘리십시오.
레코드를 처리하는 데 필요한 시간을 줄이도록 함수 코드를 최적화할 수도 있습니다.
Lambda 동시 실행
동시성은 Lambda 함수가 동시에 처리하는 진행 중인 요청의 수입니다. 동시 Lambda 호출 수가 증가하면 스트림 레코드 처리를 개선할 수 있습니다. 동시 요청마다 Lambda는 실행 환경의 개별 인스턴스를 프로비저닝합니다. 최대 동시 Lambda 실행 수는 다음과 같이 계산됩니다.
동시 실행 수 = 샤드 수 x 샤드당 동시 배치 수(병렬화 인자)
DynamoDB Streams에는 테이블의 파티션 수와 스트림 샤드 수 사이에 1:1 매핑이 있습니다. 파티션 수는 테이블의 크기와 처리량에 따라 결정됩니다. 테이블의 각 파티션은 읽기 요청 최대 3,000개, 쓰기 요청 1,000개 또는 이 두 가지를 선형적으로 조합해 사용할 수 있습니다. 따라서 동시성을 높이려면 테이블의 프로비저닝된 용량을 늘려 샤드 수를 늘립니다. 이벤트 소스 매핑에서 샤드당 동시 배치 수를 구성할 수 있습니다. 기본값은 1이며 최대 10까지 늘릴 수 있습니다. 예를 들어 테이블에 파티션이 10개 있고 샤드당 동시 배치 수가 5로 설정된 경우 최대 50개의 동시 실행이 가능합니다.
항목 수준 수정을 언제든 올바른 순서로 처리하기 위해 파티션 키가 동일한 항목은 동일한 배치로 이동됩니다. 테이블 파티션 키는 카디널리티가 높아야 하며 트래픽은 단축키를 생성할 수 없습니다. 예를 들어 샤드당 동시 배치 값을 10으로 설정하고 쓰기 트래픽이 단일 파티션 키를 대상으로 하는 경우 샤드당 동시 실행은 하나만 가능합니다.
배치 크기 및 배치 기간
Lambda 배치 동작은 제대로 조정되지 않은 경우 함수의 처리량을 낮출 수 있습니다. DynamoDB Streams의 처리를 최적화하려면 사용 사례에 따라 배치 기간 및 배치 크기를 조정하십시오.
배치 크기가 너무 낮은 값으로 설정된 경우 적은 수의 레코드로 함수가 자주 호출됩니다. 이러한 빈번한 호출로 인해 스트림 처리 속도가 느려집니다. 배치 크기 값을 너무 높게 설정하면 함수 기간이 늘어날 수 있습니다.
배치 기간 값과 해당 기간의 레코드 수가 최적화되지 않은 경우 동일한 샤드를 불필요하게 호출할 수 있습니다. 이러한 불필요한 호출은 스트림 처리 속도를 늦출 수 있습니다. 배치 기간 값이 너무 높으면 함수가 스트림을 처리할 때까지 더 오래 기다릴 수 있습니다. 이렇게 처리 시간이 길어질수록 IteratorAge가 늘어납니다.
처리량을 늘리고 IteratorAge를 줄이려면 배치 기간과 배치 크기의 여러 조합을 테스트하는 것이 가장 좋습니다.
관련 정보
성능 지표
Lambda 스케일링 및 처리량에 대한 이해
Lambda 함수 스케일링에 대한 이해
DynamoDB Streams Amazon Kinesis Adapter를 사용하여 스트림 레코드 처리
DynamoDB Streams 및 Lambda 트리거