본문 바로가기
Java/Spring

Spring) 평균 응답 시간 개선

by NH_club 2023. 8. 31.

현재 입찰 요청의 평균 응답 시간은 1300/ms이다. 일반적으로 클라이언트가 이용하기엔 매우 불편한 수치이다.

 

문제 원인 파악

현재 비동기로 이벤트를 발송하는 구조에서 많은 사용자가 연결 되었을 때, 내부적으로 이벤트를 전송하는 로직에 자원을 많이 사용하나? 라는 가설을 세우고 테스트를 진행해보았다.

연결을 하지 않고, 입찰 요청만 보냈을 때 응답 시간이 현저히 낮은 것을 확인했다. 입찰 요청의 문제가 아닌 연결 하고 이벤트를 발송할 때 생기는 문제라고 생각이 되었다. 이벤트 발송하는 로직에서 Emitter들이 유효한지 확인하는 반복문을 제거하여 테스트를 더 진행해 보았다.

응답시간이 줄어듦을 확인했다.

 

문제가 일어난 이유

SSE는 특성상 클라이언트가 접속을 끊었는지 확인하기 어렵다. 그러하여 이벤트를 전송하기 전 유효한 Emitter들을 확인하여 접속이 끊긴 Emitter는 삭제하고, 유효한 Emitter들에게만 이벤트를 전송한다. 이 과정에서 내부적으로 Thread가 동작하며 비동기로 이벤트를 보내주면서 자원을 같이 사용하게 된다. 그렇게 createBid의 응답 시간도 같이 느려진다.

추가로 SSE 연결을 지속하는 과정에서도 자원이 많이 소모되며, application의 다른 서비스까지 악영향을 끼친다.

 

해결 방안

  • scale-out으로 SSE 서버 분리
  • 메시지 큐 kafka 도입

 

적용 후 성능

  • Kafka, Scale-out 적용 전 입찰 평균 응답 시간

  • Kafka, Scale-out 적용 후 입찰 평균 응답 시간

Scale-out, Kafka 적용후 성능이 약 100% 개선 되었다.