Постепенное завершение работы узла - уничтожать неактивные соединения keepAlive, но выполнять текущие запросы - PullRequest
0 голосов
/ 02 апреля 2019

Я изо всех сил пытаюсь осуществить изящное завершение работы в NodeJS.

Мое определение грациозно: после получения SIGINT сервер прекращает принимать новые соединения, завершает все активные запросы, затем немедленно убивает все соединения keepalive и процесс завершается.

const express = require('express');
// const enableDestroy = require('server-destroy'); // approach 2
const app = express();
const port = 5000;

app.get('/', (req, res) => {
    setTimeout(() => { 
        res.send('Hello World!')        
        // req.connection.destroy(); // approach 3
    }, 5000)    
});

const server = require('http').createServer(app)
server.listen(port, () => console.log(`HelloWorld listening on port ${port}`))

// enableDestroy(server) // approach 2

process.on('SIGINT', () => {
  console.log('\nSIGINT received...')
  // server.destroy() // approach 2
  server.close(() => { console.log('Successfully closed all connections!') })  
});

Как проверить: Запустите сценарий выше, нажмите http://localhost:5000/ в браузере, завершите сценарий выше, используя CTRL + C, пока запрос еще выполняется.Ожидаемое поведение: запрос обслужен, скрипт завершается, как только он обслужен.

Попытка:

  1. godaddy / terminus Результат: делаетничто не убивает соединения keepalive, server.close занимает вечно (по-видимому, 120 секунд - значение времени ожидания запроса по умолчанию).
  2. server-destroy (я прокомментировал точные строки). Результат : убивает текущие запросы, server.close () мгновен, но запрос не выполняется.
  3. вызывает req.connection.destroy () после каждого подключения (я прокомментировалточная линия). Результат : ничего не делает, server.close () длится вечно (120 секунд).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...