加载Ruby on Rails的模型,而无需加载整个框架(Load Ruby on Rails mo

2019-10-18 08:20发布

我希望创建将运行各种数据库任务,如延迟邮件和用户通知(每个通知是在通知表中的单独行)定制的守护进程。 我不希望使用script/runnerrake做这些任务,因为它是可能的一些任务只需要一个或两个数据库行或数千根据任务行的创建。 我不希望启动一个Ruby进程或加载每个操作的整个Rails框架的开销。 我打算把这个守护进程在内存中全职工作。

为了创建这个守护进程,我想on Rails应用程序使用我的模型从我的红宝石。 我公司拥有一批Rails插件如acts_as_treeAASM ,我将需要加载,如果我在哪里使用这些模型。 一些我需要加载的插件的是,我已经创建了的ActiveRecord :: Base的定制黑客。 (我愿意接受删除或重新编写一些,如果他们需要从轨道的其它部分部件的插件。)

我的问题是

  • 这是一个好主意吗?
  • 而且 - 这是可能在没有我手动包括在我的模型和插件每个文件的方式呢?

如果不是一个好主意

  • 什么是一个很好的选择?

(我不是并列于做写我自己的SQL查询,但我必须添加数据库约束和一个单独的用户的守护进程,以防止任何愚蠢的意外。由于我缺乏与配置数据库的熟悉,我想用活动记录作为拐杖。)

Answer 1:

这听起来像你担心的是,你不想支付时间或内存 - 成本加速旋转的轨道堆栈每次你的任务需要运行的时间? 如果你打算保持守护运行全职,就像你说的,你可以只守护进程已加载你的Rails堆栈的过程,并且将只需要支付该内存 - 或与时间相关的处罚加载堆栈一次,当守护进程启动。

Async_worker是这种模式的一个很好的例子:它采用了魔豆将消息传递给那些已经加载了完整的轨道堆栈中的每个只守护进程的一个或多个工作进程。

你要注意这样做时,有一件事是,你需要在一个部署重新启动您的守护进程的过程中,使他们能够重新加载更新的Rails堆栈。 我用这对一个URL缩短器的应用程序(我已经运行单一异步工作进程坐在那里等待访问者被重定向后保存转诊数据),和它运作良好,我只是有一个after:deploy用于重新启动Capistrano的任务任何异步工作人员(一个或多个)。



Answer 2:

最多可装入滑轨如的ActiveRecord的一个方面,但是当你面对它时加载整个环境的成本并不比刚装的ActiveRecord本身多得多。 你可以肯定只是不包括像的ActionMailer或某些侧面位的方面,但我会猜,你不会看到太多取胜出来。

我的建议,而不是通过转轮/控制台或者运行一个像你说你不想,但不是每次都自举,尽量批量的东西,这样你在一个时间,而不是1做1000有很多的使用这种风格的项目,一些批量邮寄春天介意,如果你想的例子。 DJ(delayed_job的)不通过存储在数据库中的位说这个代码需要在使用环境栈未来的某个点上运行,但它试图批量尽可能多的在一起,因为它可以使你可能会从赢相似。

另一种选择是让尽可能多的剥离出尽可能使内存使用量低,可以监听请求,当你想要它做您的出价持久迷你Rails应用程序。 这将是更多的内存,但引导的等待时间将基本无效。

最后,在事后,这将是Postgres的一个伟大的使用。



文章来源: Load Ruby on Rails models without loading the entire framework