본문 바로가기

개발일지/TIL

[230823] 입찰 테스트 시 HikariCP Timeout 문제

입찰 테스트

💬 SSE를 연결하고 정상적으로 데이터가 전송이 되는지 확인하기 위해서 입찰 API를 호출했습니다. SSE 위한 연결을 하고 입찰 API를 1분 단위로 건수를 늘려가며 테스트를 진행했습니다.

 

✔ 문제

💢 t2.micro 환경에서 SSE 400명 연결, 1분에 입찰 3000건을 테스트를 할 때 Connection Timeout 문제가 발생했습니다. 

 

 

✔ 원인

💬 Connection Timeout에 원인을 찾다 보니 HikariCP에 할당된 Connection이 전부 연결이 되어있고 Lock으로 인해 병목 현상이 발생해 대기하고 있던 Thread들이 기본 Timeout(30초)을 초과해서 발생한다는 것을 알게 되었습니다.
     ➡ Transaction이 실행될 때, Connection Pool에선 들어오는 Transaction 만큼 Connection을 연결
     ➡ 요청이 한꺼번에 들어오면 HikariCP에 있는 모든 Connection이 연결
     ➡ 입찰 API는 Lock이 걸려있기 때문에 한 개의 Connection만이 실행되고 나머지 Connection은 대기
     ➡ 한 개의 요청이 오래 걸릴 경우 병목현상이 발생
     ➡ Connection을 얻지 못한 Thread는 HandOffQueue에서 대기
     ➡ 기본 Timeout(30초)를 지나도 Connection을 얻지 못하면 예외 발생하며 Thread 종료

 

입찰 7건 요청시 활성화 되는 Connection 개수 확인 ( Thread 1 건만 실행 / 6건 대기 )

✔ 해결 방안

💬 알아보고 고민을 해본 결과 해결할 수 있는 방법은 세 가지였습니다.  

✅ 입찰 API에서 병목 현상을 최소화할 수 있도록 로직을 점검하고 수정하는 것입니다.
     ➡ [로직 점검] 시간 측정 로그를 통한 로직 점검
     ➡ [적용 완료] SSE 이벤트 전송하는 부분 비동기 처리
✅ Connection Pool에 있는 Connection의 개수를 늘리고 Timeout 시간을 짧게 설정하는 것입니다.
✅ AWS Instance의 사양을 업그레이드하는 것이었습니다. ( Scale-up )
     ➡ [적용 완료] t2.micro에서 c5.large로 업그레이드

💬 오늘은 이렇게 원인에 대해 분석을 해보고 해결해 볼 수 있는 방안들에 대해서 고민을 해보았습니다. 앞으로 상황에 맞춰 먼저 적용해 볼 수 있는 것 알아보고 입찰 API 병목 현상을 개선해 볼 생각입니다.