Heroku rails排队mongoid

问题描述:

我需要处理一个csv文件,其中有10,000条记录。每100条记录大约需要4秒钟,而且我很酷。
我希望能够将10,000条记录拆分为100个作业,这将在服务器不繁忙时执行(不需要订单)。Heroku rails排队mongoid

我正在与heroku合作,如果可以的话,我会很乐意将处理分发给几个节点。

这里最好的做法是什么?如何处理mongo连接?如何拆分作业,并创建将来运行的任务?

不需要一个完整的解决方案只是一些指导请。

+0

我可能会使用像[Sidekiq](http://mperham.github.com/sidekiq/)。不过,它需要redis。 – 2013-02-11 12:53:44

我会和塞尔吉奥有同样的建议。尝试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工人..

https://github.com/tilo/smarter_csv