13

再起動またはデプロイすると、失敗したキューに または のいずれかで多数の Resque ジョブが取得されResque::TermException (SIGTERM)ますResque::DirtyExit

TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10Procfileで new を使用しているため、worker 行は次のようになります。

worker:  TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake environment resque:work QUEUE=critical,high,low

resque-retryこれら2つの例外で自動再試行されると思われるものも使用していますか? しかし、そうではないようです。

だから私は2つの質問を推測します:

  1. 各ジョブで手動でレスキューしResque::TermException、これを使用してジョブを再スケジュールできます。しかし、すべてのジョブに対してこれを行うクリーンな方法はありますか? モンキーパッチも。
  2. これらを resque-retry 自動再試行すべきではありませんか? そうでない理由が何か思いつきますか?

ありがとう!

編集:すべてのジョブを 10 秒以内に完了させることは、規模的には不合理に思えます。Resque::DirtyExit 例外が実行されたときに、これらのジョブを自動的に再キューイングする方法が必要なようです。

4

4 に答える 4

1

resque ジョブの完了に 10 秒以上かかっていますか? 最初の SIGTERM が送信されてから 10 秒以内にジョブが完了する場合は、問題ありません。より速く終了するように、ジョブを小さなチャンクに分割してみてください。

また、ワーカーに次のようなジョブを再キューに入れることもできます: https://gist.github.com/mrrooijen/3719427

于 2013-04-01T16:32:05.367 に答える
1
  1. 各ジョブで Resque::TermException から手動でレスキューし、これを使用してジョブを再スケジュールできます。しかし、すべてのジョブに対してこれを行うクリーンな方法はありますか? モンキーパッチも。

Resque::DirtyExitジョブがSIGTERMシグナルで強制終了されると、例外が発生します。ここで読むことができるように、ジョブには例外をキャッチする機会がありません。

  1. これらを resque-retry 自動再試行すべきではありませんか? そうでない理由が何か思いつきますか?

なぜそうすべきでないのかわかりません。スケジューラは実行されていますか? そうでない場合rake resque:scheduler

で最近発生した問題のいくつかについて詳細なブログ記事を書きましたResque::DirtyExit。おそらく役に立つでしょう => Resque の内部構造を理解する – Resque::DirtyExit が公開されました

于 2015-03-30T18:04:28.863 に答える
1

また、信頼できる解決策を見つけることなく、しばらくの間これに苦労しました。

私が見つけたいくつかの解決策の 1 つは、Resque::DirtyExit で失敗したジョブを探し、これらの特定のジョブを再試行し、これらのジョブを失敗キューから削除するスケジュール (1 分ごとに cron ジョブ) で rake タスクを実行することです。

レーキ タスクのサンプルは次のとおりです https://gist.github.com/CharlesP/1818418754aec03403b3

この解決策は明らかに最適ではありませんが、これまでのところ、これらのジョブを再試行するために見つけた最良の解決策です。

于 2015-08-15T11:52:11.547 に答える