ruby-on-rails - 使用 sidekiq 只执行众多重复作业之一?

标签 ruby-on-rails mongodb sidekiq

我有一个后台作业,在 MongoDB 上执行映射/归约作业。当用户向文档发送更多数据时,它会启动在文档上运行的后台作业。如果用户发送多个请求,它将启动同一文档的多个后台作业,但实际上只有一个需要运行。有没有办法可以防止多个重复实例?我正在考虑为每个文档创建一个队列,并确保在提交新作业之前它是空的。或者也许我可以以某种方式设置一个与我的文档 ID 相同的作业 ID,并在提交之前检查是否不存在?

另外,我刚刚发现了一个 sidekiq-unique-jobs gem 。但文档不存在。这符合我的要求吗?

最佳答案

我最初的建议是针对此特定作业使用互斥锁。但由于您可能有多个应用程序服务器来处理 sidekiq 作业,因此我建议在 Redis 级别进行一些操作。

例如,使用 redis-semaphore在你的 sidekiq worker 定义中。 未经测试的示例:

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

关于ruby-on-rails - 使用 sidekiq 只执行众多重复作业之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14713540/

相关文章:

ruby-on-rails - Sidekiq - 无法在 5.000 秒内获得数据库连接

ruby-on-rails - Nokogiri gem build error failed to build gem native extension on WSL with RVM

javascript - rails 上的 ruby || Jquery 和 JavaScript 库不工作

ruby-on-rails - 如何将 Wiris 插件添加到 CKEditor?

python - 我想从 MongoDB 数据中获取内部条目,但外部条目坚持我需要的数据

javascript - Mongoose:递归迭代以更新树状结构中的属性

mongodb - 何时在 Mongodb 中嵌入文档

ruby-on-rails - 在 GitLab 中发送新用户通知的问题

ruby-on-rails - Rails、Sidekiq 和 systemd 在 debian 8 上

ruby-on-rails - elasticsearch nGram/edgengram 部分匹配?