Skip to main content
duksoo.dev
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Redis 타임아웃, 원인은 Redis가 아니었다

Redis를 도입하고 나서 간헐적으로 타임아웃이 발생했다. 당연히 Redis가 느린 줄 알았는데, slow log를 확인해보니 비어있었다. Redis는 빠르게 응답하고 있었다. 그럼 뭐가 문제였을까?

문제 상황

Redis 도입 후 APP에서 간헐적으로 타임아웃 에러가 발생했다.

증상:

  • APP에서 Redis 요청 타임아웃
  • 특정 API에서만 발생
  • Redis slow log는 비어있음

Redis가 느리면 slow log에 기록이 남아야 한다. 근데 비어있다? Redis는 정상이라는 뜻이다.

Read full post gdoc_arrow_right_alt

Redis Connection Pool이 끊긴 연결을 계속 내주는 이유

Connection Pool은 연결을 재사용해서 성능을 올려주지만, 풀 안의 연결이 죽었는지 살았는지는 별개 문제다.

EKS 업그레이드 중 Redis pod가 재시작되면서 Pool 안의 연결이 전부 끊겼는데, Pool이 유효성 검증 없이 끊긴 연결을 그대로 반환했다. Lettuce에 auto-reconnect이 있는데도 복구가 안 된 이유와, testOnBorrow/testWhileIdle 설정의 차이를 정리한다.

한눈에 보기

항목 내용
증상 RedisSystemException, pod restart 전까지 복구 불가
원인 Connection Pool의 testOnBorrow 미설정
스택 Spring Boot 3.5.0 + Lettuce 6.5.5 + Commons Pool2
해결 testOnBorrow=true 또는 testWhileIdle=true 추가
재발 조건 Redis pod와 앱 pod가 동시에 재생성되는 경우

문제 상황

order-api는 Redis 연결을 Lettuce + Commons Pool2 기반 Connection Pool로 관리하고 있었다.

Read full post gdoc_arrow_right_alt