【问题标题】:Gearman: Restrict workers from picking jobs based on some input paramsGearman:根据一些输入参数限制工人选择工作
【发布时间】:2012-05-02 11:01:58
【问题描述】:

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

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

这在 gearman 中可以吗?

【问题讨论】:

  • 我仍在寻找这个问题的答案。由于这个问题是很久以前提交的,目前有没有办法在 gearman 中做到这一点?

标签: php queue jobs gearman


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。此解决方案可行,但似乎是一种解决方法。我会四处寻找其他队列服务器。您能否推荐一个具有持久性并具有基于作业类型的过滤的队列?
  • 很遗憾,我对其他队列没有太多经验。 Beanstalkd 具有可以分配给用户/工作人员的“管”,但对我来说这只是处理队列的一种奇特方式。 RabbitMQ 有可能符合您的目的的“路由键”,但我从未使用过它们,所以我不能 100% 确定。
  • 正如@Aurimas 建议的那样,RabbitMQ 中的路由键将允许您所要求的内容,您也可以通配匹配键。无论如何,我不会很快跳过他/她的建议,这可能看起来像是一个 hack,但它会很好地工作。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多