我如何保证两个delayed_job作业不同时运行,同时仍允许其他作业的并发?

时间:2015-02-20 18:54:40

标签: ruby-on-rails concurrency delayed-job

我有一个场景,我需要将长时间运行的作业转移到后台进程。单个工作人员的延迟工作实施起来非常简单,但随着工作的增加,工作非常非常缓慢。大部分工作都很慢,因为线程必须休眠以等待各种远程API调用,因此同时运行多个worker是一个非常明显的选择。

不幸的是,其中一些工作相互依赖。我无法同时运行属于同一标识符的两个作业。订单无关紧要,只有 一个 工作人员可以处理给定ID的工作。

我的第一个想法是命名队列,并为标识符命名队列,但标识符是动态数据。我们今天可以运行ID 1,明天运行ID 3,564849和645609,依此类推。这是太多的命名队列。给每个人一个单独的工作人员不仅可能超过可用的系统资源(并且由于他们中的大多数在任何给定时间都不会活动而非常浪费),但是因为工作人员不是从代码内部配置而是作为环境变量,我最终会得到一些疯狂的配置文件。如果这是唯一有工作要做的队列,那么创建一个理智的N个通用工作者池可能会在同一个队列中运行所有N个工作人员。

所以我需要的是一种防止共享给定ID的两个作业同时运行的方法,同时允许任意数量的作业共享ID同时运行。

0 个答案:

没有答案