전체 목록
인프라Medium#310

무중단 배포를 위해 애플리케이션은 어떤 종료 절차를 지원해야 하나요?

#인프라#GracefulShutdown#배포#헬스체크

답변 포인트

새 요청 차단, 진행 중 요청 완료, 리소스 정리, 헬스체크 상태 변경을 순서대로 생각해보세요.

정답 및 해설

빠른 요약

무중단 배포를 위해 애플리케이션은 종료 신호를 받았을 때 새 요청을 받지 않고, 진행 중인 요청을 일정 시간 안에 마무리하며, DB 커넥션이나 큐 소비자 같은 리소스를 정리해야 합니다. 또한 로드 밸런서 헬스체크에서 먼저 제외되도록 readiness 상태를 조정하는 것이 중요합니다.

무중단 배포를 위해 애플리케이션은 종료 신호를 받았을 때 새 요청을 받지 않고, 진행 중인 요청을 일정 시간 안에 마무리하며, DB 커넥션이나 큐 소비자 같은 리소스를 정리해야 합니다. 또한 로드 밸런서 헬스체크에서 먼저 제외되도록 readiness 상태를 조정하는 것이 중요합니다.

핵심 개념

핵심 기준은 요청 손실을 줄이는 graceful shutdown입니다. 이 개념은 단순히 용어를 외우는 것보다, 어떤 문제를 줄이기 위해 등장했는지와 실제 코드나 운영 환경에서 어떤 trade-off를 만드는지 함께 이해하는 것이 중요합니다.

컨테이너나 프로세스가 교체될 때 바로 종료되면 사용자의 요청이 중간에 끊기거나 데이터 처리 중복이 생길 수 있습니다. 애플리케이션이 종료 신호를 이해하고 안전하게 내려가는 절차를 갖춰야 배포 품질이 좋아집니다.

동작 흐름

  1. 배포 시스템이 기존 인스턴스에 종료 신호를 보냅니다.
  2. 애플리케이션은 readiness를 실패로 바꿔 새 트래픽 유입을 막습니다.
  3. 진행 중 요청과 백그라운드 작업을 제한 시간 안에 마무리합니다.
  4. DB, 캐시, 메시지 큐 연결을 정리하고 프로세스를 종료합니다.

실제 예시

TypeScript
process.on('SIGTERM', async () => {
  server.close(async () => {
    await db.close();
    process.exit(0);
  });
});

SIGTERM을 받았을 때 HTTP 서버를 먼저 닫고 리소스를 정리하면 요청 손실 가능성을 줄일 수 있습니다.

실무에서 주의할 점

  • 종료 제한 시간이 너무 짧으면 진행 중 작업이 중간에 끊길 수 있습니다.
  • 큐 소비자는 메시지 ack 시점과 재처리 전략을 함께 설계해야 합니다.
  • 헬스체크와 로드 밸런서 drain 시간이 애플리케이션 종료 시간과 맞아야 합니다.

함께 연결해서 보면 좋은 키워드

인프라, GracefulShutdown, 배포, 헬스체크

면접에서 짚으면 좋은 포인트

  • readiness를 먼저 내리고 새 요청 유입을 막은 뒤 진행 중 작업을 drain하는 순서가 중요합니다.
  • Kubernetes의 terminationGracePeriodSeconds, preStop hook, 로드 밸런서 drain 시간이 애플리케이션 종료 시간과 맞아야 합니다.

정리

한 줄로 정리하면, 무중단 배포를 위해서는 종료 신호를 받아 새 요청을 막고 진행 중 작업을 마무리한 뒤 리소스를 정리하는 graceful shutdown이 필요합니다. 실무에서는 개념을 적용하는 조건과 적용하지 않았을 때 생기는 문제까지 함께 이해하는 것이 중요합니다.

관련 질문

같은 카테고리/태그 기준