Heroku rails排队mongoid
问题描述:
我需要处理一个csv
文件,其中有10,000条记录。每100条记录大约需要4秒钟,而且我很酷。
我希望能够将10,000条记录拆分为100个作业,这将在服务器不繁忙时执行(不需要订单)。Heroku rails排队mongoid
我正在与heroku合作,如果可以的话,我会很乐意将处理分发给几个节点。
这里最好的做法是什么?如何处理mongo连接?如何拆分作业,并创建将来运行的任务?
不需要一个完整的解决方案只是一些指导请。
答
我会和塞尔吉奥有同样的建议。尝试Sidekiq后台工人的宝石。有一个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宝石 - 其目的是分批来读取CSV文件,所以你可以把他们关到resque或sidekiq工人..
我可能会使用像[Sidekiq](http://mperham.github.com/sidekiq/)。不过,它需要redis。 – 2013-02-11 12:53:44