【问题标题】:Sidekiq ActiveJob track spawned jobs inSidekiq ActiveJob 跟踪在
【发布时间】:2025-12-06 14:45:01
【问题描述】:

很多时候我都会有类似这样的后台工作代码。

class MyJob < ActiveJob::Base

 def perform
   User.find_in_batches.each do |batch|
     MyOtherJobToProcessBatchOfUsers.perform_later(batch)
   end
 end
end

基本上,一个工作会产生许多子工作。有没有一种简单的方法可以知道所有工作何时完成?我知道我可以在父作业中增加一个计数器,并让每个子作业减少该计数器。但正如任何试图这样做的人都会告诉你的那样,你可能会遇到一些并发症。

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails sidekiq


    【解决方案1】:

    这就是 Sidekiq Pro 的批处理功能的作用。你是对的:正确构建非常困难。我不知道任何实现它的开源库。

    https://github.com/mperham/sidekiq/wiki/Batches http://sidekiq.org/pro/

    【讨论】:

    • 感谢您的回答,迈克。我是一个巨大的sidekiq粉丝!我在想,既然当你排队工作时它会返回一个也在 redis 中的 jid,是否有可能收集所有这些 jid 并检查 redis 以查看它们是否仍在运行?不过,这可能需要保持一份工作温暖才能进行某种 redis 轮询。
    • 小崽子,在阅读了您的 wiki 之后,看起来我描述了批处理的工作原理。感谢您的帮助。
    • 一切皆有可能,只有您知道您的要求、预算和时间表。困难的部分是构建 100% 的工作时间、处理作业错误、不轮询 Redis 等的东西。