複数のワーカーを介してユーザー固有のデータを処理する Gearman キューがあります。特定のユーザーが一度に複数のワーカーを占有することは望ましくありません。
process_user_data() という名前のキューがあり、W1、W2、W3、W4 の 4 つのワーカーを実行するとします。Userid 1 が 10 個のジョブを送信するとき、W1 だけがそれを処理するようにします。W2-W4 はジョブを選択しないでください。
これはギアマンでできますか?
Gearman はこれをネイティブにサポートしていません。最も簡単な方法は、関数にプレフィックス/サフィックスを付けて、関数が属するユーザーを示すことだと思います。例: ユーザー 1 のジョブは に送信する必要がprocess_data_1()
あり、ワーカー 1 はジェネリックの代わりにそれに接続しprocess_data()
ます。内部的には、Gearman サーバーへのフック (コマンド ライン パラメーターを介してワーカーを起動するときに管理できる) の問題にすぎないため、ワーカーは同じコード ベースを保持できます。
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
}
}
It's easy if the workers are on different servers - just don't declare them with GearmanClient->addServer()
in your client. If there're on the same server, I suppose you could have several instances of gearmand running on a single machine, on a range of ports. You could then use addServer(host, port)
to selectively declare which 'groups' should stand a chance of being offered the job/task you're just about to add.
If that's too messy for you, then you may need to choose a different queueing system. I seem to remember reading the Gearman doesn't allow for job-type based filtering, though I'm afraid I don't have a reference for that. Maybe look at RabbitMQ or BeanStalk?