2017-02-15 62 views
0

我有需要在后台(滑轨5.0.1)下面的命令 -守护VS亚军VS Rake任务VS主动工作

  1. 执行的任务的列表下载一个zip文件
  2. 从中提取XML文件(平均大小约400 MB)
  3. 解析(XML引入nokogiri读者::)对符合一定的约束,如果发现,将它们添加到数据库中记录的xml文件(Postgres的)
  4. 找回一些来自数据库的电子邮件地址并发送给他们电子邮件

这需要每天完成,无需任何人工输入。现在,我正在使用Rails runner来完成所有这些工作,并使用cron('Whenever'gem)安排它。所以,正在使用'转轮'正确的方法?有没有一个减少内存密集方法我可以使用,因为前端(管理面板)将不会被访问太多?积极的工作,耙子,守护进程等如何?

+0

无论您如何安排工作,解析XML都将成为瓶颈。如果您想要更少的内存密集型方法,那么尝试找到不涉及将400mb XML文件解析到内存中的内容。 – max

+0

@max我目前正在使用Nokogiri xml读取器,它不会将xml加载到内存中,而是依次读取行,解析节点。有更好的解决方案吗?也许分裂的XML文件? – rohank

回答

1

。 rake任务只是通过rake管理工具执行的命名空间内的一堆代码

runner以非交互方式在Rails的上下文中运行Ruby代码

。另一方面守护进程是完全不同的东西比这两个,你可以在这里检查更多关于它:http://daemons.rubyforge.org/

为你的情况最好使用耙子,因为它不启动rails“除非你做到”(亚军有启动导轨)。

另一件事是耙是单线程的,所以如果你想单个任务有效地完成,你可以使用耙,如果你有多个任务,你可以使用像Sidekiq,Resque和延迟作业的工人和工具

+0

但是,当xml文件被解析时,它正在用新记录更新数据库。那么,是不是,如果我使用rake,我将不得不引导rails(生产环境)呢?我如何使用可用于更新的模型使用耙子? – rohank

+0

我不知道你的确切用例,你可能需要启动Rails,但是你也可以保留所有需要在单独作业中更新的记录(通过延迟作业或Sidekiq)。所以你的耙子任务只需要解析的时间。而排队的工作只需要进行解析 – amrdruid