7

Beanstalkdから読み取り、ジョブを処理するPHPスクリプトを作成しました。そこに問題はありません。

私がしなければならない最後のことは、それのためのinitスクリプトを書くことです。そうすれば、それはサービスとして実行できます。

しかし、これは今私に別の質問を提起しました。サービスを停止しようとするとき、それを行うための1つの明白な方法は、プロセスを強制終了することです。ただし、これを行うと、PHPスクリプトの処理が途中で行われた場合、ジョブはどうなりますか?したがって、ジョブは予約されましたが、スクリプトが成功または失敗したことはありません(それぞれ削除または埋め込み)、どうなりますか?

私の推測では、TTRは期限切れになり、その後、準備完了キューに戻されますか?

そしてボーナス2番目の質問、PHPサービスの停止をより適切に管理する方法についてのヒントはありますか?

4

3 に答える 3

8

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

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

参照: http: //groups.google.com/group/beanstalk-talk/browse_thread/thread/232d0cac5bebe30f?hide_quotes = no#msg_efa0109e7af4672e

于 2011-11-24T18:02:10.467 に答える
4

時間切れになり、埋もれていない、またはtouch編集されていないジョブは、予約のために準備完了キューに戻ります。

スーパーバイザースクリプトとシェルスクリプトを使用してワーカーを実行する方法については、他の場所に投稿しました。ほとんどの場合、ジョブが正常に終了するので、しばらく待つことを気にしないという利点があります。ワーカースクリプトを実行するbashスクリプトを監視者に強制終了させることができます。スクリプト自体が終了すると、再起動できないため、単に終了します。

もう1つの方法は、最も優先度の高い(0)メッセージを、ワーカーがリッスンするチューブに入れることです。これにより、ワーカーは最初にメッセージを削除してから終了します。特定の戻り値(からexit($val);)をチェックするようにシェルスクリプトを設定すると、シェルスクリプトのループも終了します。

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

于 2011-11-08T19:29:00.587 に答える
0

仕事の価値が高すぎて失うことができない場合は、pcntlを使用して、仕事が終了するまで待ってから、ワーカーを再起動/シャットダウンすることもできます。私はすべての適切なpcntl信号を処理して、ジョブをチューブに戻すことができました。

于 2017-07-26T17:20:35.180 に答える