如何在 Rails 中管理后台服务器池

How to manage a pool of background servers in Rails

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

我个人比较喜欢 Sidekiq。我有点担心 "several hour" 工作以及如果他们中途失败会发生什么。默认情况下,Sidekiq 会尝试重新 运行 它们。你可以改变它,但你一定要仔细考虑这个场景。这当然适用于您使用的任何后台作业处理系统。恕我直言,我会尝试找到一种方法将这些大工作分解成较小的工作。即使只是 "job part 1 runs then enqueues job part 2, etc".

至于可扩展性,Sidekiq 唯一真正的限制是 Redis。请参阅此处了解一些选项:https://github.com/mperham/sidekiq/wiki/Sharding

至于负载均衡,Sidekiq是默认做的。我 运行 现在有两个 sidekiq 服务器从单个 Redis 实例中提取。每个有 25 个工人,大约有 12 个队列。效果非常好。

我曾看到 Sidekiq 工作人员在网络操作期间挂起,最终停止了 运行 的所有作业,直到用户抱怨才知道。

与 Sidekiq 相比,ConeyIsland 提供了对作业执行更多的控制,并且还使用 RabbitMQ 作为消息总线,它比 Redis 更健壮并且具有更出色的扩展功能。

您可以设置每个队列和每个作业的超时时间,配置重试行为,糟糕的作业永远不会导致 worker 挂起:它将始终继续处理其他作业。

作业中的异常会推送到您选择的通知服务,因此您会知道作业何时出错。

http://edraut.github.io/coney_island/