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


Gearman: Restrict workers from picking jobs based on some input params

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

假设我有一个名为 process_user_data() 的队列,我运行 4 个工作线程 W1、W2、W3、W4当用户 ID 1 提交 10 个作业时,我只希望 W1 处理它。W2-W4 不应该选择工作。

这在齿轮工中能做到吗?

No Gearman 本身不支持此功能。我相信最简单的方法是为函数添加前缀/后缀以指示它们所属的用户。例如:用户 1 作业应该提交给 process_data_1(),并且工作人员 1 将连接到该作业而不是通用process_data()。在内部,worker仍然可以具有相同的代码库,因为这只是与Gearman服务器的钩子问题(您可以在通过命令行参数启动worker时对其进行管理):

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
}
}

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

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