Bạn có biết?
Mỗi lần deploy, vài request "bỗng dưng" lỗi 502 — user khó chịu, bạn bối rối. Nguyên nhân: instance cũ bị kill giữa chừng — request đang xử lý dở, connection đang mở, job đang chạy… tất cả bị cắt đứt. Graceful shutdown cho ứng dụng thời gian "dọn dẹp": chờ request xong, đóng kết nối sạch, rồi mới tắt. Kết hợp với zero-downtime deploy, mỗi lần ra version mới là một lần... không ai nhận ra.
Chuyện gì xảy ra khi không graceful shutdown?
- Request đang xử lý dở → response lỗi hoặc treo mãi
- Kết nối database/Redis bị cắt đột ngột → connection leak ở phía DB
- Job queue đang chạy → mất job hoặc xử lý trùng
- WebSocket client mất kết nối không được báo
SIGTERM: tín hiệu tắt đúng cách
Khi bạn chạy pm2 reload, docker stop, hay K8s kill pod — hệ thống gửi SIGTERM (tín hiệu "xin hãy tắt"). Mặc định Node.js chết ngay. Bạn cần bắt nó và dọn dẹp:
import { createServer } from "node:http";
import { pool } from "./db.js";
import redis from "./redis.js";
const server = createServer(app);
// Bắt tín hiệu tắt
async function shutdown(signal) {
console.log(`Nhận ${signal} — bắt đầu tắt máy an toàn...`);
// 1. Báo load balancer: đừng gửi request mới nữa
// (health check tự trả fail khi server close — xem bài Monitoring)
// 2. Ngừng nhận request mới, chờ request cũ xong
server.close(async () => {
console.log();
pool.();
redis.();
.();
process.();
});
( {
.();
process.();
}, ).();
}
process.(, ());
process.(, ());
server.(, .());
0 bình luận
Đang tải bình luận...
Để lại bình luận