2011-11-08 79 views
4

beanstalkdから読み取り、ジョブを処理するPHPスクリプトを作成しました。そこに問題はありません。beanstalkd - 予約されているが、完了したジョブはどうしますか?

私がやらなければならないのは、initスクリプトを書くだけなので、サービスとして実行できます。

しかし、これは私にとってもう一つの疑問を提起しています。サービスを停止しようとすると、それを実行する明確な方法の1つは、プロセスを強制終了することです。しかし、もし私がそうしたら、PHPスクリプトが途中で処理していたら、何が起きるでしょうか?だから、仕事は予約されていましたが、スクリプトは決して成功しなかったか、失敗しましたか(それぞれ削除または埋葬)、どうなりますか?

私の推測では、TTRは期限切れになり、レディキューに戻されますか?

また、2番目の質問には、PHPサービスをよりうまく管理するためのヒントがありますか?

答えて

3

時間外で実行され、埋め込まれていないジョブ、またはtouch edは、予約可能キューに戻って予約されます。

ワーカーを実行するためにスーパースクリプトとシェルスクリプトを使用することについてelsewhereと投稿しました。ほとんどの場合、仕事がきれいに終わるのを少し待つ気にはならないという利点があります。 supervisordにワーカースクリプトを実行するbashスクリプトを強制終了させることができます。スクリプト自体が終了したら、再起動できないため、終了します。

もう1つの方法は、作業者が聴いているチューブに最も優先度の高い(0)メッセージを入れ、作業者に最初にメッセージを削除してから終了させる方法です。私は、特定の戻り値(exit($val);)を確認するためにシェルスクリプトをセットアップし、シェルスクリプト内のループも終了します。

私はこれらの技術をBeanstalkdとAWS:SQSキューランナーにも使用しています。これは、システムで実行されている1日あたりの数百万のジョブを処理しています。

+0

回答ありがとうございましたAlister!私はすでに、作業者を終了させるために「終了」コマンドを送信できるようにしています。私のプロセスの処理がちょっと軽薄だと感じているので、おそらくスーパーバイザーを調べる価値があるでしょう! – manavo

5

ワーカープロセス(Beanstalkクライアント)がBeanstalkdとの接続を開いてジョブを予約すると、クライアントが削除/解放コマンド(または)ジョブタイムアウトを発行するまでジョブは「予約済み」状態になります。

ワーカープロセスが突然終了した場合、Beanstalkdとの接続が閉じられ、サーバーはその特定の接続を使用して予約されているすべてのジョブを直ちに解放します。

参考:あなたの仕事を失うにはあまりにも貴重である場合http://groups.google.com/group/beanstalk-talk/browse_thread/thread/232d0cac5bebe30f?hide_quotes=no#msg_efa0109e7af4672e

0

、あなたはまた、ジョブが終了するまで待機してから/シャットダウンあなたの労働者を再起動するPCNTLを使用することができます。私は管に戻って仕事を解放するためにすべての適切なpcntl信号を処理することができました。

関連する問題