代码之家  ›  专栏  ›  技术社区  ›  epochwolf

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

  •  1
  • epochwolf  · 技术社区  · 15 年前

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

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

    我的问题是

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

    如果不是个好主意

    • 什么是好的替代方案?

    (我不适合编写自己的SQL查询,但我必须为守护程序添加数据库约束和单独的用户,以防止任何愚蠢的事故。鉴于我对配置数据库不熟悉,我希望使用active record作为支撑。)

    2 回复  |  直到 15 年前
        1
  •  0
  •   bantic    15 年前

    听起来您的担心是,您不想在每次需要运行任务时都花费时间或内存来加速rails堆栈?如您所说,如果您计划让守护程序全职运行,那么您可以对已加载rails堆栈的进程进行守护,并且只需在守护程序启动时为加载一次堆栈支付内存或时间相关的罚款。

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

    在执行此操作时,需要注意的一点是,您需要在部署时重新启动守护进程,以便它们可以重新加载更新的rails堆栈。我将其用于url缩短器应用程序(我运行的单个异步工作进程在访问者被重定向后等待保存转介数据),它运行得很好,我只有一个 after:deploy capistrano任务,用于重新启动任何异步工作进程。

        2
  •  0
  •   Chuck Vose    15 年前

    您可以加载Rails的一个方面,如ActiveRecord,但当您着手进行时,加载整个环境的成本并不仅仅是加载ActiveRecord本身。你当然可以不包括像ActionMailer这样的方面,或者一些附带的东西,但我猜你不会从中看到太多胜利。

    相反,我建议您要么像您所说的那样通过runner/console运行,而不是每次都进行引导,而是尝试批量处理,这样您就可以一次执行1000次而不是1次。有很多项目都使用这种风格,如果需要示例,您会想到一些批量邮件。DJ(delayed\u job)也做了类似的事情,它在数据库中存储了一点,表示此代码需要在将来的某个时候使用环境堆栈运行,但它会尽可能多地批处理在一起,以便您可以从中获得胜利。

    另一种选择是使用尽可能多的精简版持久化迷你rails应用程序,这样内存使用率就可以更低,这样就可以监听请求,并在需要时进行出价。这将是更多的内存,但引导的延迟将基本上为零。

    最后,事后想一想,这对Postgres来说是一个很大的用处。