2

プロジェクトでffmpeg処理ビデオにBeanstalkdメッセージキューを使用しています。私はbeanstalkdキューにpheanstalkPHPクライアントを使用しています。私の労働者は次のようになります:



...
// get latest job
$job = $this->pheanstalk->reserve();
// get the data from the job
$jobData = unserialize($job->getData());
// process job, giving a result
$result = $this->task($jobData);
if ($result) {
  // success = delete
  $this->pheanstalk->delete($job);
} else {
// failed = bury
  $this->pheanstalk->bury($job, 1024);
}
...

task()メソッドでは、次のようなsmthを使用します。


// video processing
$processVideo = 'ffmpeg -vpre libx264-max -y -i inputfile ...';
shell_exec($processVideo);
// taking screenshots from video
...

ご存知のように、ビデオ処理には長い時間がかかる場合があり、事前定義されたジョブttr(実行時間)を超える場合があります。このようにして、ジョブはタイムアウトイベントとカムバックを受け取り、再びキューに入れます。非同期処理のために、ワーカーを同時に複数回実行します。したがって、次の無料の労働者は未完成の仕事を引き受けようとします。最後に、1つのビデオファイルの下に2つ以上のプロセスがあります。私は非常に長いttrを定義できると思いますが、それは良い設計ではありません。気付いたのですが、beanstalkdにはDEADLINE_SOONイベントがあります。しかし、どうやってそれを労働者に捕まえるのか、私にはわかりません。「touch」コマンドを使用できるようにする必要があります。

何かアドバイスはありますか?

4

1 に答える 1

3

メーリングリストメッセージこのスレッドの一部)によると、' DEADLINE_SOON'メッセージは、予約要求が行われている場合にのみ、ジョブでTTRが期限切れになりそうなときに返送されます。

1つのジョブを予約し、それを処理している場合(他の多くのジョブを収集するのではなく)、期限メッセージは表示されませんが、探していません。探していた場合は、おそらくそうではありません。そもそもファイルを処理します。

TTR設定は、作業者に問題があり、問題がない場合、touchまたは作業者が引き受けた仕事に問題がある場合に、仕事で別の亀裂が発生する2番目のチャンスと考えdeleteてください。少なくとも処理にかかると予想される限りタイムアウトを設定してから、安全マージンとしてさらにタイムアウトを追加します。同じアクションを何度も何度も失敗し続けるよりも、複雑なアクションをしばらく待つ方がよいでしょう。TTRの設定が低すぎると、同じファイルを取得し続け、TTRの有効期限が切れたままになります。

于 2011-04-12T23:23:06.877 に答える