用于自动缩放Heroku的dynos和worker的宝石/服务

时间:2011-07-06 14:52:15

标签: ruby-on-rails-3 heroku scaling delayed-job resque

我想知道在生产环境中是否有任何好的解决方案可以在Heroku上自动调整dynos和worker(对于每个人来说可能是不同的解决方案,因为它们非常不相关)。对于这个,您/公司使用什么?

我找到了很多选项,但对于生产环境来说,它们似乎都不是很成熟。 有Heroscale,它似乎引入了一些延迟,因为它不在本地运行,我也听说过一些停机时间。对delayed_jobs进行了修改,这些修改已经很长时间没有更新,并且当前的捆绑包存在一些问题。还有一些与reque相关的替代方案,似乎没有很好地处理一些HTTP异常,导致应用程序崩溃,而其他似乎需要一个始终运行的工作程序来安排其他工作程序,并且还可能遭受一些HTTP异常问题。

好。到底。现在,使用Rails3在生产环境中自动调整Heroku的dynos和worker的用途是什么?

提前致谢。

5 个答案:

答案 0 :(得分:35)

我们前一段时间遇到过这种情况,我花了很多时间对此表示非常沮丧。我会尽力坚持突出点。有几个Heroku自动缩放解决方案乍一看似乎不错。

已经给出heroku-autoscaler的示例实际上是用于自动缩放dynos,并且几乎是唯一一个声称这样做的解决方案(并且它肯定做得不好)。大多数其他人只会为您声称自动调节工人。所以,让我们首先关注它。您将为工作人员查看的自动识别器取决于您实际使用的后台工作人员,例如delayed_jobresque。这些是人们使用的最常见的后台处理库,因此自动调节器会尝试连接其中一个。您可以使用以下内容:

其中一些在Cedar堆栈上的工作可能需要一些调整。所有这些问题都是因为它试图用自己的头发将自己拉出沼泽地。我们以雇佣员工为例(这可能是最好的一个)。它修改了delayed_job,以便工作者自己可以查看队列并在必要时启动更多工作,如果队列中没有更多的工作,工作人员将全部关闭。有几个问题:

  • 如果你想将一个工作放在将来执行的队列而不是现在,那你就不走运了。当作业进入队列时,工作人员启动,但由于将来要执行该作业,工作人员将关闭并且除非另一个作业进入队列,否则将无法启动(这是唯一提示工作人员启动的事件)< / LI>
  • 你失去了重试失败作业的能力,默认情况下这可能在delayed_job中有效,但如果多次失败,重试失败的作业需要一段时间(并且会逐渐加长),但是工作人员会关闭在这个时间延迟期间,没有任何东西可以提示他们再次启动(实质上这与第一个场景中的问题相同)

解决这个问题的方法是让一个工作人员连续运行,因此可以定期监视队列,并在必要时执行工作,甚至可以增加工作人员。但是,如果你这样做,你就不会节省任何金钱(你有一个工人每天24小时不间断地运行,并且必须为此付费),这就是heroku上自动跟踪器背后的全部前提。从本质上讲,如果您只是偶尔进行后台处理,或者您有可能失败但是重试成功的后台作业,或者您有不需要立即执行的后台作业,那么您可以使用自动缩放库使用对你有用。

这是另一种选择。编写Hirefire的人,后来将其旋转成一个webapp(Hirefire app),其实质是为你外部监控你的Heroku工人/ dynos,并在必要时启动/关闭工人dynos。这是免费的测试版,但它现在需要花钱,少于你每周7天,每天24小时运行工人的工资,但如果你偶尔只需要一些后台工作,那仍然不是微不足道的。无论哪种方式,这是唯一可行的方法,以确保您的后台作业基础设施做你想要的(好吧,并滚动你自己的解决方案,这意味着有一个像EC2实例的机器,你可以放置一些脚本,将ping你的heroku应用程序和旋转根据需要启动/关闭工作人员 - 这是一项非常重要的工作。

现在,Hirefire应用程序确实为你自动调整你的dynos,它是基于你的heroku请求队列的延迟来实现的。然而,我发现这不能很好地工作,也许如果你接近你的heroku应用程序实际存在的亚马逊数据中心(我们不是),你可能会有不同的体验。但是,对于我们来说,它不必要地旋转了一大堆dynos并且无论我调整多少设置都不会旋转它们。你可以把它归结为它从那时起它可能已经改进的事实,但这就是我的经验。

长话短说,如果你想自动调整你的工作人员,使用Hirefire应用程序,你将比你想象的节省更多的钱,但它仍然是最便宜的选择。如果你想自动调整dynos你基本上没有运气。这只是为了方便像Heroku这样的平台而使用的限制之一。

答案 1 :(得分:10)

Heroku正在推出一款名为AdeptScale的新附加组件,现在刚刚推出Beta版。

Here is the add-on page for AdeptScale

Here is the more detailed documentation for AdeptScale

Here is the form to sign up for Heroku's Beta Program

希望这对于自动扩展Heroku Dynos来说是一个强大的解决方案,因为我对目前的选项仍然不满意。

更新(2013年2月4日):我注册了Heroku的Beta程序试用这个附加组件,它对我来说非常好用。偶尔会增加流量,但大多数情况下都是我设定的最小数量的dynos。它大大减少了我的账单,并且消除了在高峰使用时间内我可能会很慢的担忧。

更新(2013年3月6日):添加了Heroku注册页面的测试版程序链接。

更新(2013年4月14日):看起来自动扩展已超出Beta版。它对我来说仍然很好。

答案 2 :(得分:3)

HireFire.io(服务,而不是开源项目)现在允许您使用New Relic指标自动扩展您的网络动态。 New Relic是一个性能监控工具,通过Heroku作为附件提供。他们有免费套餐,足以与HireFire一起使用。

您可以根据以下内容进行自动缩放:

  • 响应时间
    • 这是您在New Relic Dashboard上找到的响应时间。它是各种因素的组合,包括请求排队,数据库性能,应用层,路由器等。
  • Apdex评分
    • 这允许您根据New Relic Apdex分数进行缩放,使您能够根据用户体验/满意度进行缩放,这取决于此分数。

除此之外,我们已成为语言/框架无关。对于worker dynos,你需要做的就是在你的应用程序中的某个路径上设置一个JSON端点,它返回一个包含队列大小的非常简单的JSON字符串(我们提供方便但不是必需的宏)对于Ruby语言和对Django应用程序的一些开箱即用支持,但就像我说通过手动设置JSON端点它适用于任何语言/框架 - 这很容易)。对于web dynos,你可以使用HireFire Metric Source基本上任何语言/框架,以及上面提到的New Relic Metric Source,用于New Relic支持的语言/框架(这些是Ruby,Python,Java等常用语言) )。

免责声明:我建立了HireFire。

答案 3 :(得分:2)

我正在努力寻找一种自动调整dyno的好方法。

https://github.com/ddollar/heroku-autoscale这样做,但对其不成熟有免责声明。

答案 4 :(得分:1)

我最近写了一个名为Heroku Vector的Heroku自动缩放系统:

https://github.com/wpeterson/heroku-vector

它允许您根据不同的流量来缩放多种类型的动态。它目前支持NewRelic和Sidekiq忙线程数。随着流量上升或下降,它将向上或向下缩放动态数量。它是一个守护进程,可以在Heroku或其他地方的自己的dyno中运行。