DynamoDB RCU 폭증, Limit 설정과 Eventually Consistent Read로 해결!
DynamoDB RCU 사용량이 급증하여 문제 발생, 130배 증가라는 심각한 상황 직면
Limit 미설정과 Strong Consistent Read 사용이 주요 원인으로 분석됨
Limit 설정 및 Eventually Consistent Read로 전환하여 RCU 사용량 87~97% 절감 성공
guregu/dynamo 라이브러리의 Limit과 SearchLimit의 동작 차이 분석
DynamoDB 사용 시 Limit 설정, ConsumedCapacity 로깅, Consistency 옵션 검토 권장
DynamoDB Query API의 Limit과 SearchLimit 이해
본문에서는 DynamoDB Query API의 Limit과 SearchLimit의 차이점을 명확히 설명한다. Limit은 필터링 유무에 따라 DynamoDB API에 전달 여부가 달라져, 필터가 없을 경우 전체 파티션을 스캔하는 문제가 발생할 수 있다.
Limit(n): 필터가 없을 경우 n개까지 반복하며, 필터가 있을 경우 전체 스캔 위험
SearchLimit(n): 항상 n개 스캔으로 제한하여 서버 측 스캔을 제한
결과적으로 RCU 최적화를 위해서는 SearchLimit을 명시적으로 설정하는 것이 권장된다. guregu/dynamo 라이브러리에서 Limit만 사용할 경우, 필터 유무에 따라 페이징 동작이 달라지므로 주의해야 한다.
guregu/dynamo 라이브러리의 동작 원리
버즈빌은 DynamoDB 연동을 위해 guregu/dynamo 라이브러리를 사용하며, AWS SDK 대비 Struct Binding, Chainable API, Iter()와 All() 메서드를 통한 간결한 코드 작성을 지원한다. 특히 Iter() 사용 시, for 루프에서 break로 일찍 빠져나올 수 있어, iteration 횟수만큼만 RCU가 소비된다고 오해할 수 있다.
Next() 메서드: 페이지 단위로 조회된 결과를 순회
Limit 설정: 필터가 없을 경우, Limit 개수만큼 데이터를 가져올 때까지 페이징 반복
SearchLimit 설정: 한 번의 API 호출로 데이터 조회 제한
결론적으로, Limit 설정 시 필터 유무에 따른 동작 방식을 정확히 이해하고, RCU 사용량을 고려하여 SearchLimit을 적극 활용해야 한다.
Strong Consistent Read와 Eventually Consistent Read의 차이
DynamoDB에서 Strong Consistent Read는 최신 데이터를 보장하지만, RCU를 2배 소비한다. 반면, Eventually Consistent Read는 데이터 일관성에 약간의 시간이 소요되지만, RCU 사용량을 절감할 수 있다.
Strong Consistent Read: 최신 데이터 보장, RCU 1개 소비
Eventually Consistent Read: 데이터 일관성 지연, RCU 0.5개 소비
Limit 설정: 필터링 시 전체 스캔 가능성
본문에서는 불필요한 Strong Consistent Read 사용으로 RCU가 2배 증가한 사례를 제시하며, Eventually Consistent Read로의 전환을 통해 RCU 사용량을 절감했다.
RCU 급증 원인 분석 방법론
버즈빌은 RCU 급증 문제를 해결하기 위해 Datadog을 활용한 메트릭 분석, 배포 이력 자동 추적, 다중 서비스 배포 매트릭스 분석 등 체계적인 접근 방식을 사용했다. 특히, AI를 활용한 PR 분석과 GitHub CLI 스크립트 작성을 통해 배포 이력과 RCU 사용량 증가 간의 상관관계를 빠르게 파악했다.
Datadog: RCU 사용량 추이 분석
AI 기반 PR 분석: 배포 이력과 RCU 증가 시점 연관성 분석
GitHub CLI 스크립트: 배포 이력 자동 추출
이러한 분석 과정을 통해 Limit 미설정 및 Strong Consistent Read 사용이라는 근본 원인을 찾아내고, 효율적인 해결책을 제시했다.
DynamoDB RCU 절감을 위한 Best Practice
본문은 DynamoDB 사용 시 RCU 절감을 위한 구체적인 Best Practice를 제시한다. Limit 설정, ConsumedCapacity 로깅, Consistency 옵션(Strong vs Eventually)을 적절히 활용하여 RCU 사용량을 최적화해야 한다.
Limit 설정: 필터링 시 전체 스캔 방지
ConsumedCapacity 로깅: RCU 사용량 모니터링
Consistency 옵션: Eventually Consistent Read 활용
특히, guregu/dynamo 라이브러리 사용 시 Limit과 SearchLimit의 차이점을 정확히 이해하고, SearchLimit을 적극 활용하여 불필요한 RCU 소비를 줄여야 한다. 또한, 병렬 조회 구조에서 ConsumedCapacity 로깅을 통해 RCU 사용량을 지속적으로 모니터링하는 것이 중요하다.