
부제: 빈 응답은 다시 시도하면서, 멈춤은 그냥 실패하던 문제
챗봇이 LLM(Gemini)을 호출하는데, 가끔 응답이 이상하게 온다.
하나는 빈 응답이다. 모델이 뭔가 주긴 했는데 알맹이가 없는 경우다.
이건 이미 재시도하도록 해 뒀다. 한 번 더 부르면 대개 제대로 온다.
문제는 다른 실패였다.
빈 응답은 다시, 멈춤은 그냥 실패
운영에서 Gemini가 60초 동안 응답을 안 주고 멈추는 일이 났다.
빈 응답이 아니라 아예 답이 안 오는 hang이었다.
이때는 타임아웃 예외가 곧바로 위로 던져졌다.
재시도 로직은 빈 응답만 다시 부르게 돼 있었고, 타임아웃은 그 대상이 아니었다.
그래서 한 번 멈추면 재시도 없이 채팅이 통째로 실패했다.
앞뒤가 안 맞았다.
빈 응답이든 멈춤이든 사용자 입장에선 "답이 안 온" 똑같은 상황인데,
하나는 다시 시도하고 하나는 그냥 포기하고 있었다.
같은 실패는 같은 정책으로
그래서 타임아웃도 빈 응답과 같은 재시도 예산 안에 넣었다.
최대 세 번까지 다시 부르고, 그래도 안 되면 실패한다.
단, 타임아웃과 빈 응답만 재시도하고 그 외 진짜 예외는 여전히 즉시 던진다.
아무거나 다 재시도하면 진짜 버그를 늦게 발견하기 때문이다.
여기서 한 가지 계산이 필요했다.
재시도를 무작정 늘리면 그 사이에 바깥에서 연결을 먼저 끊어 버릴 수 있다.
재시도 총시간을 바깥 한도 안에 맞춘다
타임아웃 값을 환경 변수로 빼서 기본 20초로 뒀다.
20초짜리 시도를 세 번 하면 최악의 경우 60초다.
이 60초가 중요했다.
앞단 nginx의 채팅 경로 유휴 한도가 300초라, 60초 재시도는 그 안에서 다 끝난다.
재시도가 도는 동안 nginx가 먼저 연결을 끊는 일이 없다는 뜻이다.
정상 응답에는 영향이 없다. 응답만 오면 유휴 타이머가 리셋되기 때문이다.
재현과 검증은 일부러 멈추는 더미 서버로 했다.
응답을 안 주고 버티는 서버를 세워 hang을 재현하고,
세 번까지 재시도하는지, 두 번째에 복구되면 정상으로 이어지는지 테스트로 고정했다.
정리
- 빈 응답만 재시도하고 멈춤(타임아웃)은 즉시 실패하던 비대칭을 없앴다 — 같은 "답 없음"은 같은 정책으로
- 타임아웃도 최대 3회 재시도, 단 그 외 예외는 즉시 던져 진짜 버그를 숨기지 않는다
- 타임아웃을 설정값(기본 20초)으로 빼고, 20×3=60초가 앞단 nginx 300초 한도 안에 들도록 맞췄다
- 멈추는 더미 서버로 hang을 재현해 재시도·복구를 테스트로 고정했다
재시도를 붙일 땐 "무엇을 다시 시도할지"만큼 "다시 시도하는 총시간이 바깥 한도 안에 드는지"를 같이 봐야 한다.
'AI' 카테고리의 다른 글
| [RAG] 하이브리드 검색 BM25 벡터 RRF 순위 결합 (0) | 2026.07.12 |
|---|---|
| [LLM] Gemini inline tool_code 도구 호출 합성 후처리 (0) | 2026.07.10 |
| [백엔드] 다국어 챗봇 타임존 단일 소스 LLM 컨텍스트 오염 (0) | 2026.07.09 |
| [RAG] PostgreSQL 한국어 전문검색 MeCab 형태소 분석 (1) | 2026.07.08 |
| [프롬프트] Gemini System Prompt 고정 캐싱 전략 (1) | 2026.07.01 |