我还没有部署,但我不知道该怎么做。
我有一个使用大量后台进程的应用。也就是说,即使在发送响应之后,仍然存在与在后台执行的响应相关联的功能。因此,我想做这样的事情:
var server = http.createServer(app).listen(80)
process.on('SIGINT', function () {
server.close()
setTimeout(function () {
process.exit()
}, 30000) // Wait 30 seconds before exiting
})
我不确定这是否正确。更多假设:
process
向node.js发送了什么信号?我是否必须以不同的方式处理它们?uncaughtException
吗?由于
答案 0 :(得分:10)
知道了。 Heroku在关机时发出SIGTERM
信号。如果进程在10秒内没有退出,则它会发送SIGKILL
信号。因此,以下就足够了:
process.on('SIGTERM', server.close.bind(server))
https://devcenter.heroku.com/articles/dynos#graceful-shutdown-with-sigterm
假设10秒足以让后台进程完成。
基本上,在“退出”信号前x秒发送一个“关闭”信号,你应该是好的。
答案 1 :(得分:2)
我认为您最好使用工作进程来执行这些后台作业(Heroku上的工作器dyno)。
这样既可以让您的网络服务器尽快为您的用户提供服务,也可以让您在扩展时更好地控制(例如,运行3个网络dynos和2个工作人员dynos)。
您可以使用Redis的pub / sub功能将作业提交给worker dyno(或使用库来执行此操作,例如http://learnboost.github.com/kue/)。
这样,当web dyno重启/ die / etc时......它对挂起的后台作业没有任何影响,当一个worker dyno重启它时,它只会消耗挂起的作业并处理它们,所以你不要由于重新启动而失去任何工作。