2012-01-15 8 views
12

の例外が発生したときやエラーが発生したときにgearmanが再試行する方法を教えてもらえますか?ギヤマンのエラー状態と再試行?

私はDjangoアプリケーションでpython gearmanクライアントを使用しています。従業員は でDjangoコマンドとして開始されています。私はこのblog postから、エラー条件からの の再試行が直接的ではなく、ワーカー側から sys.exitが必要であることを読みました。

おそらくsendFailまたはsendExceptionで再試行するように修正されましたか? またギアマンサポートは指数アルゴリズムで再試行します - たとえば、 SMTPの失敗が2,4,8,16秒後に再試行されたとしたら?

+0

sys.exit()はGearmanの悪い考えです。通常は、このようなジョブは永久に再試行されます(デーモンの起動時にジョブリトライを設定しない限り)。ジョブからのステータス/結果を返すだけで 'return stringvar'を実行してください。(例えば、DB行や実際の情報をキャッシュするなど) – RichVel

答えて

25

わたしの理解しているように、Gearmanは非常に「自分のビジネスではない」アプローチを採用しています。たとえば、労働者がクラッシュしない限り、実行された仕事には介入しません。すべての成功/失敗メッセージは、Gearmanサーバー自体ではなく、クライアントによって処理されるはずです。フォアグラウンド求人

、これはすべてのsendFail()/sendException()およびその他のsend*()がクライアントに送られ、それがジョブを再試行するか否かを決定するために、クライアント次第だということを意味します。再試行する必要がない場合があるため、これは意味があります。

バックグラウンドジョブでは、コールバックをリッスンするクライアントがないため、すべてのsend*()関数が意味を失います。その結果、送信されたメッセージはGearmanによって無視されます。ジョブが再試行される唯一の条件は、ワーカーがクラッシュしたときです(exit(XX)コマンドでエミュレートすることができます。XXはゼロ以外の値です)。これはもちろん、あなたがやりたいことではありません。なぜなら、従業員は通常、長時間実行されているプロセスであり、失敗した各ジョブの後に再起動する必要があるプロセスではないからです。

個人的に、私はsend*()関数への呼び出しを傍受してから、再試行のメカニズムを自分で実装する、デフォルトのGearmanJobクラスを拡張することでこの問題を解決しました。基本的には、すべての再試行関連データ(最大再試行回数、既に再試行された回数)をワークロードと共に渡し、すべてを自分で処理します。ちょっと面倒ですが、なぜGearmanがこのように動作するのか理解しています。すべてのアプリケーションロジックを処理できるだけです。

最後に、指数関数タイムアウト(またはそのタイムアウトのタイムアウト)を指定してジョブを再試行する機能に関すること。 Gearmanには遅延ジョブを追加する機能があります(protocol documentationにはSUBMIT_JOB_EPOCHがあります)。しかし、PHPの拡張機能についてはわかりませんが、Pythonモジュールはサポートしていないと思います。未来。しかし、現時点では機能していると分かっています。Gearmanに未処理のソケットリクエストを送信するだけで済みます(また指数部も実装する必要があります)。

ただし、this blog postは、SUBMIT_JOB_EPOCHの実装が拡張されないと主張しています。彼はnode.jsとsetTimeout()を使って動作させていますが、私は他の人がunixユーティリティatを使って同じことをするのを見てきました。いずれにせよ、Gearmanはあなたのためにそれをしません。信頼性に重​​点を置いていますが、すべてのロジックに集中できます。

+5

これは古い質問に対する答えですが、私は多くの人が苦労しているのを見てきました同じ問題を抱えています。私はそれを全面的に全面的に提供する価値があると信じています。 – Aurimas

関連する問題