Sobes.tech
Middle+

Можете ли да обясните какво е graceful shutdown и къде се прилага?

sobes.tech AI

Отговор от AI

Грациозното изключване (graceful shutdown) е процесът на правилно затваряне на приложението, който му позволява да завърши текущите операции, да освободи ресурсите и да запази състоянието си преди спиране.

Приложения на грациозното изключване:

  • Разгръщане на нови версии на приложението: Позволява плавно да се замени старата версия с новата без загуба на данни или прекъсване на потребителските сесии.
  • Планирани рестарти или техническа поддръжка: Гарантира, че всички отворени връзки ще бъдат затворени и задачите ще бъдат завършени преди спирането на услугата.
  • Реагиране на сривове или мащабиране: При намаляване на натоварването или възникване на проблеми, услугите могат да бъдат правилно спряни.

Пример за реализация в Node.js:

// process.js
const http = require('http');

const server = http.createServer((req, res) => {
  setTimeout(() => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello, World!\n');
  }, 2000); // Имитация на дълга операция
});

server.listen(3000, () => {
  console.log('Сървърът слуша на порт 3000');
});

// Обработчик за сигнал SIGTERM за грациозно изключване
process.on('SIGTERM', () => {
  console.log('Получен сигнал SIGTERM. Затваряне на сървъра...');
  server.close(() => {
    console.log('Сървърът е затворен. Излизане от процеса.');
    process.exit(0);
  });

  // Принудително затваряне след определено време, ако затварянето се забави
  setTimeout(() => {
    console.error('Принудително затваряне...');
    process.exit(1);
  }, 5000); // 5 секунди
});

В примера, при получаване на сигнала SIGTERM, сървърът спира да приема нови връзки, но позволява на вече създадените да завършат. След определеното време, ако затварянето се забави, се извършва принудително затваряне.