WEBBOOK CHAPTER

NestJS 11, 시작부터 런칭까지: 40장. Container와 graceful shutdown을 실제로 시험한다

40장. Container와 graceful shutdown을 실제로 시험한다

multi-stage build는 compile stage와 production dependency stage를 나누고 lockfile 기반 npm ci를 사용한다. runtime은 non-root, 최소 쓰기 경로, 필요한 CA와 timezone data를 갖는다. source map·dev tool·secret이 layer에 남지 않았는지 image history와 scan으로 본다. tag 외에 digest와 SBOM을 release에 기록한다.

SIGTERM을 받으면 readiness를 내리고 API 신규 요청과 queue intake를 중단한다. 진행 중 transaction과 job을 정해진 timeout 안에 마치고 lease를 반환하며 WebSocket client에 reconnect를 유도한다. telemetry를 flush한 뒤 exit한다. 강제 kill 시에도 DB와 consumer idempotency가 복구해야 한다.


async function bootstrap() {
  const app = await NestFactory.create(AppModule)
  app.enableShutdownHooks()
  await app.listen(process.env.PORT ?? 3000)
}

실습은 HTTP 배정 중, queue 알림 중, WebSocket 연결 중 각각 container를 종료한다. 결과는 process exit 0만이 아니라 Assignment·Outbox·provider receipt 중복 0, 누락 0, client 재동기화다.