如何在不妥协的情况下导入数百万用户 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 此处出现适当的错误,并可能会单独重试这些错误,但一般解决方案不需要如此细粒度的工作人员。
我有这样的佣金任务
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 此处出现适当的错误,并可能会单独重试这些错误,但一般解决方案不需要如此细粒度的工作人员。