如何防止类似队列同时来自 运行?

How can I prevent similar queues from running at the same time?

我们目前在 Laravel 中使用 Queue worker 处理一组任务。当我使用 php artisan queue:work 个作业的多个线程时,作业最终 运行 在一起(异步)。我们使用 Beanstalkd 作为队列驱动程序。

问题在于,在队列工作中,我们正在轮询一个 API,它只允许特定 agent_id 的一个并发会话。也就是说,一次只能 API 一次调用相同的 agent_id 运行。

我们考虑在 queue_name 上使用与 agent_id 匹配的筛选器启动多个 php artisan queue:work 线程,但我们有超过 500 个代理,因此我们需要 500 个线程,所以这不是理想。

是否有为每个 agent_id 实现锁定样式功能的方法,以便如果某个作业已经 运行 正在针对特定 agent_id 执行,它将把它发送回队列?或者 beanstalkd 是否有任何允许这样做的功能?

另一个选项也可以是在用户已经登录时优雅地处理来自 API 的拒绝(并将作业发送回队列)。但这可能会变得混乱并使日志混乱。

您可以 运行 只有一个能够 运行 从 API 获取作业的工人,或者使用某种外部 marshalling/lock服务。

该选项可以是内部速率限制系统,也可以是某种常见的原子锁定系统。工作人员尝试设置锁定密钥的 memcached 或 redis 服务器,只有成功设置它的代理才能处理任务。这样做的一个好处可能是,一旦 API 请求完成,您就可以解除锁定,然后在 worker 处理结果时,不同的 worker 可以发出新请求。