Health Check 기반 안정적인 Shutdown 대응
현대의 소프트웨어 애플리케이션은 높은 가용성과 안정성을 유지해야 하는 요구에 직면해 있습니다. 이러한 요구를 충족하기 위해서는 Health Check 기반 안정적인 Shutdown 대응이 필수적입니다. 이 블로그 포스트에서는 애플리케이션의 안전한 종료를 보장하기 위한 다양한 전략을 탐구하고, 이를 구현하는 방법을 상세히 설명하겠습니다. 특히, 프로세스 관리자가 애플리케이션에게 SIGTERM 신호를 보내는 과정과 애플리케이션의 상태 확인 메커니즘에 대해 살펴보겠습니다. 이러한 이해를 통해, 여러분의 시스템이 어떻게 더 안정적으로 작동할 수 있을지에 대해 알아보는 좋은 기회가 될 것입니다.
하나의 애플리케이션이 배포되는 전후로, 정상적이고 원활한 종료 과정은 매우 중요합니다. 이는 성장하는 기업 환경에서 서비스의 중단을 최소화하고 사용자 경험을 향상시키기 위해서입니다. 예를 들어, 전자상거래 사이트에서는 한쪽 버전의 애플리케이션에서 업데이트가 필요한 경우 사용자에게 미치는 영향을 최소화하기 위한 전략이 필요합니다.
여기서 하늘로 우뚝 솟은 Health Check는 사용자의 요청을 안정적으로 처리하기 위해 필요한 중요한 기제입니다. 이는 사용자가 직접적으로 느끼지 못하는 부분이나, 개발자만의 고집이 아닌 우리 모두의 사용할 수 있는 응답 체계 구성 요소라 할 수 있습니다.
정상적인 종료의 중요성
소프트웨어 애플리케이션의 새 버전을 배포할 때, 이전 버전의 인스턴스를 교체해야 하는 과정에서 자연스럽게 발생하는 것이 바로 정상적인 종료입니다. 이 과정에서 프로세스 관리자는 애플리케이션에 SIGTERM 신호를 전송하여 애플리케이션에 종료될 대비를 시킵니다. 이 신호를 수신한 애플리케이션은 새로운 요청의 수락을 중단하고, 진행 중인 모든 요청을 마무리하며, 필요한 리소스를 정리합니다.
예를 들어, 사용 중인 데이터베이스 연결이나 파일 잠금을 해제하는 일은 무시할 수 없는 작업입니다. 이 단계가 원활히 이루어지지 않으면, 데이터 손실이 발생하거나 애플리케이션이 응답하지 않게 될 수도 있습니다. 이러한 이유로 전환 과정에서 발생하는 정상적인 종료는 개발자와 운영자에게 가장 중요한 관심사항 중 하나입니다.
아래의 표는 정상적인 종료 과정에서 수행해야 하는 필수 작업들을 정리한 것입니다.
| 단계 | 설명 |
|---|---|
| SIGTERM 신호 수신 | 애플리케이션이 종료 신호를 수신합니다. |
| 요청 수락 중단 | 새로운 요청을 수락하지 않습니다. |
| 진행 중인 요청 처리 | 현재 처리 중인 모든 요청을 완료합니다. |
| 리소스 정리 | 데이터베이스 연결 및 파일 잠금을 해제합니다. |
| 종료 | 애플리케이션을 안전하게 종료합니다. |
이러한 단계를 체계적으로 수행하면, 시스템의 안정성을 높이고 가용성을 유지할 수 있습니다.
Health Check의 필요성
Health Check는 애플리케이션이 정상적으로 작동하고 있는지를 판단하기 위한 메커니즘입니다. 특히 로드 밸런서는 이러한 상태 확인 기능을 통해 애플리케이션 인스턴스가 요청을 수락할 수 있는지를 점검합니다. Kubernetes와 같은 플랫폼은 이런 상태 확인을 위해 여러 가지 체크 메커니즘을 제공합니다. 예를 들어, Kubernetes는 두 가지 상태 확인 프로세스를 제공합니다: 활동성과 준비 상태입니다.
활동성 상태는 컨테이너가 다시 시작될 시기를 결정하는 데 사용됩니다. 준비 상태는 컨테이너가 트래픽을 수락할 준비가 되었는지를 결정합니다. 만약 포드가 준비되지 않으면, 해당 포드는 서비스 로드 밸런서에서 제거됩니다. 이러한 메커니즘은 애플리케이션이 비정상적으로 종료되거나 오류가 발생했을 때, 사용자에게 부정적인 영향을 최소화하기 위해 필수적입니다.
아래의 표는 Kubernetes의 상태 확인 메커니즘을 간략히 정리한 것입니다.
| 상태 | 설명 |
|---|---|
| 활동성 | 컨테이너의 정상 작동 여부를 판단합니다. |
| 준비 상태 | 컨테이너가 외부 요청을 수락할 준비가 되었는지 확인합니다. |
| 서비스 로드 밸런서에서 제거 | 포드가 준비되지 않을 경우, 즉시 서비스에서 제거됩니다. |
이러한 철저한 상태 확인은 사용자의 경험을 보호하고 시스템의 가용성을 극대화하는 데 기여합니다.
Terminus를 통한 Shutdown 대응
Terminus는 Open Source 프로젝트로, 정상적인 종료와 상태 확인을 애플리케이션에 쉽게 추가할 수 있도록 돕는 라이브러리입니다. 이를 통해 개발자는 복잡한 코드를 작성하지 않고도 애플리케이션의 정상 종료 목적을 달성할 수 있습니다. Terminus를 사용하면 상태 확인과 종료 논리를 명확하게 분리할 수 있습니다.
javascript
const http = require(http);
const express = require(express);
const { createTerminus } = require(@godaddy/terminus);
const app = express();
app.get(/, (req, res) => {
res.send(ok);
});
const server = http.createServer(app);
function onSignal() {
console.log(server is starting cleanup);
// 데이터베이스 또는 파일 시스템과 같은 리소스 정리 시작
}
async function onHealthCheck() {
// 시스템의 건강 상태를 체크합니다.
// 건강하면 resolve, 아니면 reject
}
createTerminus(server, {
signal: SIGINT,
healthChecks: { /healthcheck: onHealthCheck },
onSignal,
});
server.listen(3000);
위의 코드 예시는 Terminus를 통해 애플리케이션의 상태 확인과 정상 종료 로직을 구현하는 방법을 보여줍니다. 사용자는 /healthcheck 엔드포인트에 요청을 통해 애플리케이션의 상태를 신속하게 확인할 수 있으며, 서버가 종료 시에도 부드럽게 리소스를 해제하는 과정을 거칩니다.
Lightship을 활용한 Health Check
Lightship은 애플리케이션의 상태, 준비 및 활성 검사를 추가하는 Open Source 프로젝트로, 독립적인 HTTP 서비스를 통해 작동합니다. Lightship의 주 기능은 애플리케이션의 외부 노출 없이 health-check를 지원하는 것입니다. 이를 통해 사용자는 HTTP 요청을 통해 시스템의 상태를 모니터링할 수 있습니다.
javascript
const http = require(http);
const express = require(express);
const { createLightship } = require(lightship);
const lightship = createLightship();
const app = express();
app.get(/, (req, res) => {
res.send(ok);
});
app.listen(3000, () => {
lightship.signalReady();
});
// 서비스가 준비되지 않았음을 알리는 방법
// lightship.signalNotReady();
위의 예시는 Lightship을 사용하여 애플리케이션의 상태를 관리하는 방법을 보여줍니다. Lightship은 별도의 HTTP 서비스로 작동하여 애플리케이션의 종료 단계에서 발생할 수 있는 문제를 최소화할 수 있도록 도와줍니다.
결론
이번 포스트에서는 Health Check 기반 안정적인 Shutdown 대응의 중요성과 여러 도구를 통해 이를 구현하는 방법을 살펴보았습니다. 건강한 상태 확인과 정상 종료는 애플리케이션의 가용성 및 안정성을 확보하는 데 필수적입니다. Terminus와 Lightship과 같은 도구들은 개발자가 복잡한 로직을 손쉽게 구현할 수 있도록 지원함으로써, 신뢰성 높은 서비스를 제공할 수 있게 합니다.
따라서 개발자와 운영자는 이를 통해 강력한 상태 체크 및 안전한 종료 메커니즘을 구현하여, 더 큰 비즈니스 가치를 창출할 수 있습니다. 여러분의 프로젝트에 이러한 솔루션을 적용해 보시기를 권장합니다.
자주 묻는 질문과 답변
Q1: Health Check란 무엇인가요?
답변1: Health Check는 애플리케이션의 정상 작동 여부를 확인하기 위한 검사로, 주로 로드 밸런서가 사용합니다.
Q2: 정상적인 종료는 왜 중요한가요?
답변2: 정상적인 종료는 진행 중인 요청을 안전하게 처리하고 리소스를 정리하여 데이터 손실을 방지합니다.
Q3: Terminus는 무엇인가요?
답변3: Terminus는 애플리케이션에 상태 확인 및 정상적인 종료 기능을 추가하는 Open Source 라이브러리입니다.
Q4: Lightship은 어떤 기능을 제공하나요?
답변4: Lightship은 애플리케이션의 준비 상태와 경과를 모니터링하는 기능을 제공하며, 독립적으로 HTTP 서비스를 통해 작동합니다.
Health Check 기반 안정적인 Shutdown 대응: 시스템 안정성을 높이는 방법!
Health Check 기반 안정적인 Shutdown 대응: 시스템 안정성을 높이는 방법!
Health Check 기반 안정적인 Shutdown 대응: 시스템 안정성을 높이는 방법!