Graceful shutdown đảm bảo không mất data và không trả lỗi cho user khi deploy hoặc restart.
js
process.on('SIGTERM', () => {
// ngừng nhận kết nối mới, chờ kết nối đang chạy xong
server.close(async () => {
await db.disconnect()
await redis.quit()
process.exit(0)
})
})Đặt timeout khoảng 30 giây cho các request đang dở, quá hạn thì đóng cưỡng bức.
Muốn biết còn bao nhiêu request đang chạy thì đếm:
js
let connections = 0
app.use((req, res, next) => {
connections++
res.on('finish', () => connections--)
next()
})Luồng trên Kubernetes: pod bị gỡ khỏi load balancer (readiness probe fail) → preStop hook ngủ 5 giây cho LB drain traffic → app nhận SIGTERM → graceful shutdown → SIGKILL nếu vượt terminationGracePeriodSeconds (thường đặt 30).
Lưu ý: nhớ xử lý cả SIGINT cho Ctrl+C khi dev local. Trong Docker đặt STOPSIGNAL SIGTERM và viết ENTRYPOINT dạng exec (không qua shell) để process nhận signal trực tiếp.