用于自动缩放 Heroku 测功机和工人的宝石/服务

Posted

技术标签:

【中文标题】用于自动缩放 Heroku 测功机和工人的宝石/服务【英文标题】:Gems/Services for autoscaling Heroku's dynos and workers 【发布时间】:2011-09-29 17:12:45 【问题描述】:

我想知道在生产环境中是否有任何好的解决方案可以在 Heroku 上自动缩放测功机和工作人员(可能每个解决方案都不同,因为它们非常不相关)。您/公司在使用什么?

我找到了很多选择,但对于生产环境来说,它们似乎都不成熟。 有 Heroscale,它似乎引入了一些延迟,因为它不在本地运行,而且我还听说过一些停机时间。有对delayed_jobs的修改,好久没更新了,目前的bundlers有一些问题。还有一些与reque相关的替代方案,似乎不能很好地处理一些HTTP异常,这会导致应用程序崩溃,而另一些似乎需要一个始终运行的worker来调度其他worker,并且还可能遭受一些HTTP异常的影响问题。

嗯。到底。如今,在使用 Rails3 的生产环境中自动缩放 Heroku 的 dyno 和 worker 的方法是什么?

提前致谢。

【问题讨论】:

【参考方案1】:

我们不久前遇到了这个问题,我花了很多时间来解决这个问题,这让我非常沮丧。我会尽量坚持重点。乍一看,有几个 Heroku 自动缩放解决方案看起来不错。

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

workless hirefire heroku-resque-auto-scale 等

其中一些在 Cedar 堆栈上工作,有些可能需要一些调整。他们所有人的问题在于,这就像试图用自己的头发将自己从沼泽中拉出来一样。让我们以hirefire 为例(它可能是最好的一个)。它修改了delayed_job,以便工作人员自己可以查看队列并在必要时启动更多工作人员,如果队列中没有更多工作,工作人员将相互关闭。有几个问题:

如果您想将作业放入队列中以便将来执行而不是现在执行,那么您就不走运了。当作业进入队列时,工作人员启动,但由于该工作将在未来执行,工作人员将关闭并且不会启动,除非另一个工作进入队列(这是提示工作人员启动的唯一事情) 你失去了重试失败作业的能力,这在delayed_job中默认是可能的,但是如果失败的作业多次失败,它需要一段时间才能重试(并且逐渐变长),但工作人员会关闭在这段时间延迟期间停机,并且没有任何提示它们重新启动(本质上这与第一个场景中的问题相同)

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

这是另一种选择。编写 Hirefire 的人后来将其拆分为一个 web 应用程序 (Hirefire app),其本质是为您从外部监控您的 Heroku 工作人员/测功机,并在必要时启动/关闭工作人员测功机。这在测试版中是免费的,但现在它需要花钱,比你 24/7 全天候运行工人所支付的费用要低,但如果你偶尔只需要一些后台工作,它仍然不是微不足道的。无论哪种方式,这是确保您的后台作业基础设施执行您想要的操作的唯一可行方法(以及滚动您自己的解决方案,这意味着拥有像 EC2 实例这样的机器,您可以在其中放置一些脚本,这些脚本将 ping 您的 heroku 应用程序并旋转根据需要关闭/关闭工人 - 不小的努力)。

现在,Hirefire 应用程序也可以为您自动扩展您的测功机,它基于挂钩您的 Heroku 请求队列的延迟来实现这一点。但是我发现这效果不佳,也许如果您靠近您的 heroku 应用程序实际所在的 Amazon 数据中心(我们不是),您可能会有不同的体验。但是,对我们来说,它不必要地旋转了一大堆测功机,并且无论我如何调整设置都不会旋转它们。你可以把它归结为它是一个测试版,从那时起它可能已经改进了,但这就是我的经验。

长话短说,如果您想自动扩展您的工作人员,请使用 Hirefire 应用程序,您将节省的钱比您想象的要少得多,但它仍然是最便宜的选择。如果你想自动缩放测功机,你基本上就不走运了。这只是您使用 Heroku 等平台的便利性所面临的限制之一。

【讨论】:

非常感谢,很好的回答。稍后我会试试 Hirefire,如果我找到其他好的解决方案,我也会在这里通知。 @Fernando 你最后做了什么? @skorks,我尝试了 heroku-autoscaler 一段时间。它有效,但并非完美无缺,我对能够扩大资源规模的东西感到不太好,这让我付出了代价。最后我放弃了通过这些进行自动缩放。你是否正在考虑使用其中的任何一个?鉴于我一年多前尝试过,现在可能有更好的解决方案,如果你找到了请告诉我! Heroku 已经发生了很大的变化。有更好的日志消耗、cpu 监控工具,现在有一个插件可以为您自动缩放。检查插件部分的“缩放” 刚开始使用hirefire.io,它为我们节省了400 美元加一个月。我们使用它的 New Relic 集成,效果很好。现在,hirefire.io 每个应用程序只需 10 美元,所以如果它每月只为您节省一个 1X dyno,它将为您节省 15 美元,物有所值。其他里程可能非常,我们有非常不可预测的尖峰交通。【参考方案2】:

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 的强大解决方案,因为我对当前的选项仍然不满意。

更新(2/4/13):我注册了 Heroku 的 Beta 计划来试用这个插件,它对我来说非常有效。偶尔会随着流量的增加而扩大规模,但主要是使用我设置的最少 2 台测功机。这大大减少了我的账单,并消除了我在高峰使用时间可能会变慢的担忧。

更新(2013 年 3 月 6 日):添加了 Heroku 的 Beta 计划注册页面链接。

更新(2013 年 4 月 14 日):自动缩放功能似乎已超出 Beta 版。它对我来说仍然非常有效。

【讨论】:

您是如何注册 Heroku 的 Beta 计划的?【参考方案3】:

HireFire.io(服务,而不是开源项目)现在允许您使用 New Relic 指标来自动扩展您的 Web dynos。 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。

【讨论】:

+1 我是 heroku Rails 应用程序的一个快乐的hirefire.io 客户。 Michael 对问题非常敏感,hirefire 做到了它在锡上所说的 - 它现在甚至支持工人测功机的多个队列。【参考方案4】:

我也在努力寻找一种自动缩放测功机的好方法。

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

【讨论】:

哦,我也找到了。由于该免责声明,我有点不舒服,但我稍后会试一试:) 谢谢 可能值得看看github.com/ddollar/heroku-autoscale/network的分叉请顺便分享你发现的其他东西【参考方案5】:

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

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

它允许您根据不同的流量来源扩展多种类型的测功机。它目前支持 NewRelic 和 Sidekiq 的繁忙线程数。随着流量的增加或减少,它将增加或减少测功机的数量。这是一个守护进程,可以在 Heroku 或其他地方的自己的 dyno 中运行。

【讨论】:

以上是关于用于自动缩放 Heroku 测功机和工人的宝石/服务的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 heroku 工人 dyno 不工作?

Heroku 零星的高响应时间

Heroku + socket.io 广播上的多个测功机

Heroku 上的无操作测功机

为啥我托管在 heroku 上的不和谐机器人随机关闭?

删除项目后的僵尸heroku进程?