我有一个后台作业,在 MongoDB 上执行映射/归约作业。当用户向文档发送更多数据时,它会启动在文档上运行的后台作业。如果用户发送多个请求,它将启动同一文档的多个后台作业,但实际上只有一个需要运行。有没有办法可以防止多个重复实例?我正在考虑为每个文档创建一个队列,并确保在提交新作业之前它是空的。或者也许我可以以某种方式设置一个与我的文档 ID 相同的作业 ID,并在提交之前检查是否不存在?
另外,我刚刚发现了一个 sidekiq-unique-jobs 宝石。但文档不存在。这能达到我想要的效果吗?
我最初的建议是针对此特定工作使用互斥体。但由于您可能有多个应用程序服务器来处理 sidekiq 作业,因此我建议在 Redis 级别进行一些操作。
例如,使用Redis信号量 https://github.com/dv/redis-semaphore在您的 sidekiq 工作人员定义中。一个未经测试的例子:
def perform
s = Redis::Semaphore.new(:map_reduce_semaphore, connection: "localhost")
# verify that this sidekiq worker is the first to reach this semaphore.
unless s.locked?
# auto-unlocks in 90 seconds. set to what is reasonable for your worker.
s.lock(90)
your_map_reduce()
s.unlock
end
end
def your_map_reduce
# ...
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)