加载Ruby on Rails模型而不加载整个框架

我正在寻找创建一个自定义守护程序,它将运行各种数据库任务,如延迟邮件和用户通知(每个通知是通知表中的一个单独的行)。 我不想使用script/runnerrake来执行这些任务,因为某些任务可能只需要根据任务创建一个或两个数据库行或数千行。 我不希望启动ruby进程或为每个操作加载整个rails框架的开销。 我计划将这个守护进程保留在内存中。

要创建这个守护进程,我想在我的ruby on rails应用程序中使用我的模型。 我有一些rails插件,例如acts_as_treeAASM ,如果我在哪里使用模型,我将需要加载。 我需要加载的一些插件是我创建的ActiveRecord :: Base上的自定义hacks。 (如果他们需要从导轨的其他部分使用组件,我愿意接受删除或重新编码某些插件。)

我的问题是

  • 这是一个好主意吗?
  • 并且 – 这是否可以通过手动包含我的模型和插件中的每个文件来实现?

如果不是一个好主意

  • 什么是好的选择?

(我不习惯编写自己的SQL查询,但我必须为守护程序添加数据库约束和单独的用户以防止任何愚蠢的事故。鉴于我对配置数据库不熟悉,我想使用活动记录作为拐杖。)

听起来您关心的是,每次需要运行任务时,您都不想花费时间或内存成本来启动rails堆栈? 如果你计划保持守护进程全时运行,正如你所说,你只需要守护已经加载了你的rails堆栈的进程,并且只需支付一次加载堆栈的内存或时间相关的惩罚,守护进程启动。

Async_worker是这种模式的一个很好的例子:它使用beanstalk将消息传递给一个或多个工作进程,每个工作进程只是已加载完整rails堆栈的守护进程。

在执行此操作时您必须注意的一件事是,您需要在部署时重新启动守护进程,以便他们可以重新加载更新的rails堆栈。 我正在使用它作为一个url-shortener应用程序(我已经运行的单个异步工作进程等待访问者被重定向后保存引用数据),并且它运行良好,我只有一个after:deploy capistrano任务重启任何异步工作者。

您可以加载Rails的一个方面,例如ActiveRecord,但是当您接下来时,加载整个环境的成本并不仅仅是加载ActiveRecord本身。 你当然可以不包括像ActionMailer这样的方面或者其他一些方面,但我猜你不会看到很多胜利。

我建议改为运行跑步者/控制台,就像你说你不想要而不是每次引导,尝试批量处理,这样你就可以一次做1000而不是1.有很多对于使用此样式的项目,如果您需要示例,可能会想到一些批量邮件程序。 DJ(delayed_job)通过在数据库中存储一些位来表示此代码需要在将来的某个时间点使用环境堆栈运行,但它尝试尽可能多地批处理以便您可以从中获得胜利。

另一种选择是使用尽可能多的剥离的持久迷你导轨应用程序,以便内存使用率更低,可以监听请求并在您需要时进行出价。 这将是更多的内存,但引导的延迟基本上是无效的。

最后,作为事后的想法,这对Postgres来说是一个很好的用途。