我有多个以Nodejs Koa
运行方式编写的微服务Docker Swarm
。
由于 Kubernetes 或 Swarm 之类的容器编排工具可以立即扩展和缩减服务,所以我有一个问题是优雅地关闭 Nodejs 服务以防止未完成的运行过程。
以下是我能想到的流程:
- 向每个工作进程发送一个 SIGNINT 信号,当缩减服务时,docker swarm 是否发送
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) })