DynamoDB야 진정해! Kafka와 Redis로 구현하는 실시간 역압력 아키텍처 구축기
백엔드
DynamoDB야 진정해! Kafka와 Redis로 구현하는 실시간 역압력 아키텍처 구축기
두줄요약
DynamoDB 부하를 실시간으로 감지해 Kafka 컨슈머를 pause/resume하는 역압력 아키텍처를 구축했습니다. 운영 적용 후 처리량을 낮추고 실시간 API 안정성과 비용 절감을 확인했습니다.
문제 상황
- DynamoDB를 공유 자원으로 쓰는 환경에서 새벽 배치 작업이 실시간 API 자원을 잠식하는 처리량 경쟁
- 배치 컨슈머의 대량 조회·업데이트로 DynamoDB throttling과 API 에러 발생
원인 분석
- 실시간 작업과 배치 작업이 동일한 DB 자원을 두고 경쟁하는 구조
- 고정 동시성, Bulkhead, RateLimiter 같은 정적 제어는 한가할 때 자원 낭비와 바쁠 때 과부하 대응 실패를 유발
- DynamoDB는 RCU/WCU와 Provisioned 처리량 비율로 부하를 판단할 필요
해결 방법
- CloudWatch 지표와 SNS 알람으로 DynamoDB 부하를 감지하고 Redis Stream으로 제어 신호 전파
- Spring Kafka에서 pause/resume으로 배치 컨슈머 소비 속도를 동적으로 조절
- ConsumerRebalanceListener의 onPartitionsAssigned 재구현으로 리밸런싱 이후에도 역압력 상태 유지
성능/운영 포인트
- CloudWatch 1분 집계와 Provisioned 지표 5분 집계 차이를 LAST 함수로 보정
- 운영 적용 후 읽기·쓰기 처리량 각각 11%, 47.5% 감소
- 향후 고해상도 지표, 보조 메트릭, Global RateLimiter 도입 검토
