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

art*_*sow 5 ruby ruby-on-rails-3 sidekiq

有没有办法告诉sidekiq一个工作依赖于另一个工作,直到后者完成后才能开始工作?

big*_*can 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
Run Code Online (Sandbox Code Playgroud)

这里LazyWorker仅在HardWorker结束时运行; 如果不总是需要,可以添加额外的逻辑; 如果/需要,仍然可以直接调用LazyWorker.这应该适用于大多数(如果不是全部)用例; 而对于Sidekiq来说,除非你吸引其他一些宝石,否则这是你唯一的选择.


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

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

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


Tom*_*Tom 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)
Run Code Online (Sandbox Code Playgroud)

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