2

複数のワーカーを介してユーザー固有のデータを処理する Gearman キューがあります。特定のユーザーが一度に複数のワーカーを占有することは望ましくありません。

process_user_data() という名前のキューがあり、W1、W2、W3、W4 の 4 つのワーカーを実行するとします。Userid 1 が 10 個のジョブを送信するとき、W1 だけがそれを処理するようにします。W2-W4 はジョブを選択しないでください。

これはギアマンでできますか?

4

2 に答える 2

1

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
}
}
于 2012-04-24T14:16:14.763 に答える
0

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?

于 2012-04-21T12:21:29.177 に答える