使用异步作业在node.js / express中正常关闭

时间:2015-03-02 09:26:41

标签: node.js express

我正在尝试使用 express 4.x http服务器在 node.js 中正常关闭。

关闭快递服务器很容易,但让我担心的是我们有很多异步工作。流程示例:

  1. 接收请求
  2. 做一些事情
  3. 将回复发送回客户
  4. 在后台继续做一些与该请求相关的异步内容,比如向某个第三方服务提出另一个请求
  5. 接收第三方服务的响应并保存对数据库的响应等。
  6. 完成
  7. 所以,如果我像这样优雅地关闭代码:

    process.on('SIGTERM', function () {
        serverInstance.close(function(){
            closeConnectionToDatabases(function(){
                process.exit(0);
            })
        });
    
        // shutdown anyway after some time
        setTimeout(function(){
            process.exit(0);
        }, 8000);
    });
    

    如果SIGTERM发生在上面介绍的流程的第一步和第二步之间,我怎么能确定一切顺利?第四,第五和第六步呢?有没有什么好方法可以解决这个问题,或者仅仅是以异步方式手动监视来自您服务的所有请求并等待它们?

    谢谢, 伊万

1 个答案:

答案 0 :(得分:1)

process.exit()会立即终止node.js进程,而无需等待所有异步任务完成。

如果要真正正常关闭,则应手动关闭所有资源(所有打开的连接和文件描述符),而不是调用process.exit()。在这种情况下,node.js将在完成所有挂起的异步任务后立即终止。

因此,只需关闭所有数据库连接和其他I / O资源:

process.on('SIGTERM', function () {
    serverInstance.close(function(){
        closeConnectionToDatabases(function(){
            // now node.js should close automatically
        })
    });

    // shutdown anyway after some time
    setTimeout(function(){
        process.exit(0);
    }, 8000);
});