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

时间:2015-03-20 11:20:38

标签: 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

2 个答案:

答案 0 :(得分:1)

我个人的偏好是Sidekiq。我有点担心“几个小时”的工作,如果他们在中间失败会发生什么。默认情况下,Sidekiq会尝试重新运行它们。您可以更改它,但您肯定想要考虑该方案。这当然适用于您使用的任何后台作业处理系统。恕我直言,我试图找到一种方法将这些大工作分解成更小的工作。即使它只是“工作第1部分运行然后排队第2部分工作等”。

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

对于负载平衡,Sidekiq默认执行此操作。我现在运行两个sidekiq服务器从单个Redis实例拉出来。每个工作人员25人,约有12个队列。效果非常好。

答案 1 :(得分:1)

我看到Sidekiq工作人员在网络运营期间挂起,最终阻止所有工作运行,直到用户抱怨才能知道。

ConeyIsland提供了比Sidekiq更多的对作业执行的控制,并且还使用RabbitMQ作为消息总线,它更加强大,并且具有远优于Redis的扩展功能。

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

工作中的异常会被推送到您选择的通知服务,因此您将知道工作何时变坏。

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