← 글 목록
💡 관련 위키 주제:backend-system-reliability→

백엔드 서버의 Graceful shutdown 전략

서버 종료 시 HTTP 요청과 메시지 큐의 데이터 유실 및 중복 처리를 방지하기 위한 안전한 종료 절차와 기술적 고려 사항을 다룹니다.

서버 종료 시 처리 중인 작업 살펴보기

Graceful shutdown은 서버를 종료할 때 진행 중인 작업을 안전하게 마무리하는 과정입니다. 종료 제한 시간을 넘기거나 작업이 도중에 중단되면 유실 또는 중복 처리 문제가 생길 수 있습니다.

종료 절차를 살펴볼 때는 HTTP 요청과 메시지 소비를 구분해야 합니다. 각각 완료를 판단하는 방식과 재시도 정책이 다르기 때문입니다.

HTTP 요청: 유입 차단과 처리 대기

HTTP 서버에서는 새 요청의 유입을 막고, 이미 처리 중인 요청이 끝날 시간을 확보해야 합니다. 진행 중인 요청이 마무리되기를 기다리는 과정을 드레인(drain)이라고 합니다.

함께 확인할 항목은 다음과 같습니다.

Kafka와 SQS: 완료 처리와 재시도 정책

메시지 큐는 메시지를 가져오는 것뿐 아니라 처리 완료를 어떻게 기록하는지도 중요합니다. 확인할 항목을 시스템별로 나눌 수 있습니다.

Kafka

컨슈머의 poll 중단, 현재 작업의 처리 완료, offset commit 순서를 살펴봐야 합니다. 메시지를 처리하는 도중 서버가 종료됐을 때 오프셋 커밋이 어떤 상태로 남는지도 확인해야 합니다.

SQS

visibility timeout과 delete message 시점을 함께 살펴봐야 합니다. 처리 중 서버가 종료되거나 가시성 제한 시간이 지났을 때 해당 메시지가 어떻게 다뤄지는지 확인할 필요가 있습니다.

메시지 처리에서는 ack와 재시도 정책, DLQ 정책도 점검 대상입니다. DLQ는 처리가 실패한 메시지를 별도로 다루는 큐를 말합니다.

Kubernetes 환경에서 확인할 질문

Pod 종료 과정을 이해하려면 다음 질문을 함께 살펴보는 것이 좋습니다.

  1. SIGTERM을 받은 뒤 Pod는 어떤 순서로 종료됩니까?

  2. readiness를 먼저 내리는 이유와 새 트래픽 유입의 관계는 무엇입니까?

  3. 종료 제한 시간을 넘겼을 때 처리 중인 요청과 메시지는 어떻게 됩니까?

종료 신호를 받는 순간부터 작업을 마치는 시점까지, 각 단계의 순서와 시간 제한을 연결해서 살펴보는 것이 핵심입니다.