我有一个Gearman队列,它通过多个工作人员处理一些用户特定的数据。我不希望特定用户同时占用多个工作人员。
说我有一个名为process_user_data()的队列,我运行了4个工作人员W1,W2,W3,W4 当Userid 1提交10个作业时,我只希望W1处理它。 W2-W4不应该选择工作。
齿轮手是否可以使用?
答案 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?