6

まだデプロイしていませんが、これを行う方法がわかりません。

多くのバックグラウンド プロセスを使用するアプリがあります。つまり、応答が送信された後でも、その応答に関連付けられた関数がバックグラウンドで実行されています。したがって、私はこのようなことをしたい:

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

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

これが正しいかどうかはわかりません。その他の仮定:

  • これらのバックグラウンド プロセスは非常に重要です。ただし、おそらく 30 秒ではなく、1 ~ 2 秒かかります。それでも、安全のために 30 秒の遅延を入れたいと思います。
  • これは、プロセスの再起動(たとえば、永遠に)とプロセスの停止の両方で機能するはずです
  • Heroku (またはその他のプロセス) が node.js に送信するシグナルは何processですか? それらを別の方法で処理する必要がありますか?
  • 別の方法で処理uncaughtExceptionしますか?

ありがとう

4

2 に答える 2

10

とった。Heroku はSIGTERMシャットダウン時にシグナルを送信します。プロセスが 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 のワーカー dyno)。

これにより、Web サーバーが解放されて可能な限り高速にユーザーにサービスを提供できるようになり、スケーリング時の制御が向上します (たとえば、3 つの Web dyno と 2 つの worker dyno を実行するなど)。

Redis の pub/sub 機能を使用して、ワーカー dyno にジョブを送信できます (または、http://learnboost.github.com/kue/などのライブラリを使用して送信します)。

このように、Web dyno が再起動/停止などした場合、保留中のバックグラウンド ジョブには影響せず、ワーカー dyno が再起動すると、保留中のジョブを消費して処理するだけなので、ジョブが失われることはありません。再起動するからです。

于 2013-02-11T09:21:11.803 に答える