ruby-on-rails - 如何在 Rails 中管理后台服务器池

标签 ruby-on-rails delayed-job resque sidekiq

我们的 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

Use multiple Redis servers in Sidekiq

https://stackoverflow.com/a/19540427/993592

最佳答案

我个人的偏好是 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/

相关文章:

ruby-on-rails - 延迟作业 ActiveRecord::Job Load - 每 5 秒运行一次?

ruby-on-rails - 无法将 CollectionProxy 对象传递给 ActiveJob

ruby-on-rails - 在 ubuntu 上以 root 身份运行的延迟作业进程

ruby - 在多台服务器上重新请求工作人员

ruby-on-rails - Rails Resque 工作人员因 PGError : server closed the connection unexpectedly 失败

ruby-on-rails - 如何在 Rails 5.0 的 ActiveAdmin 的列中添加多个操作?

html - 使用 Rails 难以掌握 Controller

ruby-on-rails - Resque 作业返回错误 : "No such file or directory - getcwd"

ruby-on-rails - Rails 3 复杂排序

ruby-on-rails - 如何编写带有身份验证的 Rspec Controller 测试?