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

在不加载多个环境的情况下为多个Rails应用程序安排任务

  •  0
  • rjk  · 技术社区  · 14 年前

    在我们的服务器上,我们使用phusion passenger部署了多个rails应用程序。每个应用程序都有一组必须定期安排和运行的任务(通常的清除缓存、发送邮件等)。

    我在野外看到的所有示例通常都显示了一个单独的守护进程,用于处理应用程序的计划任务。但是,这需要守护进程加载应用程序的环境。当您部署了一个或两个应用程序时,此方法仍然有效,但当服务器上可能部署了100个应用程序时,它不会进行扩展(例如,每个“守护进程”加载一个完整的rails环境和应用程序代码,这可能远远超过50mb。部署100个应用程序,你就在调度程序守护进程中消耗了5GB。)

    有人解决了这个问题吗?

    2 回复  |  直到 14 年前
        1
  •  0
  •   klew    14 年前

    我认为答案取决于你的需要。如果这些任务需要很长时间,那么最简单的解决方案是使用daemon以传统方式执行。如果您想依赖rails堆栈,那么您必须将其加载到内存中才能使用它-您不会转义它。

    如果您的任务不需要太多时间,那么您可以这样做:使用可用的方法(例如 delayed_job )但要定期启动和停止守护进程(请参见 here 一些提示)。因此,您可以在上午9点启动10个守护进程,在上午10点停止它们,然后再启动10个守护进程,依此类推。启动和停止可以使用cron或任何类似的工具完成。

    但是,如果您的任务非常简单,并且在每个应用程序中都非常相似,那么您可以编写脚本来完成任务。例如,如果“通常清除缓存”意味着您从某些目录中删除一些文件,那么只需将其放入脚本并定期运行。发送电子邮件也可以通过脚本(ruby程序)完成。用ruby从db中获取任何数据都非常容易。所以这个程序可以定期检查 mails_queue 数据库中的表并发送电子邮件。如果你的应用程序是相似的,那么它将很容易实现。

    也许有一些现成的解决方案,但我还没听说。

        2
  •  0
  •   gertas    14 年前

    我也有类似的问题要解决。我发现这些解决方案可用:

    1. 在新进程中运行由cron初始化的任务
      • 缺点:新实例的启动时间
    2. 在长寿守护进程中运行任务
      • 缺点:守护进程占用内存
    3. 在现有实例中在线程中运行任务
      • 缺点:passenger生成x个实例,很难确保一个实例中只有一个线程运行。
      • 缺点:调用请求-响应周期之外的任何东西都可能在乘客中造成泄漏或不稳定。
    4. 将HTTP请求初始化的任务运行到现有实例
      • Pro:没有启动时间,使用现有实例,确保单个执行,安全的生命周期
      • 缺点:为任务执行时间锁定一个应用程序实例-如果应用程序是线程安全的,这可能不是问题,但需要调查,因为线程安全在rails中是很新的事情。

    最后我决定选择4。使用cron和curl(或wget),并拥有 CronController 只能由本地主机访问。