为Heroku的dynos和workers提供自动扩展的宝石/服务

21

我想知道在Heroku生产环境下是否有任何适用于自动缩放dynos和workers的良好解决方案(由于它们是不相关的,所以可能需要每个问题都有一个不同的解决方案)。 关于这个问题,你/公司正在使用什么?

我找到了很多选项,但似乎没有一个真正成熟的适用于生产环境。 有Heroscale,似乎会引入一些延迟,因为它不在本地运行,并且我也听说过一些停机时间。 有改进版的delayed_jobs,但已经很长时间没有更新,而且目前的捆绑器存在一些问题。 还有一些与reque相关的替代品,似乎对某些HTTP异常处理不太好,导致应用程序崩溃,还有一些似乎需要始终运行的worker来安排其他workers,并且可能也会遇到一些HTTP异常问题。

总之,现在在Rails3上如何在Heroku的生产环境中自动缩放dynos和workers的问题上,最近都在使用什么呢?

谢谢提前。

5个回答

35

我们遇到过这个问题,我花了很多时间来解决它,但仍然感到非常沮丧。我会尽量着重说明关键点。有几个Heroku自动缩放解决方案,一开始看起来似乎不错。

已经提供的示例heroku-autoscaler实际上是用于自动缩放dynos的,而且基本上是唯一一个声称能够做到这一点的解决方案(而且它肯定做得不好)。大多数其他解决方案只会声称为您自动缩放workers。因此,让我们首先关注这一点。您将查看的自动缩放程序取决于您实际用于后台工作程序的内容,例如delayed_jobresque。这些是人们使用最普遍的后台处理库,因此自动缩放程序将尝试连接其中一个。您可以使用以下内容:

一些工具适用于Cedar堆栈,而有些可能需要进行微调。所有这些工具的问题在于它们就像试图用自己的头发把自己从沼泽中拔出来。让我们以Hirefire为例(它可能是最好的工具之一)。它修改了delayed_job,使得工作者可以查看队列并在必要时启动更多的工作者,如果队列中没有更多的作业,则工作者将关闭彼此。存在几个问题:
  • 如果您想将作业放入队列以在未来执行而不是立即执行,则会遇到麻烦。当作业进入队列时,工作者会启动,但由于作业将在未来执行,因此工作者将关闭,并且除非另一个作业进入队列(这是唯一促使工作者启动的事情),否则不会重新启动。
  • 您失去了重试失败作业的能力,这在delayed_job中默认是可能的,但是在失败作业被重试之前需要一段时间(并且逐渐变长),但是在此时间延迟期间,工作者将关闭,没有任何东西可以促使它们重新启动(实质上,这与第一个场景中的问题相同)。
解决此问题的方法是持续运行一个工作进程,因此可以定期监视队列并在必要时执行作业或甚至启动更多工作进程。但如果这样做,你并没有节省任何钱(你需要持续运行一个工作进程24/7,并为此付费),这就是Heroku上自动缩放器的全部前提。实质上,如果你只偶尔需要后台处理,或者你有可能失败但重试后成功的后台作业,或者你有不需要立即执行的后台作业,则没有自动缩放库可用于你使用。
以下是一种替代方案。编写Hirefire的人后来将其分离成一个Web应用程序(Hirefire app),其本质是为您外部监视Heroku工作进程/动态,根据需要启动/关闭工作进程/动态。这在测试版中是免费的,但现在需要花钱,虽然比持续运行一个工作进程便宜,但如果您只偶尔需要几个后台作业,则仍然不可忽略。无论哪种方式,这都是确保后台作业基础架构按照您的意愿执行的唯一可行方式(还有一种方法是滚动自己的解决方案,这意味着拥有像EC2实例这样的机器,可以在其中放置一些脚本,这些脚本将ping您的Heroku应用程序并根据需要启动/关闭工作进程 - 需要相当大的努力)。
现在,Hirefire应用程序确实可以为您自动缩放dyno,它基于连接到您的Heroku请求队列的延迟来实现这一点。但是我发现这并不好用,也许如果您的Heroku应用程序实际位于Amazon数据中心附近(我们不在),您可能会有不同的体验。但是对于我们而言,它不必要地启动了大量dyno,并且无论我如何调整设置,都不会关闭它们。您可以将其归因于它是beta版,自那时以来可能已经改进,但那是我所经历的。
简而言之,如果您想自动缩放worker,请使用Hirefire应用程序,您将比预期节省更少的资金,但仍然是最便宜的选项。如果您想自动缩放dyno,则基本上没有机会。这只是在使用像Heroku这样方便的平台时所面临的限制之一。

