Node.js uygulamasında graceful shutdown nasıl yapılır? SIGTERM geldiğinde neler olmalı?
Cevap
Graceful shutdown, process kapatılırken yeni istek kabul etmeyi durdurup devam eden istekleri tamamlamak ve kaynakları (DB, kuyruk bağlantıları) düzgün kapatmaktır. Kubernetes, Docker ve PM2 process'i durdururken önce SIGTERM gönderir; belirli süre (Kubernetes'te varsayılan terminationGracePeriodSeconds: 30) sonra hâlâ kapanmamışsa SIGKILL ile öldürür.
import http from "node:http";
const server = http.createServer(app);
server.listen(3000);
let shuttingDown = false;
async function shutdown(signal) {
if (shuttingDown) return;
shuttingDown = true;
console.log(`${signal} alındı, kapanıyor...`);
// 1) Readiness'i düşür: yeni trafik gelmesin
// (health endpoint shuttingDown ise 503 döner)
// 2) Yeni bağlantıları kabul etmeyi bırak, mevcutları bitir
server.close(async () => {
// 3) Kaynakları kapat
await db.end();
await queueConsumer.close();
process.exit(0);
});
server.closeIdleConnections(); // Node 18.2+: boştaki keep-alive bağlantıları kapat
// 4) Güvenlik ağı: süre aşılırsa zorla çık
setTimeout(() => process.exit(1), 25_000).unref();
}
process.on("SIGTERM", () => shutdown("SIGTERM"));
process.on("SIGINT", () => shutdown("SIGINT"));Dikkat edilecekler
- PID 1 sorunu: Docker'da
CMD npm startkullanırsanız sinyal npm'e gider ve Node'a iletilmeyebilir.CMD ["node", "server.js"](exec form) kullanın veyatini/docker run --initile çalıştırın. - Kubernetes yarışı: pod silinirken endpoint listesinden çıkarılması birkaç saniye sürebilir; bu sürede gelen istekler kaybolmasın diye kısa bir bekleme (
preStophook ilesleep 5) eklemek yaygındır. - Keep-alive bağlantıları
server.close()'un bitmesini geciktirir;closeIdleConnections()veya yanıtlaraConnection: closebaşlığı ekleyin. - Kuyruk consumer'ları: yeni mesaj almayı durdurun, işlenmekte olanları ack'leyin; yarım kalanlar zaten yeniden teslim edilir, bu yüzden handler'lar idempotent olmalıdır.
İlgili Node.js soruları
- cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
- Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?
- Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?
- Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?
- process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?
- Express.js'te middleware nedir ve nasıl çalışır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.