【问题标题】:Daemon vs Runner vs Rake Tasks vs Active JobDaemon vs Runner vs Rake Tasks vs Active Job
【发布时间】:2017-02-15 21:51:10
【问题描述】:

我有一个需要在后台(Rails 5.0.1)按以下顺序执行的任务列表-

  1. 下载 zip 文件
  2. 从中提取 xml 文件(平均大小 ~ 400 MB)
  3. 解析(Nokogiri XML::reader) xml 文件以查找满足某些约束的记录,如果找到,将它们添加到数据库 (postgres)
  4. 从数据库中检索一些电子邮件地址并向他们发送电子邮件

这需要每天都在没有任何人工输入的情况下完成。现在,我正在使用 Rails runner 来完成所有这些工作,并使用 cron ('Whenever' gem) 来安排它。那么,使用“runner”是正确的方法吗?鉴于前端(管理面板)不会被太多访问,我可以使用 内存密集型 方法吗?活跃的工作、rake、守护进程等怎么样?

【问题讨论】:

  • 无论您如何安排作业,解析 XML 都将成为瓶颈。如果您想要一种内存占用较少的方法,请尝试找到不涉及将 400mb XML 文件解析到内存中的方法。
  • @max 我目前正在使用 Nokogiri xml 阅读器,它不会将 xml 加载到内存中,而是按顺序读取行,解析节点。有更好的解决方案吗?也许拆分 xml 文件?

标签: ruby-on-rails ruby xml postgresql background-process


【解决方案1】:

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

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

。另一方面,守护进程与这两个完全不同,您可以在此处查看更多信息:http://daemons.rubyforge.org/

对于您的情况,最好使用 rake,因为“除非您成功”,否则它不会引导轨道(跑步者必须引导轨道)。

另一件事是 rake 是单线程的,所以如果你想高效地完成单个任务,你可以使用 rake,如果你有多个任务,你可以使用 Sidekiq、Resque 和 Delayed 作业等 worker 和工具

p>

【讨论】:

  • 但是在解析 xml 文件时,它也在用新记录更新数据库。所以,不是吗,如果我使用 rake,我将不得不启动 rails(生产环境)?如何将 rake 与可用于更新的模型一起使用?
  • 我不知道您的确切用例,您可能需要启动 Rails,但您也可以将所有这些需要更新的记录保存在单独的作业中(通过延迟作业或 Sidekiq)。所以你的 rake 任务只需要解析的时间。并且正在排队的作业唯一花费的时间是仅用于解析
  • 虽然使用 rake 任务,但通过活动记录访问数据库时需要 Rails 环境。所以,在这种情况下,runner 和 rake 任务是等价的。见stackoverflow.com/a/591912/921859
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多