AI

[LLM] Gemini 무응답 hang 타임아웃 재시도

jykim23 2026. 7. 9. 11:11
반응형

Gemini 무응답 hang 타임아웃 빈 응답 재시도 예산

부제: 빈 응답은 다시 시도하면서, 멈춤은 그냥 실패하던 문제

챗봇이 LLM(Gemini)을 호출하는데, 가끔 응답이 이상하게 온다.
하나는 빈 응답이다. 모델이 뭔가 주긴 했는데 알맹이가 없는 경우다.
이건 이미 재시도하도록 해 뒀다. 한 번 더 부르면 대개 제대로 온다.

문제는 다른 실패였다.

빈 응답은 다시, 멈춤은 그냥 실패

운영에서 Gemini가 60초 동안 응답을 안 주고 멈추는 일이 났다.
빈 응답이 아니라 아예 답이 안 오는 hang이었다.

이때는 타임아웃 예외가 곧바로 위로 던져졌다.
재시도 로직은 빈 응답만 다시 부르게 돼 있었고, 타임아웃은 그 대상이 아니었다.
그래서 한 번 멈추면 재시도 없이 채팅이 통째로 실패했다.

앞뒤가 안 맞았다.
빈 응답이든 멈춤이든 사용자 입장에선 "답이 안 온" 똑같은 상황인데,
하나는 다시 시도하고 하나는 그냥 포기하고 있었다.

같은 실패는 같은 정책으로

그래서 타임아웃도 빈 응답과 같은 재시도 예산 안에 넣었다.
최대 세 번까지 다시 부르고, 그래도 안 되면 실패한다.
단, 타임아웃과 빈 응답만 재시도하고 그 외 진짜 예외는 여전히 즉시 던진다.
아무거나 다 재시도하면 진짜 버그를 늦게 발견하기 때문이다.

여기서 한 가지 계산이 필요했다.
재시도를 무작정 늘리면 그 사이에 바깥에서 연결을 먼저 끊어 버릴 수 있다.

재시도 총시간을 바깥 한도 안에 맞춘다

타임아웃 값을 환경 변수로 빼서 기본 20초로 뒀다.
20초짜리 시도를 세 번 하면 최악의 경우 60초다.

이 60초가 중요했다.
앞단 nginx의 채팅 경로 유휴 한도가 300초라, 60초 재시도는 그 안에서 다 끝난다.
재시도가 도는 동안 nginx가 먼저 연결을 끊는 일이 없다는 뜻이다.
정상 응답에는 영향이 없다. 응답만 오면 유휴 타이머가 리셋되기 때문이다.

재현과 검증은 일부러 멈추는 더미 서버로 했다.
응답을 안 주고 버티는 서버를 세워 hang을 재현하고,
세 번까지 재시도하는지, 두 번째에 복구되면 정상으로 이어지는지 테스트로 고정했다.

정리

  • 빈 응답만 재시도하고 멈춤(타임아웃)은 즉시 실패하던 비대칭을 없앴다 — 같은 "답 없음"은 같은 정책으로
  • 타임아웃도 최대 3회 재시도, 단 그 외 예외는 즉시 던져 진짜 버그를 숨기지 않는다
  • 타임아웃을 설정값(기본 20초)으로 빼고, 20×3=60초가 앞단 nginx 300초 한도 안에 들도록 맞췄다
  • 멈추는 더미 서버로 hang을 재현해 재시도·복구를 테스트로 고정했다

재시도를 붙일 땐 "무엇을 다시 시도할지"만큼 "다시 시도하는 총시간이 바깥 한도 안에 드는지"를 같이 봐야 한다.

반응형