OpenAI API 스트리밍 응답 처리 중 연결 끊김 문제 해결

문제 상황

사내 챗봇 서비스에 OpenAI API를 연동하면서 스트리밍 방식으로 응답을 받도록 구현했다. 로컬 환경에서는 문제없었으나 프로덕션 배포 후 간헐적으로 응답이 중간에 끊기는 현상이 발생했다.

const response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: messages,
  stream: true,
});

원인 분석

로그를 확인한 결과 약 30초 이상 응답이 지속될 때 연결이 끊어지는 패턴을 발견했다. AWS ALB의 기본 idle timeout이 60초인데, 스트리밍 중 데이터가 일시적으로 끊기면 타임아웃으로 판단하는 것으로 추정했다.

해결 방법

  1. 타임아웃 설정 명시
const response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: messages,
  stream: true,
  timeout: 120000, // 2분
});
  1. 스트림 에러 핸들링
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;
  }
}
  1. Keep-alive 헤더 추가

Express 응답에 Connection: keep-alive 헤더를 명시적으로 추가해 중간 프록시들이 연결을 유지하도록 했다.

res.setHeader('Connection', 'keep-alive');
res.setHeader('Cache-Control', 'no-cache');

결과

배포 후 일주일간 모니터링 결과 연결 끊김 현상이 사라졌다. 긴 응답이 필요한 경우에도 안정적으로 스트리밍이 완료되는 것을 확인했다.