<aside> <img src="/icons/reorder_gray.svg" alt="/icons/reorder_gray.svg" width="40px" />

목차


</aside>

문제 상황

V1에서는 Spring이 기본으로 제공하는 ApplicationEventPublisher와 EventListener를 활용해 EDA를 구성했습니다.

이는 사용자의 입찰에 따라 달라지는 데이터를 시스템에 반영하는 작업이 사용자의 요청에 대한 응답의 지연으로 이어지지 않기 위한 기술적인 결정이었습니다.

max vUser: 2000/ duration: 5m/ 경매 100개, 입찰이력 100만개 적재 후 수행

max vUser: 2000/ duration: 5m/ 경매 100개, 입찰이력 100만개 적재 후 수행

5분 동안 요청 유저 수가 Ramp up 되어 최대 2000명의 가상 유저에 도달하는 시나리오로 부하 테스트를 진행할 때였습니다. 빠른 응답을 내려주고자 구성했던 구조였음에도, 평균 TPS 18, Latency 39초라는 매우 낮은 테스트 결과를 마주하게 되었습니다.

목표 TPS 1000 이상, 최대 2000 이상을 잡고 있었던 팀의 목표에 한참 미치지 못하는 수치였기 때문에, 성능 최적화가 필요한 순간이었고, 총 2차례 성능 개선을 했고, 1.29K까지 TPS를 끌어올릴 수 있었습니다.

원인 분석

v1, connetion.png

부하 테스트를 진행하면서 서버에 지속적으로 찍히는 로그가 있었는데, 그건 Connection Timeout 문제였습니다. Connection Pool이 고갈되어서 새로운 요청이 들어오면 Connection 획득을 기다리다가 Timeout이 대거 발생하고 있는 것이었습니다.

image.png

Grafana를 통해 Connection Pool을 확인해보려 했지만, Metric이 수집되지 않는 구간이 생겼습니다. SQLTransientConnectionExcepion 이 무더기로 발생하는 시점과 Metric 수집이 중단되는 시점이 겹치는 걸로 보아, Connection Pool 고갈로 인해 Spring Actuator의 Metric 전송도 영향을 받은 걸로 보입니다.