서비스 장애 대응이나 부하 분산 적용 경험을 구체적으로 전달한다
팀 프로젝트로 만든 소셜 퀴즈 게임 서버를 실제로 배포했을 때 겪은 경험입니다. 평소에는 동시 사용자 50명 수준이었는데, 학교 행사 연계로 갑자기 400명 이상이 몰리면서 서버가 응답 불능 상태가 되었습니다.
장애 원인을 분석하니 DB 연결 풀이 고갈되는 구조였습니다. 요청마다 새로운 커넥션을 맺고 있었는데, 동시 요청이 몰리면 커넥션 대기가 쌓이면서 타임아웃이 발생하는 패턴이었습니다. 단기 조치로 커넥션 풀 사이즈를 늘리고, 중기 조치로 빈번히 조회되는 순위 데이터를 Redis에 캐시하는 구조로 변경하였습니다. 그 이후에는 같은 규모 트래픽에서 에러 없이 운영되었습니다. 실패는 부하 테스트를 배포 전에 한 번도 하지 않은 것이었는데, 서비스가 터지고 나서야 그 필요성을 알게 되었습니다.
대규모 트래픽에 안정적이려면 장애가 나기 전에 병목이 어디서 생기는지 먼저 알아야 합니다. 예측하지 못한 트래픽이 문제가 아니라, 예측하지 않은 것이 진짜 문제였습니다.