2025-10-15

1일 1아티클

우아한기술블로그

Redis New Connection 증가 문제

배경

  • Spring Boot 3.2.4, lettuce 6.3.2, elasticache valkey 8
  • 피크 시간대 이후에도 신규 커넥션 연결 지표가 감소하지 않는 문제
  • Lettuce 설정 상 커넥션 풀 사용 중임에도 커넥션 생성 수 문제 발생 중

예상 원인

  1. 파이프라이닝에서 커넥션 사용
    • 여러 명령을 묶어서 효율적으로 처리하고자, redisTemplateexecutePipelined() method 사용
    • 내부적으로 LettuceConnection 클래스의 openPipelined() method 사용
    • 여러 개의 커넥션 사용 but 전용 커넥션 할당(공유 커넥션 사용 X)
  2. 커넥션 풀
    • 커넥션 풀 설정을 yml에서 최대 20개로 했기에, 재사용이 정상적으로 이루어진다면 커넥션 생성 수가 많아질 수 없음
    • 로그 확인 → Lettuce의 ConnectionWatchDog 클래스에서 connection 중단 시 재연결 시도하는 로그 확인

GenericObjectPool 사용, 이때 connection을 가져오는 전략은 LIFO

  • 일시적 트래픽 증가로 커넥션 풀이 최대로 만들어진 후 트래픽이 줄어들면?
  • LIFO 전략에 의해 최근 사용한 커넥션 일부만 사용, 나머지 커넥션은 IDLE 상태로 남게 됨!

Redis의 timeout 파라미터

  • timeout : Redis에서 IDLE 클라이언트 연결을 끊기 전에 기다리는 시간, AWS ElastiCache 기준 parameter group에서도 확인 가능

문제 흐름

  1. ElastiCache에서 timeout 초동안 사용하지 않은 IDLE connection 제거
  2. 서버에서는 connection이 닫히면, ConnectionWatchDog에 의해 재연결 수행

해결 방법

  1. LIFO → FIFO 방식으로 커넥션 풀 전략 변경
    • yml에서는 해당 파라미터 수정 불가
    • GenericObjectPoolConfig 내부 LIFO 값을 false로 수정
    • 커넥션 풀에 존재하는 connection들이 IDLE 상태로 남지 않고 재사용됨
  2. IDLE connection에 대한 정리
    • 커넥션 풀에 설정
    • minEvictableIdleDuration : connection이 설정한 시간 동안 아무 일을 하지 않으면(IDLE 상태) 제거 대상으로 간주
    • timeBetweenEvictionRuns : IDLE connection 제거 작업 주기

오늘 배운 것

  1. AI
    • 워드임베딩
    • RNN & LSTM
  2. 바이브 프로젝트 기능 개발
    • 스프링 테스트 시 환경변수 설정..??

내일 할 일

  1. AI

참고자료

results matching ""

    No results matching ""