메시지 트래픽 100배에도 끄떡 없게 고객 테이블 뜯어고치기 (1)
백엔드
메시지 트래픽 100배에도 끄떡 없게 고객 테이블 뜯어고치기 (1)
두줄요약
16억 건 규모의 User 테이블에서 Badge 업데이트가 쓰로틀링을 유발한 원인을 분석했습니다. Badge를 별도 테이블로 분리하고, Export/Import와 Glue로 안전한 마이그레이션 전략을 설계했습니다.
문제 상황
- User 테이블이 16억 8천만 건 규모와 1.8TB 용량을 가지며, Badge 업데이트 스파이크 시 전체 테이블이 느려지는 상태
- 메시지 전송과 OTM 발송으로 Badge 쓰기가 몰리면서 일반적인 프로필·태그 수정까지 쓰로틀링 전파
원인 분석
- Badge 업데이트가 아이템 전체 크기 기준 WCU를 소모하고, 트랜잭션 사용으로 충돌·재시도 시 WCU 누적
- channelId 기반 GSI에 쓰기가 집중되어 핫 파티션이 발생하고, Back-Pressure로 메인 테이블 쓰기까지 차단
해결 방법
- Badge 데이터를 User 테이블에서 별도 UserBadge 테이블로 분리하여 쓰기 패턴과 용량을 독립 관리
- 같은 테이블 내 아이템 분리보다 테이블 분리가 GSI 병목과 트랜잭션 충돌 문제를 근본적으로 줄이는 구조로 판단
성능/운영 포인트
- 16억 건 마이그레이션은 Full Scan/Full Write 방식보다 DynamoDB Export/Import와 AWS Glue 조합이 유리
- TmpUserBadge와 동기 Dual Write를 두어 마이그레이션 중 발생하는 변경분을 흡수하고 최종 전환을 준비