非常感谢,回答很棒。我稍后会尝试使用Hirefire,如果我找到其他好的解决方案,我也会在这里通知大家。 - FernandoH
@Fernando 你最终选择了什么? - user456584
@skorks,我曾使用heroku-autoscaler一段时间。虽然它能够起到作用,但并不完美,而且我对它可以扩展我的资源感到不太满意。最终我放弃了这些自动缩放功能……你考虑过使用它们中的任何一个吗?鉴于我是在一年前尝试的,现在可能有更好的解决方案,请告诉我如果您找到了任何新的! - FernandoH
1
Heroku自这篇文章写作以来发生了很多变化。现在有更好的日志记录、CPU监控工具,还有一个可以为你执行自动扩展的插件。请查看“扩展”部分中的“扩展应用程序”信息。 - genkilabs
刚开始使用hirefire.io,每月节省了我们400美元以上。我们使用它的New Relic集成,效果非常好。现在,hirefire.io每个应用程序只需10美元,因此,如果它每月仅为您节省一个1X dyno,它就可以为您节省15美元,这是值得的。其他情况可能会有所不同,我们的流量非常不可预测。 - rovermicrover

10

Heroku推出了一个名为AdeptScale的新插件,现在已经不再是测试版。

这是AdeptScale的插件页面

这是AdeptScale的更详细文档资料

这是注册Heroku Beta计划的表格

希望这将成为一个强大的解决方案,可以自动缩放Heroku Dynos,因为我仍然对当前的选项不满意。

更新(2/4/13):我注册了Heroku的Beta计划来尝试这个插件,它对我来说工作得非常好。虽然偶尔会随着流量而扩展,但大多数时间都保持在我设置的最小数量的2个dynos上。它大大降低了我的账单,并消除了我在高峰使用时间可能会变慢的担忧。

更新(3/6/13):添加了链接到Heroku的注册页面,用于他们的Beta程序。

更新(4/14/13):看起来自动缩放已经不再是测试版。对我来说仍然运行得非常好。


你是如何注册Heroku的Beta计划的? - simo

3
HireFire.io(该服务,而非开源项目)现在允许您使用New Relic指标来自动缩放Web dynos。New Relic是一种性能监测工具,是Heroku提供的一个附加功能。它们有一个免费层次,并且足以用于HireFire。
您可以基于以下因素之一进行自动缩放:
响应时间
这是您在New Relic仪表板上找到的响应时间。它是各种因素的组合,包括请求排队、数据库性能、应用程序层、路由器等。
Apdex得分
这使您可以根据New Relic Apdex得分进行缩放,从而使您可以根据用户体验/满意度进行缩放,该得分由此确定。
除此之外,我们已经成为了语言/框架不可知的。对于worker dynos,所有您需要做的就是在您的应用程序中设置一条特定路径的JSON端点,该端点返回一个非常简单的JSON字符串,其中包含队列大小(我们为Ruby语言提供了方便但不是必需的宏和一些Django应用程序的开箱即用支持,但是像我说的那样,通过手动设置JSON端点可以为任何语言/框架工作-非常容易)。对于Web dynos,您可以使用HireFire度量源与基本上任何语言/框架,并且对于New Relic支持的语言/框架(这些是常见的语言,例如Ruby、Python、Java等),可以使用上述New Relic度量源。
免责声明:我建立了HireFire。

1
+1 我是 hirefire.io 的快乐客户,用于我的 Heroku Rails 应用程序。Michael 对问题非常敏感,hirefire 做到了它所说的 - 现在甚至支持工作 dynos 的多个队列。 - djoll

2

哦,我也找到了那个。由于免责声明,我有点不舒服,但我稍后会尝试一下 :) 谢谢 - FernandoH
也许值得看一下 https://github.com/ddollar/heroku-autoscale/network 上的分支。顺便分享一下你发现的其他内容。 - gunn

1

我最近编写了一个名为Heroku Vector的Heroku自动扩展系统:

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

它允许您根据不同的流量来源扩展多种类型的动态研究。目前,它支持NewRelic以及Sidekiq的繁忙线程数量。随着流量的增加或减少,它会自动扩展或缩小研究的数量。它是一个守护进程过程,可以在Heroku或其他地方运行自己的研究。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接