1

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

为了创建这个守护进程,我想使用我的 ruby​​ on rails 应用程序中的模型。我有许多 Rails 插件,acts_as_tree如果AASM我在哪里使用模型,我需要加载它们。我需要加载的一些插件是我创建的 ActiveRecord::Base 上的自定义 hack。(如果他们需要来自 rails 其他部分的组件,我愿意接受删除或重新编码一些插件。)

我的问题是

  • 这是一个好主意吗?
  • 并且 - 这是否可能以一种不需要我手动将每个文件包含在我的模型和插件中的方式来完成?

如果不是个好主意

  • 什么是好的选择?

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

4

2 回答 2

0

听起来您担心的是您不想在每次需要运行任务时都支付时间或内存成本来启动 rails 堆栈?如果您打算让守护程序全时运行,如您所说,您可以只守护一个已加载您的 rails 堆栈的进程,并且只需为加载一次堆栈支付与内存或时间相关的惩罚,当守护进程启动。

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

执行此操作时需要注意的一件事是,您需要在部署时重新启动守护进程,以便它们可以重新加载更新的 rails 堆栈。我将它用于 url-shortener 应用程序(我运行的单个异步工作进程在访客被重定向后等待保存推荐数据),它运行良好,我只有一个after:deploycapistrano 任务可以重新启动任何异步工作(s)。

于 2009-11-18T20:49:43.757 回答
0

您可以加载 Rails 的一个方面,例如 ActiveRecord,但是当您真正开始使用它时,加载整个环境的成本并不仅仅是加载 ActiveRecord 本身。您当然可以不包括 ActionMailer 之类的方面或一些附带信息,但我猜您不会从中获得太多胜利。

相反,我建议要么像您说的那样通过运行器/控制台运行,而不是每次都引导,而是尝试批量处理,以便一次执行 1000 个而不是 1 个。有很多在使用这种风格的项目中,如果您需要示例,您会想到一些批量邮件。DJ (delayed_job) 通过在数据库中存储一些信息来表示此代码需要在将来的某个时间使用环境堆栈运行,但它会尝试尽可能多地一起批处理,这样您可能会从中受益。

另一种选择是拥有一个持久的迷你轨道应用程序,尽可能多地剥离,以便内存使用率更低,它可以监听请求并在你想要的时候进行竞标。这将是更多的内存,但引导的延迟将基本上无效。

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

于 2009-11-18T20:50:15.653 回答