Gearman:根据一些输入参数限制工人选择工作

时间:2012-04-20 20:48:38

标签: php queue jobs gearman

我有一个Gearman队列,它通过多个工作人员处理一些用户特定的数据。我不希望特定用户同时占用多个工作人员。

说我有一个名为process_user_data()的队列,我运行了4个工作人员W1,W2,W3,W4 当Userid 1提交10个作业时,我只希望W1处理它。 W2-W4不应该选择工作。

齿轮手是否可以使用?

2 个答案:

答案 0 :(得分: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
}
}

答案 1 :(得分:0)

如果工作人员在不同的服务器上很容易 - 只是不要在客户端中使用GearmanClient->addServer()声明它们。如果在同一台服务器上,我想你可以在一系列端口上的一台机器上运行几个gearmand实例。然后,您可以使用addServer(host, port)有选择地声明哪些“组”应该有机会获得您即将添加的作业/任务。

如果这对您来说太麻烦,那么您可能需要选择不同的排队系统。我似乎记得读过Gearman不允许基于作业类型的过滤,尽管我恐怕没有参考。也许看看RabbitMQ或BeanStalk?