2

私は Beanstalk + Pheanstalk の中級者です。Beanstalk を使用してコア部分 (バックグラウンド プロセス) を開発しています。間違いなく優れたツールですが、私は 1 つの状況で立ち往生しています。Yii フレームワークを使用して豆の木を使用しています。

たとえば、A (Tube - A-Jobs) と B (Tube - B-Jobs) の 2 つのジョブがあり、両方とも別のチューブとワーカーの下にあるとします。B は A に依存しています。B が A の前にワーカーによって最初にフェッチされ、その上でプロセスを開始する可能性があります。その場合、A が実行されるまで B を数秒 (120 秒) 遅らせる必要があります。

私の知る限り、仕事を遅らせる直接的な方法はありません。このためには、ジョブ B を削除し、遅延時間で同じキューに戻す必要があります。ここで間違っている場合は修正してください。

現在の状況では、pheanstalk はジョブ ID とジョブ データのみを提供するため、その場合、実際のチューブ名を取得できません。以下に私のコードを貼り付けます。

$pheanstalkA = Yii::app()->beanstalk->getClient($client);
$pheanstalkA->watch('A-tube');

$pheanstalkB = Yii::app()->beanstalk->getClient($client);
$pheanstalkB->watch('B-tube');

さて、予約機能を使って何か仕事があったら、

$jobB = $pheanstalkB->reserve();

次のような出力が得られます。Beanstalk がこのジョブを取得したチューブ名を提供していないことがわかります。

Pheanstalk_Job Object
(
    [_id:Pheanstalk_Job:private] => 2
    [_data:Pheanstalk_Job:private] => Job Data ....
)

私たちが知っているように、単一のワーカーは N チューブで見ることができるので、この仕事を遅らせて同じチューブの下に置きたい場合. ジョブのチューブ名を見つけるにはどうすればよいですか?

ありがとう...

4

2 に答える 2

4

Beanstalkd はジョブ自体でジョブの元となったチューブを返しませんが、「stats-job」コマンドを使用してクエリを実行できます。

put 1 0 100 5
hello
INSERTED 10

reserve
RESERVED 10 5
hello

stats-job 10
OK 143
---
id: 10
tube: default
state: reserved
pri: 1
age: 33
delay: 0
ttr: 100
time-left: 82
reserves: 1
timeouts: 0
releases: 0
buries: 0
kicks: 0

簡単なジョブを入れて予約し (そしてジョブ ID を 10 に戻します)、id に対して「stats-job」を実行し、元のチューブとその他の情報を取得します。

Pheanstalk には、statsJob( から返されるように) ジョブに渡す機能がありますreserve

特定のジョブについて取得できないものが他にある場合は、いつでもジョブ自体にメタ情報を入れることができます。

于 2014-01-06T10:58:26.267 に答える
4

ジョブを同じキューに戻す新しい方法が見つかりましたが、遅延時間はありました。pheanstalk ライブラリのダイレクトリリース機能を利用できます。例えば

    $this->pheanstalk->release($job,$priority,$delay);

このようにして、ジョブの実際のチューブを見つける必要がなく、特に私の場合は同時実行の問題を回避できます。

ご協力いただきありがとうございます !!!

于 2014-01-16T07:13:43.070 に答える