HikariPool Connection is not available

Junseo Jung·2023년 9월 12일
0

Spring

목록 보기
2/2
post-thumbnail

스프링 부트를 사용한 프로젝트 진행 중 JMeter를 사용한 부하테스트에서 해당 문제가 발생하였다.

hikaripool-1 - connection is not available request timed out after 30000ms

해당 문제를 해결해 가는 과정에 대해 적고자 한다.

HikariCP의 동작 방식

스프링부트 3.0이상에서는 JDBC에서 Hikari를 사용하게 된다.

  1. 쿼리 전송 필요
  2. 쓰레드가 HikariCP에 커넥션 요청
  3. HikariCP는 Connection Pool에서 사용 가능한 커넥션 탐색
    1. 사용 가능한 커넥션이 있는 경우 커넥션 반환
    2. 없는 경우 대기
  4. 커넥션을 통해 쿼리 전송

1. HikariPool max-pool-size 설정(완벽하지 않은 정답)

hikaripool-1 - connection is not available request timed out after 30000ms

해당 오류가 부하테스트 중에 발생하였으므로 너무 많은 쿼리가 발생하여 커넥션 풀에 남은 커넥션이 없을 것이라 판단하였다.

따라서 최대 풀 개수를 증가시키고자 하였다.

spring:
  datasource:
    hikari:
      connection-timeout: 3000
      maximum-pool-size: 100
      max-lifetime: 30000

로컬에서 부하테스트를 증가시키는 것이 목표였으므로 풀 개수에 대한 생각없이 증가하였고 로컬에서 해당 예외가 발생하지 않았다.

하지만 배포를 위한 RDS에서는 다시 해당 오류가 발생하였다.

2. RDS 및 Hikari 설정 의심(오답)

  1. RDS 최대 커넥션 수 의심

    로컬에서 사용한 h2DB와 개발환경에서 사용할 RDS MySQL의 차이를 최대 커넥션 수로 의심했다.

    의심의 이유는 로컬과 달리 RDS의 프리티어의 리소스를 못믿었기 때문이다.

    최대 커넥션 수를 조절해봤고 해결되지 않았다.

  2. Hikari connection-timeout

    connection-timeout: 클라이언트가 Hikari Pool에서 커넥션을 얻어오는데 걸리는 최대 시간

    가설) connection-timeout이 너무 짧고 RDS의 최대 커넥션 수가 부족하여 커넥션을 얻어오기가 오래걸리게 되어 문제가 발생한다.

    결론) 의미있는 해결책이 아니다.

3. HTTP 통신의 문제(허무한 결론)

이 프로젝트의 구조는 다음과 같다.

대략적인 동작방식은

  1. 리액트 클라이언트의 요청은 메인서버인 스프링부트 서버로 간다.
  2. 스프링부트 서버는 이 요청에 대한 분석을 위해 FastAPI서버로 HTTP요청을 보낸다.
  3. FastAPI서버에서 분석 완료 후 결과를 스프링 서버에 HTTP로 반환한다.(문제점)

문제점은 FastAPI서버에서 비동기로 실행되어야 할 부분이 잘못 짜여져 있어서 동기로 진행되었고

그러다보니 분석시간이 갈수록 길어지기 시작했다.

이렇게 스프링에서 할당받은 커넥션들의 대기시간이 30초가 길어지자 다음 커넥션을 기다리고 있던 요청은 Hikari의 connection-timeout을 넘기게 되어 문제가 발생한 것이었다.

의도치 않게 Hikari 설정의 중요성을 알게 되었고 더욱 공부를 해야겠다 배우게 된 경험이였다.

참고

HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그

[장애회고] ORM(JPA) 사용 시 예상치 못한 쿼리로 인한 HikariCP 이슈

Connection is not available, request timed out after 30000ms.

Commons DBCP 이해하기

0개의 댓글