如何防止类似队列同时来自 运行?
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 可以发出新请求。
我们目前在 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 可以发出新请求。