我正在寻找创建一个自定义守护程序,它将运行各种数据库任务,例如延迟邮件和用户通知(每个通知都是通知表中的一个单独的行)。我不想使用script/runner
或rake
来执行这些任务,因为某些任务可能只需要创建一个或两个数据库行或数千行,具体取决于任务。我不希望启动ruby进程或为每个操作加载整个rails框架的开销。我计划将这个守护进程保留在内存中。
要创建这个守护进程,我想在我的ruby on rails应用程序中使用我的模型。我有许多rails插件,例如acts_as_tree
和AASM
,如果我在哪里使用模型,我将需要加载。我需要加载的一些插件是我创建的ActiveRecord :: Base上的自定义hacks。 (如果他们需要来自导轨其他部分的组件,我愿意接受删除或重新编码某些插件。)
我的问题是
如果不是个好主意
(我不习惯编写自己的SQL查询,但我必须为守护程序添加数据库约束和单独的用户以防止任何愚蠢的事故。鉴于我对配置数据库不熟悉,我想使用活动记录作为拐杖。)
答案 0 :(得分:0)
听起来您担心的是,每次需要运行任务时,您都不想花费时间或内存成本来启动rails堆栈?如果您计划让守护程序保持全时运行,正如您所说的那样,您只需守护已加载了rails堆栈的进程,并且只需支付一次加载堆栈的内存或时间相关惩罚,守护进程启动。
Async_worker是这种模式的一个很好的例子:它使用beanstalk将消息传递给一个或多个工作进程,每个工作进程只是已加载完整rails堆栈的守护进程。
执行此操作时必须注意的一件事是,您需要在部署时重新启动守护进程,以便重新加载更新的rails堆栈。我正在使用它作为一个url-shortener应用程序(我已经运行的单个异步工作进程等待访问者被重定向后保存引用数据),并且它运行良好,我只有after:deploy
capistrano任务重新启动任何异步工作程序。
答案 1 :(得分:0)
您可以加载Rails的一个方面,例如ActiveRecord,但是当您接下来时,加载整个环境的成本并不仅仅是加载ActiveRecord本身。你当然可以不包括像ActionMailer这样的方面或者其他一些方面,但是我猜你不会看到很多胜利。
我建议改为运行跑步者/控制台,就像你说你不想要而不是每次引导,尝试批量处理,这样你就可以一次做1000次而不是1次。很多使用这种风格的项目,如果你想要一些例子,一些大量邮件会浮现在脑海中。 DJ(delayed_job)通过在数据库中存储一些位来表示此代码需要在将来的某个时间点使用环境堆栈运行,但它尝试尽可能多地一起批处理以便您可以从中获胜。
另一种选择是拥有一个持久的迷你导轨应用程序,尽可能多地剥离,以便内存使用率更低,可以监听请求并在您需要时进行出价。这将是更多的内存,但引导的延迟基本上是无效的。
最后,作为事后的想法,这对Postgres来说非常有用。