【问题标题】:How to do graceful stop for koajs server?如何优雅地停止 koajs 服务器?
【发布时间】:2017-09-14 01:46:09
【问题描述】:

expressjs有很多优雅停止的例子,koajs如何实现呢?

我也想断开数据库连接

我有一个 mongoose 数据库连接和 2 个 oracle 数据库连接 (https://github.com/oracle/node-oracledb)

【问题讨论】:

  • 我建议在生产中使用pm2,它支持优雅的重新加载等。

标签: node.js oracle express mongoose koa


【解决方案1】:

我前段时间创建了一个 npm 包http-graceful-shutdown (https://github.com/sebhildebrandt/http-graceful-shutdown)。这与http、express 和koa 完美配合。由于您还想添加自己的清理内容,因此我修改了包,以便您现在可以添加自己的清理功能,该功能将在关机时调用。所以基本上这个包处理所有http关闭的事情,加上调用你的清理函数(如果在选项中提供):

const koa = require('koa');
const gracefulShutdown = require('http-graceful-shutdown');
const app = new koa();

...
server = app.listen(...); // app can be an express OR koa app
...

// your personal cleanup function - this one takes one second to complete
function cleanup() {
  return new Promise((resolve) => {
    console.log('... in cleanup')
    setTimeout(function() {
        console.log('... cleanup finished');
        resolve();
    }, 1000)       
  });
}

// this enables the graceful shutdown with advanced options
gracefulShutdown(server,
    {
        signals: 'SIGINT SIGTERM',
        timeout: 30000,
        development: false,
        onShutdown: cleanup,
        finally: function() {
            console.log('Server gracefulls shutted down.....')
        }
    }
);

【讨论】:

    【解决方案2】:

    我在不同的 支持频道上多次回答了“如何终止 HTTP 服务器”的变体。不幸的是,我不能推荐任何现有的库,因为它们以一种或另一种方式是lacking。从那以后,我已经组合了一个包,(我相信)它可以处理所有预期的优雅 HTTP 服务器终止的情况。

    https://github.com/gajus/http-terminator

    http-terminator 的主要好处是:

    • 它不会对 Node.js API 进行猴子补丁
    • 它会立即销毁所有没有附加 HTTP 请求的套接字
    • 它允许对正在进行的 HTTP 请求的套接字进行正常超时
    • 它可以正确处理 HTTPS 连接
    • 它通过设置连接来通知使用 keep-alive 的连接服务器正在关闭:关闭标头
    • 它不会终止 Node.js 进程

    与 Koa 一起使用:

    import Koa from 'koa';
    import {
      createHttpTerminator,
    } from 'http-terminator';
    
    const app = new Koa();
    
    const server = app.listen();
    
    const httpTerminator = createHttpTerminator({
      server,
    });
    
    await httpTerminator.terminate();
    
    

    【讨论】:

      【解决方案3】:

      为确保 Oracle DB 连接很好地关闭,您可以使用连接池并调用 pool.close() 并将 drainTime 设置为 0 或更大。这将使应用程序相对干净地中断当前正在使用连接的任何操作。它允许释放连接的 DB 端,而 DB 在清理自己之前等待任何超时期限到期。即使有两个连接,这也是我会考虑的解决方案,因为池很小并不重要。您可能还需要设置 Oracle Net 带外中断检测,请参阅Connections and High Availability。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        • 2019-04-05
        • 1970-01-01
        相关资源
        最近更新 更多