有没有办法告诉sidekiq一个工作依赖于另一个工作,并且在工作完成之前无法启动?
答案 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将启动。这使您可以将依赖关系图与工作程序本身分开。 (免责声明:我是宝石的作者。)