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

时间:2010-09-26 16:37:43

标签: ruby-on-rails scheduled-tasks

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

我在野外看到的所有示例通常都会显示一个单独的守护程序来处理应用程序的计划任务。但是,这要求守护程序加载应用程序的环境。虽然这可以在您部署一个或两个应用程序时起作用,但在服务器上可能部署了100个应用程序时,它无法扩展。 (例如,每个“守护进程”加载整个Rails环境加上应用程序代码,可能超过50MB。部署100个应用程序,而你只是在调度程序守护进程中嚼5GB。)

有没有人解决过这个问题?

2 个答案:

答案 0 :(得分:0)

我认为答案取决于您的需求。如果这些任务需要花费很多时间,那么最简单的解决方案就是以传统的方式使用守护进程。如果你想依赖Rails堆栈,那么你必须将它加载到内存才能使用它 - 你不会逃避它。

如果您的任务不需要太多时间,那么您可以执行以下操作:使用可用的方法(如delayed_job)但定期启动和停止守护程序(有关提示,请参阅here )。因此,您可以在上午9点启动10个守护进程,并在上午10点停止它们。然后您可以再启动10个,依此类推。可以使用cron或任何类似工具启动和停止。

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

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

答案 1 :(得分:0)

我有类似的问题需要解决。我找到了这些解决方案:

  1. 在新进程中运行Cron初始化的任务
    • 缺点:新实例的启动时间
  2. 在长寿守护进程中运行任务
    • 缺点:守护进程占用记忆
  3. 在现有实例内的线程中运行任务
    • 缺点:乘客产生X实例,很难确保只运行1个实例中的1个线程。
    • 缺点:在请求 - 响应周期之外调用任何内容可能会造成乘客的泄密或不稳定。
  4. 运行由HTTP请求初始化为现有实例的任务
    • pro:没有启动时间,使用现有实例,确保单个执行,对于passanger生命周期是安全的
    • 缺点:锁定一个应用程序实例以执行任务 - 如果应用程序是线程安全但需要调查,这可能不是问题,因为线程安全在Rails中是一个很新的东西。
  5. 最后我决定使用选项4.使用cron和curl(或wget),并且只能访问localhost的CronController