DynamoDB에서 글로벌 보조 인덱스(GSI) 쓰기 스로틀링 및 백 프레셔 이해
GSI 백 프레셔 스로틀링은 DynamoDB에서 가장 복잡한 스로틀링 시나리오 중 하나입니다. 이는 쓰기 작업과 스로틀링 사이에 간접적인 관계를 생성하기 때문입니다. 즉, 애플리케이션이 기본 테이블에 쓰기를 수행하지만 하나 이상의 인덱스에 대한 용량 제약으로 인해 스로틀링을 경험하게 됩니다.
GSI 백 프레셔 스로틀링 이해
DynamoDB 테이블에 쓰기를 수행할 때, 해당 테이블의 모든 글로벌 보조 인덱스(GSI)는 최종 일관성 모델을 사용하여 비동기적으로 업데이트됩니다. GSI가 이러한 업데이트를 처리할 충분한 용량을 갖추지 못한 경우, DynamoDB는 데이터 일관성을 유지하기 위해 기본 테이블에 대한 쓰기를 스로틀합니다. 이를 GSI 백 프레셔라고 합니다. GSI 작동 방식에 대한 자세한 내용은 DynamoDB의 글로벌 보조 인덱스를 참조하세요.
직접 테이블 스로틀링(접근 대상 리소스가 스로틀링을 유발하는 리소스와 동일함)과 달리, GSI 백 프레셔는 기본 테이블과 해당 인덱스 간에 종속성을 생성합니다. 기본 테이블에 충분한 용량이 있더라도, 연관된 GSI 중 하나라도 업데이트 볼륨을 처리할 수 없는 경우 쓰기가 스로틀된 상태가 됩니다. 이 관계는 특히 이해해야 할 중요한 점입니다. 파티션 수준 제약 조건이 기본 테이블과 각 GSI에 독립적으로 적용되기 때문입니다. 각 조건마다 고유한 파티션 구조와 해당 처리량 한도가 있습니다.
GSI 파티셔닝은 GSI의 파티션 키를 기반으로 하며, 이는 기본 테이블의 파티션 키와 종종 다릅니다. 기본 테이블 액세스가 파티션 간에 완벽하게 분산되어 있더라도 GSI 업데이트는 특정 파티션에 집중되어 GSI 내 핫 스팟을 생성할 수 있습니다. 테이블과 GSI 모두에 대한 파티션 키 설계의 일반적인 모범 사례는 DynamoDB 파티션 키 설계를 참조하세요.
예를 들어, 기본 테이블이 customerId를 파티션 키로 사용(균등 분산)하지만 GSI가 status를 파티션 키로 사용(가능한 값이 'active', 'pending', 'closed' 등으로 제한됨)하는 경우, 자주 사용되는 상태 값을 가진 항목에 대한 업데이트는 기본 테이블 액세스가 균형 잡혀 있어도 GSI 핫 파티션을 생성할 수 있습니다. 이는 기본 테이블과 GSI 모두 충분한 전체 용량을 보유하고 기본 테이블의 액세스 패턴이 고르게 분산된 것처럼 보임에도 불구하고, GSI 핫 파티션으로 인해 애플리케이션이 스로틀링을 경험할 수 있는 특히 까다로운 시나리오를 만듭니다.
스로틀링 예외가 GSI(ResourceArn을 통해)를 가리키더라도, 실제로 스로틀링되는 작업은 기본 테이블에 대한 쓰기입니다. 애플리케이션이 기본 테이블에 쓰기를 수행하고 있지만 GSI에 대한 예외를 수신하기 때문에 혼란스러울 수 있습니다.
GSI 스로틀링 유형
GSI 백 프레셔 스로틀링은 특정 용량 제약에 따라 다음과 같은 다양한 예외 유형으로 나타납니다.
-
GSI 프로비저닝 용량 초과: GSI가 기본 테이블 작업의 업데이트를 처리할 충분한 쓰기 용량 단위를 확보하지 못할 때 발생합니다. 이 경우
ProvisionedThroughputExceededException이 발생하며, 그 사유는 IndexWriteProvisionedThroughputExceeded입니다. 또한ResourceArn은 용량 제약을 겪고 있는 특정 GSI를 직접 가리킵니다. -
GSI 온디맨드 최대 처리량 초과: 온디맨드 테이블에 대해 구성된 최대 한도를 GSI 쓰기 작업이 초과할 때 발생합니다. 이 경우
ThrottlingException이 발생하며, 그 사유는 IndexWriteMaxOnDemandThroughputExceeded로 처리량 제한이 구성된 특정 GSI를 식별합니다. -
GSI 파티션 한도 초과: 전체 GSI 용량이 충분해 보이더라도 개별 GSI 파티션이 처리량 한도(핫 파티션)를 초과할 때 발생합니다. 이 경우
ThrottlingException이 생성되며 그 사유는 IndexWriteKeyRangeThroughputExceeded로ResourceArn에 식별된 특정 GSI의 핫 파티션 문제를 나타냅니다. GSI 파티션 분포는 기본 테이블의 파티션 분포와 크게 다를 수 있어, 기본 테이블 액세스가 균등하게 분산되어 있어도 GSI에 핫 스팟이 생성될 수 있으므로 이는 특히 중요합니다. -
GSI 계정 한도 초과: 특정 GSI에 대한 쓰기 작업이 계정 수준에서 설정된 테이블별(또는 해당 테이블 내 개별 GSI별) 리전 처리량 한도를 초과할 때 발생합니다. DynamoDB는
ThrottlingException을 반환하며, 그 사유는 IndexWriteAccountLimitExceeded로, 계정 한도를 초과한 GSI를 가리킵니다. 이 스로틀링은 한도를 초과한 각 GSI에 대해 독립적으로 발생합니다. 테이블당, 계정당, 리전당, 서비스당 할당량에 대한 자세한 내용은 Amazon DynamoDB의 할당량 섹션을 참조하세요.