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

我还没有部署,但我不知道如何做到这一点。

我有一个使用了很多后台进程的应用程序。 也就是说,即使在发送响应之后,仍有与在后台执行的响应相关的function。 因此,我想要做这样的事情:

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什么不同吗?

谢谢

得到它了。 Heroku关机时发送一个SIGTERM信号。 如果进程没有在10秒内退出,那么它发送一个SIGKILL信号。 因此,以下就足够了:

 process.on('SIGTERM', server.close.bind(server)) 

https://devcenter.heroku.com/articles/dynos#graceful-shutdown-with-sigterm

假设10秒足够后台进程完成。

基本上,在“退出”信号之前x秒发送一个“closures”信号,你应该是好的。

我认为你最好使用一个工作进程来完成这些后台工作(Heroku上的worker dyno)。

这既释放您的Web服务器,以尽可能快地为您的用户服务,并允许您在扩展(例如,运行3个Web dynos和2个工人dynos)时有更好的控制。

您可以使用Redis的pub / subfunction将作业提交给工作人员dyno(或使用库来执行此操作,例如http://learnboost.github.com/kue/ )。

这样,当一个networkingdynamic重新启动/死亡/等..它没有任何影响悬而未决的后台作业,当一个工人dynamic重新启动它只会消耗待处理的作业,并处理它们,所以你不会失去任何工作因为重新启动。