Проверяет понимание graceful shutdown в Node.js и умение корректно завершать воркеры без потери данных в БД.
Когда контейнер или процесс-менеджер (Docker, Kubernetes, PM2) останавливает воркер, он посылает сигнал SIGTERM, а через некоторое время — SIGKILL. Если процесс умрёт сразу, незакоммиченные транзакции в БД откатятся, а уже начатые операции могут оставить данные в несогласованном состоянии. Graceful shutdown решает эту проблему: воркер перестаёт брать новую работу, но доводит до конца уже начатую.
let shuttingDown = false;
let activeJobs = 0;
async function handleJob(job) {
if (shuttingDown) return; // не берём новые
activeJobs++;
try {
await db.transaction(async (trx) => {
// ... работа с БД
});
} finally {
activeJobs--;
}
}
async function shutdown(signal) {
console.log(`Получен ${signal}, начинаем graceful shutdown`);
shuttingDown = true;
// ждём завершения активных задач
while (activeJobs > 0) await new Promise(r => setTimeout(r, 100));
await db.pool.end(); // закрываем пул соединений
process.exit(0);
}
process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT'));
// страховка: принудительный выход через 30 секунд
setTimeout(() => process.exit(1), 30000).unref();
Такой подход применяется в любых долгоживущих воркерах: обработчики очередей, cron-задачи, фоновые сервисы. Он гарантирует, что данные в БД останутся согласованными, а деплой или масштабирование пройдут без потерь.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию