我有一个在MongoDB上做map/reduce工作的后台工作。当用户向文档中发送更多数据时,它会踢掉在文档上运行的后台作业。如果用户发送多个请求,它将为同一文档启动多个后台作业,但实际上只需要运行一个。有没有一种方法可以防止多个重复示例?我正在考虑为每个文档创建一个队列,并确保在提交新作业之前它是空的。或者我可以设置一个与我的文档ID相同的作业ID,并在提交之前检查是否不存在?
另外,我刚刚发现了一个sidekiq-unique-jobs宝石。但文件是不存在的。这是我想要的吗?
我有一个在MongoDB上做map/reduce工作的后台工作。当用户向文档中发送更多数据时,它会踢掉在文档上运行的后台作业。如果用户发送多个请求,它将为同一文档启动多个后台作业,但实际上只需要运行一个。有没有一种方法可以防止多个重复示例?我正在考虑为每个文档创建一个队列,并确保在提交新作业之前它是空的。或者我可以设置一个与我的文档ID相同的作业ID,并在提交之前检查是否不存在?
另外,我刚刚发现了一个sidekiq-unique-jobs宝石。但文件是不存在的。这是我想要的吗?
5条答案
按热度按时间epfja78i1#
我最初的建议是为这个特定的任务使用互斥锁。但是,由于可能有多个应用服务器在运行sidekiq作业,我建议在redis级别上使用。
例如,在sidekiq worker定义中使用redis-semaphore。* 一个未经测试的例子 *:
xqk2d5yq2#
https://github.com/krasnoukhov/sidekiq-middleware
UniqueJobs为作业提供唯一性。
使用
示例工人:
o75abkj43#
https://github.com/mhenrixon/sidekiq-unique-jobs(SidekiqUniqueJobs)
w8f9ii694#
你可以这样做,假设你有所有的作业都被添加到排队桶。
上面的代码只是一个示例,但您可以根据需要对其进行调整。
Source
alen0pnh5#
创建这个类并将其作为计划作业运行(每1分钟),该作业扫描队列并删除重复。这只适用于Sidekiq。
rake任务
/lib/job_duplicated.rb