有没有办法告诉Sidekiq一个工作依赖于另一个工作,并且必须等到后者完成才能开始?
如果只使用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。 这对于大多数情况应该有效,如果不是所有情况都是如此; 并且除非您导入其他gem,否则使用Sidekiq确实是您唯一的选择。
当直接从另一个作业启动不够好时......
如果您正在进行某些操作而无法使用此方法,则应考虑使用状态机。 当启动作业时,它将创建其自身的记录,很可能包括ID,并且可以具有正在运行、失败、完成、等待状态。 然后,依赖作业可以轻松地在状态表中检查一个或多个依赖项,并确保其所有依赖项都得到满足。
您的依赖性作业可以在状态表中查找依赖关系
# config/initializers/superworkers.rb
Superworker.create(:MySuperworker, :user_id) do
Worker1 :user_id
Worker2 :user_id
end
# Anywhere
MySuperworker.perform_async(123)