有没有办法告诉sidekiq一项工作依赖于另一项工作

时间:2013-12-10 10:56:00

标签: ruby ruby-on-rails-3 sidekiq

有没有办法告诉sidekiq一个工作依赖于另一个工作,并且在工作完成之前无法启动?

2 个答案:

答案 0 :(得分:5)

仅使用Sidekiq;答案是否定的。正如DickieBoy建议的那样,当依赖作业完成时,你应该能够开始它。这样的事情。

# app/workers/hard_worker.rb
class HardWorker
  include Sidekiq::Worker

  def perform()
    puts 'Doing hard work'
    LazyWorker.perform_async()
  end
end

# app/workers/lazy_worker.rb
class LazyWorker
  include Sidekiq::Worker

  def perform(name, count)
    puts "Guess it's time I do something"
  end
end

这里LazyWorker仅在HardWorker结束时运行;如果不总是需要,可以添加额外的逻辑;如果/需要,仍然可以直接调用LazyWorker。这应该适用于大多数(如果不是全部)用例;除了拉入其他一些宝石之外,它还是你唯一的选择。


直接从另一份工作开火不够好......

如果你做的事情不起作用,你应该考虑一个状态机。当一个工作被解雇时,它会创建一个自己的记录,可能还有一个ID,并且可能有运行,失败,完成和等待的状态。然后,依赖作业可以轻松检查状态表中的一个或多个依赖项,并确保满足所有依赖项。

你依赖的工作可以在状态表中查找依赖

答案 1 :(得分:5)

您可以使用Sidekiq Superworker定义作业依赖关系:

# config/initializers/superworkers.rb
Superworker.create(:MySuperworker, :user_id) do
  Worker1 :user_id
  Worker2 :user_id
end

# Anywhere
MySuperworker.perform_async(123)

当您运行MySuperworker时,Worker1将启动。完成后,Worker2将启动。这使您可以将依赖关系图与工作程序本身分开。 (免责声明:我是宝石的作者。)