mongoose 如何为koajs服务器做优雅的停止?

anauzrmj  于 9个月前  发布在  Go
关注(0)|答案(5)|浏览(123)

在expressjs中有很多优雅停止的例子,我如何在koajs中实现同样的效果?
我也想断开数据库连接
我有一个mongoose数据库连接,和2个oracle db连接(https://github.com/oracle/node-oracledb

46qrfjad

46qrfjad1#

我创建了一个npm包http-graceful-shutdownhttps://github.com/sebhildebrandt/http-graceful-shutdown)前一段时间。这与httpexpresskoa完美地工作。因为你想添加自己的清理东西,我修改了包,所以你现在可以添加自己的清理功能,所以基本上这个包会处理所有的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.....')
        }
    }
);

字符串

jbose2ul

jbose2ul2#

我已经在不同的node.js支持渠道上回答了很多次“如何终止HTTP服务器”的问题。不幸的是,我不能推荐任何现有的库,因为它们在某种程度上都是缺乏的。我已经把一个包放在一起,(我相信)它可以处理所有预期的优雅HTTP服务器终止的情况。
https://github.com/gajus/http-terminator
http-terminator的主要优点是:

  • 它不会对Node.js API进行Monkey-patch
  • 它会立即销毁所有没有附加HTTP请求的套接字
  • 它允许对正在进行的HTTP请求的套接字进行适度超时
  • 它正确处理HTTPS连接
  • 它通过设置connection:close头来通知使用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();

字符串

i7uq4tfw

i7uq4tfw3#

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

pn9klfpd

pn9klfpd4#

现代版本的node已经支持AbortController,因此不需要外部库。一个简单的例子:

const app = new Koa();
const server = http.createServer(app.callback());

const controller = new AbortController();
server.listen({
  host: 'localhost',
  port: 80,
  signal: controller.signal
});

// middleware... etc.
app.use(async (ctx) => {
  ctx.body = 'Hello World';
});

// Later, when you want to close the server.
controller.abort();

字符串

2w3rbyxf

2w3rbyxf5#

或者您可以直接访问listen函数中返回的服务器并关闭它。

import Koa from "koa";

export const createServer = async () => {
    const app = new Koa();
    const server = app.listen(3000);
    return {app, server};
}

if (require.main === module) {
    const app = createServer()
    app.server.close()
}

字符串

相关问题