有没有办法告诉Sidekiq一个任务依赖于另一个任务?

9
有没有办法告诉Sidekiq一个工作依赖于另一个工作,并且必须等到后者完成才能开始?

2
你的第一个任务不能启动依赖任务吗? - DickieBoy
不好意思,它不能以那种方式处理。 - hasrthur
2个回答

7

如果只使用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,并且可以具有正在运行、失败、完成、等待状态。 然后,依赖作业可以轻松地在状态表中检查一个或多个依赖项,并确保其所有依赖项都得到满足。

您的依赖性作业可以在状态表中查找依赖关系


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将开始工作。这使您可以将依赖关系图与工作者本身分开。 (免责声明:我是这个gem的作者。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接