我们的 Rails 应用程序有一些非常密集的后台进程,有时需要几个小时才能运行。我们正在使用 delayed_job,并会考虑转向 Resque 或 Sidekiq 的免费版本,这在这个问题的上下文中是有意义的。
对于某些作业,我们在所有处理器上达到 100% 的 CPU,目前后台处理器与 Nginx、Rails 和 Postgres 位于同一台物理服务器上。我们还预计负载会增加。
我们希望将后台处理转移到商品级批处理 VM 池中,并最好根据需要启动它们。我的想法是将执行代码提取到小应用程序中,然后将它们放到批处理虚拟机上。
我不确定的是如何对此进行编码,以及如何在不同 VM 之间对作业队列进行负载平衡。这是 delayed_job/Reqsue/Sidekiq 可以做的事情,还是我需要编写代码?
编辑
我在这个主题上找到了一些有用的链接
http://www.slideshare.net/kigster/12step-program-for-scaling-web-applications-on-postgresql
最佳答案
我个人的偏好是 Sidekiq。我会有点担心“几个小时”的工作以及如果他们在中间失败会发生什么。默认情况下,Sidekiq 会尝试重新运行它们。你可以改变它,但你一定要仔细考虑这个场景。这当然适用于您使用的任何后台作业处理系统。恕我直言,我会尝试找到一种方法将这些大工作分解成较小的工作。即使它只是“作业第 1 部分运行然后将作业第 2 部分排入队列,等等”。
至于可扩展性,Sidekiq 唯一真正的限制是 Redis。请参阅此处了解一些选项:https://github.com/mperham/sidekiq/wiki/Sharding
至于负载均衡,Sidekiq默认做的。我现在运行两个从单个 Redis 实例中提取的 sidekiq 服务器。每个有 25 个 worker ,大约有 12 个队列。效果非常好。
关于ruby-on-rails - 如何在 Rails 中管理后台服务器池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29165325/