두 종류 — Liveness = "살아있나? 죽었으면 재시작", Readiness = "트래픽 받을 준비됐나? 안 됐으면 LB에서 빼라". 두 개를 같은 endpoint 로 하면 cascading failure.
📖 핵심 개념
Liveness: 프로세스 자체. 단순. 외부 의존성 검사 X.
Readiness: 트래픽 처리 가능. DB / 캐시 / 의존 서비스 검사 OK.
Startup: 초기화 오래 걸리는 앱용. liveness 무시 기간.
💻 코드 패턴
Express 기준
letisReady=false;app.get('/healthz',(req,res)=>res.status(200).json({status:'ok'}));// liveness
app.get('/ready',async(req,res)=>{if(!isReady)returnres.status(503).json({ready: false});constchecks=awaitPromise.allSettled([pingDB(),// 1s timeout
pingRedis(),pingDownstream(),]);constfailed=checks.filter(c=>c.status==='rejected');if(failed.length>0){returnres.status(503).json({ready: false,failed: failed.length});}res.status(200).json({ready: true});});// 부팅 끝나면
asyncfunctionbootstrap() {awaitdb.connect();awaitloadCaches();awaitwarmup();isReady=true;}// graceful shutdown
process.on('SIGTERM',async()=>{isReady=false;// LB 빼지게
setTimeout(async()=>{// 진행 중 요청 처리 후 종료
awaitdb.disconnect();process.exit(0);},30_000);});