守护进程 vs 运行器 vs Rake 任务 vs Active Job

4

我有一系列需要在后台完成的任务(Rails 5.0.1),顺序如下:

  1. 下载zip文件
  2. 从zip文件中提取xml文件(平均大小约为400 MB)
  3. 解析(Nokogiri XML::reader)符合某些限制条件的xml文件,并将它们添加到数据库(Postgres)中
  4. 从数据库中检索一些电子邮件地址并发送电子邮件

这需要每天定时完成,没有任何人工干预。现在,我正在使用Rails runner执行所有这些操作,并使用cron('Whenever' gem)进行调度。那么,使用“runner”是正确的方法吗?如果前端(管理面板)不经常使用,是否可以使用更少内存的方法?例如Active Job、Rake、Daemons等?


无论你如何安排工作,解析XML都将成为瓶颈。如果你想采用更少的内存占用方法,那么尝试找到一些不涉及将400MB XML文件解析到内存中的东西。 - max
@max 我目前正在使用Nokogiri XML阅读器,它不会将XML加载到内存中,而是按顺序读取行并解析节点。有更好的解决方案吗?也许可以拆分XML文件? - rohank
1个回答

2

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

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

而守护程序则完全不同于这两个东西,您可以在此处了解更多信息:http://daemons.rubyforge.org/

对于您的情况,最好使用 rake,因为它不会启动 rails "除非您让它"(runner 必须启动 rails)。

另一件事是 rake 是单线程的,所以如果您想要高效地完成单个任务,可以使用 rake,如果您有多个任务,则可以利用 worker 和类似 Sidekiq、Resque 和 Delayed jobs 的工具。


但是随着xml文件的解析,它也会更新数据库中的新记录。那么,如果我使用rake,我不是仍然必须启动rails(生产环境)吗?我如何使用可用于更新的模型来运行rake? - rohank
我不知道你的确切用例,你可能需要启动Rails,但你也可以将所有需要更新的记录保留在单独的作业中(通过延迟作业或Sidekiq)。因此,rake任务仅需要解析的时间。而排队的作业只需要解析的时间。 - amrdruid
即使使用Rake任务,通过Active Record访问数据库时仍需要Rails环境。因此,在这种情况下,Runner和Rake任务是等效的。请参见https://dev59.com/XnRB5IYBdhLWcg3wiHz7#591912。 - Fumisky Wells

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接