6

我还没有部署,但我不确定如何执行此操作。

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

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(或任何其他进程)通过什么信号发送到 node.js process?我必须以不同的方式处理它们吗?
  • 我会以uncaughtException不同的方式处理吗?

谢谢

4

2 回答 2

10

知道了。SIGTERMHeroku在关闭时发送一个信号。如果进程在 10 秒内没有退出,那么它会发送一个SIGKILL信号。因此,以下内容就足够了:

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

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

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

基本上,在“退出”信号之前 x 秒发送一个“关闭”信号,你应该会很好。

于 2013-04-30T03:16:05.083 回答
2

我认为您最好使用工作进程来完成这些后台工作(Heroku 上的工作人员测功机)。

这既可以释放您的 Web 服务器以尽可能快地为您的用户提供服务,也可以让您在扩展时更好地控制(例如,运行 3 个 web dynos 和 2 个 worker dynos)。

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

这样,当网络测功机重新启动/死亡/等时,它对待处理的后台作业没有任何影响,当工作人员测功机重新启动时,它只会消耗待处理的作业并处理它们,因此您不会丢失任何作业因为重启。

于 2013-02-11T09:21:11.803 回答