我在Nodejs Koa
中运行Docker Swarm
编写了多个微服务。
由于像Kubernetes或Swarm这样的容器编排工具可以立即扩展和缩小服务,我有一个问题就是优雅地关闭Nodejs服务以防止未完成的运行过程。
以下是我能想到的流程:
SIGNINT
?工人有责任抓住信号,清理或释放任何信号 使用资源并完成其过程,如何停止新的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)
})
答案 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秒)。希望有所帮助。