正确停止,等待和重置node.js heroku进程

时间:2013-02-11 07:51:55

标签: node.js heroku

我还没有部署,但我不知道该怎么做。

我有一个使用大量后台进程的应用。也就是说,即使在发送响应之后,仍然存在与在后台执行的响应相关联的功能。因此,我想做这样的事情:

var server = http.createServer(app).listen(80)

process.on('SIGINT', function () {
  server.close()
  setTimeout(function () {
    process.exit()
  }, 30000) // Wait 30 seconds before exiting
})

我不确定这是否正确。更多假设:

  • 这些后台流程至关重要。但是,它们可能需要1-2秒,而不是30秒。不过,为了安全起见,我想延迟30秒。
  • 这应该适用于重启流程(例如,永远)和停止流程
  • Heroku(或任何其他进程)通过process向node.js发送了什么信号?我是否必须以不同的方式处理它们?
  • 我会以不同的方式处理uncaughtException吗?

由于

2 个答案:

答案 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重启它时,它只会消耗挂起的作业并处理它们,所以你不要由于重新启动而失去任何工作。