1

我有多个以Nodejs Koa运行方式编写的微服务Docker Swarm

由于 Kubernetes 或 Swarm 之类的容器编排工具可以立即扩展和缩减服务,所以我有一个问题是优雅地关闭 Nodejs 服务以防止未完成的运行过程。

以下是我能想到的流程:

  1. 向每个工作进程发送一个 SIGNINT 信号,当缩减服务时,docker swarm 是否发送SIGNINT给工作人员?
  2. 工作人员负责捕捉信号,清理或释放任何已使用的资源并完成其进程,我如何停止新的 api 请求,等待任何正在运行的进程完成后再关闭?

    下面的一些代码来自参考:

    process.on('SIGINT', () => {
      const cleanUp = () => {
        // How can I clean resources like DB connections using Sequelizer
      }
    
      server.close(() => {
    
        cleanUp()
        process.exit()
      })
    
      // Force close server after 5secs, `Should I do this?`
      setTimeout((e) => {
        cleanUp()
        process.exit(1)
      }, 5000)
    })
    
4

1 回答 1

0

我创建了一个库(https://github.com/sebhildebrandt/http-graceful-shutdown),可以按照您的描述处理正常关闭。适用于 Express 和 Koa。

这个包还允许你创建函数(应该返回一个承诺)来额外清理数据库的东西,......这里有一些示例代码如何使用它:

const gracefulShutdown = require('http-graceful-shutdown');
...
server = app.listen(...);
...

// 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.....')
        }
    }
);

我个人会将最终超时时间从 5 秒增加到更高的值(10-30 秒)。希望有帮助。

于 2017-09-21T10:06:33.240 回答