我需要处理一个csv
包含 10,000 条记录的文件。每 100 条记录大约需要 4 秒,我对此很满意。
我希望能够将 10,000 条记录拆分为 100 个作业,这些作业将在服务器不忙时执行(无需订单)。
我正在使用heroku,如果可以的话,我很乐意将处理分配给几个节点。
这里的最佳做法是什么?如何处理mongo连接?如何拆分作业,并创建将来运行的任务?
不需要完整的解决方案,请提供一些指导。
我需要处理一个csv
包含 10,000 条记录的文件。每 100 条记录大约需要 4 秒,我对此很满意。
我希望能够将 10,000 条记录拆分为 100 个作业,这些作业将在服务器不忙时执行(无需订单)。
我正在使用heroku,如果可以的话,我很乐意将处理分配给几个节点。
这里的最佳做法是什么?如何处理mongo连接?如何拆分作业,并创建将来运行的任务?
不需要完整的解决方案,请提供一些指导。
我和塞尔吉奥有同样的建议。试试Sidekiq后台工作者 gem。有kiqstand中间件使它可以与 Mongoid 一起工作。
粗略的草图:
# Gemfile
gem 'kiqstand'
gem 'sidekiq'
# Procfile
web: ...
worker: bundle exec sidekiq -e $RACK_ENV -C config/sidekiq.yml
# config/sidekiq.yml
#
# Configuration file for Sidekiq.
# Options here can still be overridden by cmd line args.
---
:verbose: false
:namespace: sidekiq
:concurrency: 25
:queues:
- [often, 7]
- [default, 5]
- [seldom, 3]
# config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
# Require kiqstand middleware
config.server_middleware do |chain|
chain.add Kiqstand::Middleware
end
end
# app/workers/import_worker.rb
# The actual Sidekiq worker that performs the input
class ImportWorker
include Sidekiq::Worker
def perform(my_var)
# processing the csv
end
end
Sidekiq 和 Kiqstand 应该处理 Mongoid Mongodb 连接。为了拆分任务,您可以创建第二个工作人员来为第一个工作人员提供服务。由于发送到的参数ImportWorker.perform_async(my_var)
将被序列化并存储在 Redis 中,因此它们应该很小,在您的情况下只是一个行引用左右。
希望能给一些指点。
还可以查看 smarter_csv gem - 它旨在批量读取 CSV 文件,因此您可以将它们交给 resque 或 sidekiq 工作人员。