백엔드
DynamoDB 핫 파티션을 해결하는 3가지 방법 (1): 인덱스 테이블로 GSI 떼어내기 설계편
두줄요약
DynamoDB GSI 핫 파티션이 Boot까지 막는 장애 구조를 분석했습니다. 인덱스 테이블과 스트림 기반 파이프라인으로 쓰기 병목을 분리하는 설계를 소개했습니다.
문제 상황
- DynamoDB User 테이블의 managed GSI에 쓰기가 집중되며 파티션 핫스팟과 Back-Pressure 발생
- GSI와 무관한 Boot 요청까지 거부되어 고객사 사이트의 채널톡 동작 중단으로 확대
- 메인 테이블 용량 확장이나 경로별 요청 제한만으로는 근본 해결 불가
원인 분석
- managed GSI의 PK가 channelId라 특정 채널 쓰기가 한 파티션에 집중
- SK가 lastSeenAt이라 접속 시각 갱신마다 삭제 후 재기록이 일어나 쓰기 비용 증가
- GSI 쓰기 지연이 메인 테이블 쓰기 거부로 이어지는 DynamoDB Back-Pressure 구조
해결 방법
- managed GSI를 제거하고 user_managed_index 인덱스 테이블로 역할 분리
- DynamoDB Streams(Kinesis) 기반 ch-flow-shard와 ch-rate-limiter로 쓰기 전파와 핫파티션 제어
- 내부 SQS 버퍼로 핫 채널 쓰기를 격리해 메인 테이블과 인덱스 테이블의 비동기 분리
