【问题标题】:How to Wait for Parallel Sidekiq Workers to All Complete Before Calling Another Method?如何在调用另一个方法之前等待并行 Sidekiq Worker 全部完成?
【发布时间】:2015-04-29 20:19:01
【问题描述】:

我有几个工作人员正在使用 Sidekiq 运行并使用 Sidetiq 进行调度。我正在寻找有关在执行回调之前等待所有工作人员完成的最佳方法的建议,类似于 Sidekiq-Pro 的批处理功能。任何关于可能选项的建议将不胜感激!

【问题讨论】:

  • 不幸的是,我发现最好的方法是“知道”一批中有多少作业,然后在它们完成(或错误)时进行计数。
  • 我为该功能收费是有原因的:它非常有用,同时构建起来也非常困难。我假设你没有预算?
  • 这是我认为我们最终会努力的一步,但在我们的 ETL 流程更加充实并且我们正在读取更多数据源/使用更多工作人员之前,这并不是 100% 必要的在这个阶段。这肯定是我们关注的问题,但在这一点上,我只是在寻找一个临时解决方案。

标签: ruby-on-rails sidekiq sidetiq


【解决方案1】:

你可以写一个方法:

def wait_for_sidekiq
  sleep(1) until Sidekiq::Workers.new.size == 0 && Sidekiq::Queue.new.size == 0
end

我还建议您首先确保作业排队:

def wait_for_queuing
  sleep(1) until Sidekiq::Queue.new.size > 0 || Sidekiq::Workers.new.size > 0
end

这是必需的,因为有时第一个方法可能会在作业排队前几毫秒执行,因此它根本不会等待。

【讨论】:

    【解决方案2】:

    对于简单的用例,您可以轮询 stats 以获取每个队列的待处理作业计数。

    因此,如果您知道所有作业都进入特定队列,并且没有其他作业从其他地方进入该队列,这就足够了。对于更高级/复杂的用例,您可以参考API source

    另一个简单的解决方案是使用基于 Redis 的计数器(因为您已经在使用 Redis)并在每个作业中使用 atomically decrement 它,并在计数达到零时使用 publish 一个事件。

    【讨论】:

      【解决方案3】:

      你应该看到这个Sidekiq-batch gem,我已经尝试过了,它就像 Sidekiq 的 Pro Batch 一样工作,而且它是免费

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多