如何在不妥协的情况下导入数百万用户 sidekiq

how to import millions of users without compromise sidekiq

我有这样的佣金任务

task import_all: :environment do
  Person.find_each do |p|
    UserWorker.perform_async(p.to_global_id)
  end
end

每个用户在 Sidekiq 上创造了大约 20 个新工作,这 20 个工作还创造了 4 或 5 个新工作。
结果我有 98 万用户,我的 Redis 使用了 CPU 的近 70%,排队超过 700 万个工作!
如何在不妥协的情况下导入所有这些用户 CPU/Mem?

您正在为每个 Person 生成一个后台工作程序,为什么不生成一个?

# some rakefile I'm guessing?
task import_all: :environment do
  UserWorker.perform_async
end

# UserWorker.rb
class UserWorker
  include Sidekiq::Worker
  def perform
    Person.find_each do |p|
      # whatever you were doing in here before...
    end
  end
end

除非你有一个大规模并行的后端,否则将工作分解为单个工作人员并没有多大优势。您会希望 handle/log 此处出现适当的错误,并可能会单独重试这些错误,但一般解决方案不需要如此细粒度的工作人员。