OpenAI API 스트리밍 응답 처리 중 연결 끊김 문제 해결
문제 상황
사내 챗봇 서비스에 OpenAI API를 연동하면서 스트리밍 방식으로 응답을 받도록 구현했다. 로컬 환경에서는 문제없었으나 프로덕션 배포 후 간헐적으로 응답이 중간에 끊기는 현상이 발생했다.
const response = await openai.chat.completions.create({
model: 'gpt-4',
messages: messages,
stream: true,
});
원인 분석
로그를 확인한 결과 약 30초 이상 응답이 지속될 때 연결이 끊어지는 패턴을 발견했다. AWS ALB의 기본 idle timeout이 60초인데, 스트리밍 중 데이터가 일시적으로 끊기면 타임아웃으로 판단하는 것으로 추정했다.
해결 방법
- 타임아웃 설정 명시
const response = await openai.chat.completions.create({
model: 'gpt-4',
messages: messages,
stream: true,
timeout: 120000, // 2분
});
- 스트림 에러 핸들링
for await (const chunk of response) {
try {
const content = chunk.choices[0]?.delta?.content;
if (content) {
res.write(`data: ${JSON.stringify({ content })}
`);
}
} catch (error) {
console.error('Stream chunk error:', error);
break;
}
}
- Keep-alive 헤더 추가
Express 응답에 Connection: keep-alive 헤더를 명시적으로 추가해 중간 프록시들이 연결을 유지하도록 했다.
res.setHeader('Connection', 'keep-alive');
res.setHeader('Cache-Control', 'no-cache');
결과
배포 후 일주일간 모니터링 결과 연결 끊김 현상이 사라졌다. 긴 응답이 필요한 경우에도 안정적으로 스트리밍이 완료되는 것을 확인했다.