21

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

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

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

提前致谢。

4

5 回答 5

35

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

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

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

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

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

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

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

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

于 2011-09-22T05:04:58.787 回答
10

Heroku 正在提供一个名为 AdeptScale 的新插件,该插件现在刚刚结束 Beta 版。

这是 AdeptScale 的附加页面

这是 AdeptScale 更详细的文档

这是注册 Heroku Beta 计划的表格

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

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

更新 (3/6/13):为 Heroku 的 Beta 程序添加了注册页面的链接。

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

于 2012-12-28T21:05:02.927 回答
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。

于 2013-07-24T22:36:09.507 回答
2

我也在尝试找到一种自动缩放测功机的好方法。

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

于 2011-07-09T06:49:05.157 回答
1

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

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

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

于 2014-09-14T23:53:00.520 回答