본문 바로가기
개발

JedisExhaustedPoolException 이슈

by just다해 2024. 9. 8.

JedisExhaustedPoolException 이슈 발생

redis.clients.jedis.exceptions.JedisExhaustedPoolException
Could not get a resource since the pool is exhausted

트래픽이 몰리는 경우 jedis Pool exhausted 오류 발생하여, 해당 오류를 해결하기 위해 원인을 파악해 보았습니다.

jesque 가 단순 enqueue인데 트래픽이 얼마나 몰리길래 pool이 부족한지 의문을 가졌고, redis LPUSH 시간복잡도가 어느 정도인지 확인해 보았습니다.

 

LPUSH

Prepends one or more elements to a list. Creates the key if it doesn't exist.

redis.io

더보기

Time complexity: O(1) for each element added, so O(N) to add N elements when the command is called with multiple arguments.

찾아보니, 시간복잡도가 O(1)인데, 현재 설정된 connection이 부족한 건 말이 안 된다고 생각이 들었고, jesque 설정한 부분에 대해서 확인해 보았습니다.

GenericObjectPoolConfig<Any?>().apply {  
  maxTotal = properties.maxTotal  
  minIdle = properties.minIdle  
  maxIdle = properties.maxIdle  
  testOnBorrow = true  
  blockWhenExhausted = false
},

설정된 값 중 blockWhenExhausted가 false로 설정되어 있었던 게 문제였습니다.

그렇다면, blockWhenExhausted 는 어떤 설정값일까요?

  • 리소스 풀이 소진될 때 호출자가 대기해야 하는지 여부로, true인 경우 maxWaitMillis 값이 적용

이 값이 false 로 설정되어 있어 리소스 풀이 소진된 경우 대기하지 않고, 바로 오류 발생하고 있었으며, 해당 값을 false로 설정하기 위해서는 커넥션 풀을 엄청나게 크게 잡아야 이슈가 없기 때문에, true로 설정 후 maxWaitMillis 1초로 변경하고 해결하였습니다.

보통  blockWhenExhausted를 false로 설정하는 케이스는 없다는 것도 알게 되었습니다.

 

 

 

'개발' 카테고리의 다른 글

GIT (2)  (0) 2024.09.10
GIT (1)  (0) 2024.09.09
Kafka 설정 값  (1) 2024.09.08
Transaction  (1) 2024.09.08
NoSQL  (0) 2024.08.25