使用Docker Swarm

时间:2017-09-18 06:50:38

标签: node.js docker-swarm koa2

我在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)
    })
    

1 个答案:

答案 0 :(得分:1)

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

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

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秒)。希望有所帮助。