입찰 테스트
💬 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 종료
✔ 해결 방안
💬 알아보고 고민을 해본 결과 해결할 수 있는 방법은 세 가지였습니다.
✅ 입찰 API에서 병목 현상을 최소화할 수 있도록 로직을 점검하고 수정하는 것입니다.
➡ [로직 점검] 시간 측정 로그를 통한 로직 점검
➡ [적용 완료] SSE 이벤트 전송하는 부분 비동기 처리
✅ Connection Pool에 있는 Connection의 개수를 늘리고 Timeout 시간을 짧게 설정하는 것입니다.
✅ AWS Instance의 사양을 업그레이드하는 것이었습니다. ( Scale-up )
➡ [적용 완료] t2.micro에서 c5.large로 업그레이드
💬 오늘은 이렇게 원인에 대해 분석을 해보고 해결해 볼 수 있는 방안들에 대해서 고민을 해보았습니다. 앞으로 상황에 맞춰 먼저 적용해 볼 수 있는 것 알아보고 입찰 API 병목 현상을 개선해 볼 생각입니다.
'개발일지 > TIL' 카테고리의 다른 글
[230825] 입찰 테스트 중 겪은 Jmeter 한계 (0) | 2023.08.25 |
---|---|
[230824] 성능 향상을 위한 EC2 Instance Scale-Up (0) | 2023.08.24 |
[230822] Jmeter에서 SSE 에러 실패로 표시하기 (0) | 2023.08.22 |
[230821] 서버에서 클라이언트로 SSE 예외 전달하기 (0) | 2023.08.21 |
[230819] Jmeter SSE 테스트 데이터 전송 받지 못하는 문제 (0) | 2023.08.19 |