문제
Scale out 설정에도 불구하고, 게임 추가 오픈으로 인해 동접 통계 API가 스파이크성 트래픽을 견디지 못하고 어플리케이션이 다운되는 이슈
원인
Redis Multi 명령어 사용 및 비즈니스 로직의 동기식 처리로 인한 지연 발생 및 Redis Connection Pool 고갈
분석
Sentry 알림을 통해 장애 상황을 인지하고, APM을 통해 병목이 발생한 지점 파악
해결
- API 호출에 대한 병목 구간을 확인하고, 해당 비즈니스 로직 비동기 처리 (@Async) → APM 상의 요청에 대한 응답 지연은 발생안되는 것을 확인
- 비즈니스 로직은 Redis 호출 기능만 있었기 때문에 Redis Monitor 명령어를 활용하여, Multi 명령어의 트랜잭션 때문에 Redis의 커넥션 풀이 고갈나는 상황을 인지
- Lettuce 공식 문서에 따르면 Redis는 단일 Thread이기 때문에 Connection Pool을 사용해도 성능에 큰 효과를 주지 않기 때문에 무의미한 connection pool 대신 single connection으로 변경
- Multi 명령어 실행전 setAutoFlushCommand(false) 옵션을 추가하여 Transaction을 제어하도록 변경하여 multi 명령어 사용에 대한 병목 구간을 해결해 프로덕션 환경까지 배포하여 장애에 대한 조치를 완료 하였습니다. (feat. 문서)