2012-04-20 4 views
2

私は、複数の作業者を介していくつかのユーザー固有のデータを処理するGearmanキューを持っています。私は特定のユーザーが一度に1人以上の作業者を占有することを望んでいません。Gearman:いくつかの入力パラメータに基づいて作業者を選択する作業を制限する

私はprocess_user_data()という名前のキューを持っていて、私は4人のワーカーW1、W2、W3、W4を実行しています。Userid 1が10個のジョブを送信すると、W1だけが処理します。 W2-W4は仕事を選ぶべきではありません。

これはギヤマンで可能ですか?

+0

私は:それは(コマンドラインパラメータを経由して労働者を起動するとき、あなたが管理できる)Gearmanサーバーへのフックの問題だけだろうとして内部的には、労働者はまだ、同じコードベースを持つことができますこれに対する答えを探しています。この質問は長い間提出されて以来、現在ギアマンでこれを行う方法はありますか? – user3288346

答えて

1

いいえ、Gearmanはこれをネイティブでサポートしていません。私は最も簡単な方法は、彼らが属しているユーザーを示すために関数に接頭辞/接尾辞を付けることだと思います。例:ユーザー1のジョブはprocess_data_1()に送信し、ワーカー1は一般的なprocess_data()ではなくそのジョブを実行します。

class Worker 

public function __construct() { 
$this->user = argv[1]; 
$this->worker = new GearmanWorker(); 
$this->worker->addServer(); 
$this->worker->addFunction("process_data_" . $this->user, array($this, 'process_data')); 
} 

public function process_data() { 
//work code 
} 
} 
+0

返事をありがとう。このソリューションは機能しますが、回避策のようです。私は他のキューサーバーを見回します。永続性を持ち、ジョブ・タイプ・ベースのフィルタリングを持つキューを提案できますか? – Nands

+0

私は残念なことに、他のキューと多くの経験がありません。 Beanstalkdには、ユーザー/作業者に割り当てることができる「チューブ」がありますが、それは単にキューを処理するための素晴らしい方法です。 RabbitMQにはあなたの目的に合った「ルートキー」がありますが、私は決してそれらを扱っていないので、100%確実ではありません。 – Aurimas

+0

@Aurimasが示唆しているように、RabbitMQのルートキーはあなたが求めているものを許可し、一致するキーをワイルドカードすることもできます。とにかく彼の提案をスキップするのはあまり速くないでしょう。ハックのように思えるかもしれませんが、うまくいくはずです。 – MatsLindh

0

ワーカーが異なるサーバー上にある場合は簡単です。クライアントにと宣言しないでください。同じサーバー上にある場合、ある範囲のポート上で、単一のマシン上でギアモードのいくつかのインスタンスを実行できると思います。 addServer(host, port)を使用して、追加しようとしている仕事/タスクが提供される可能性のある「グループ」を選択的に宣言することができます。

これが面倒な場合は、別のキューシステムを選択する必要があります。私はGearmanがジョブタイプベースのフィルタリングを許可していないことを覚えているように思えますが、私はそれが参考にされていないのではないかと心配しています。たぶん、RabbitMQやBeanStalkを見てみましょうか?

関連する問題