본문 바로가기
Java/Spring

Spring) Transaction 처리 속도 향상

by NH_club 2023. 8. 28.

scale-up을 하고도 Time out 에러가 발생했다.

서버의 자원은 아직 견딜 만 한데도 Time out이 발생한다.

이는 Transaction의 처리 속도가 느리니 Lock이 걸려있는 시간도 길어진다. 그러므로 Lock을 얻기위해 Connection 들은 기다린다. 그렇게 되며 병목현상이 발생하고, HandOffQueue에서 대기하는 Thread들의 시간이 30초를 넘으며 time out이 발생하는 것 같다.

문제 원인 파악

각각의 시간이 얼마나 걸리는지 로그를 찍어 확인해 보았다.

그 결과 발생하는 이벤트를 전송하는(Bid Update Send) 과정에서 처리하는 시간의 90% 이상을 차지한다.

 

문제가 발생한 원인

업데이트 된 입찰가를 연결되어있는 클라이언트들에게 보내는 과정에서 많은 시간이 소요된다.

SSE 특성상 클라이언트 쪽에서 언제 끊었는지 파악하기 힘들어 이벤트를 보내기 전 Emitter를 돌며 유효하지 않는 Emitter들을 삭제해주는 과정이 들어간다.

그로 인해 연결이 많이 되어 있을수록 이벤트 전송 과정이 길어지게 된다. 그러면 Lock이 걸려있는 시간이 증가되고, 병목현상이 발생하여 Time out이 되는 악순환이 일어나게 되는 것이였다.

 

해결 방안

입찰에서 Lock 걸리는 시간을 줄이기 위해 약 90% 이상의 시간을 차지하고 있는 이벤트 전송 기능을 비동기 방식으로 처리하여 이벤트 전송은 다른 스레드에서 보내도록 수정했다.

비동기 처리 전 평균 처리 시간 비동기 처리 후 평균 처리 시간
20/ms ~ 30/ms 6/ms ~ 8/ms

Transaction 처리 시간이 300% 이상 향상 되었으며, Time out이 전혀 발생하지 않았다.