我们不久前遇到了这个问题,我花了很多时间在这上面,让我非常沮丧。我会尽量坚持重点。乍一看,有几个 Heroku 自动缩放解决方案看起来不错。
已经给出heroku-autoscaler的示例实际上是用于自动缩放测功机,并且几乎是唯一声称可以做到这一点的解决方案(而且它肯定做得不好)。大多数其他人只会声称为您自动缩放工作人员。所以,让我们首先关注这一点。您将为工作人员查看的自动缩放器取决于您实际为后台工作人员使用的内容,例如delay_job、resque。这些是人们使用的最常见的后台处理库,因此自动缩放器将尝试连接其中之一。您可以使用以下内容:
其中一些在 Cedar 堆栈上工作,有些可能需要一些调整。他们所有人的问题在于,这就像试图用自己的头发将自己从沼泽中拉出来一样。让我们以hirefire 为例(它可能是最好的一个)。它修改了delayed_job,以便工作人员自己可以查看队列并在必要时启动更多工作人员,如果队列中没有更多工作,工作人员将相互关闭。有几个问题:
- 如果您想将作业放入队列中以在将来而不是现在执行,那么您就不走运了。当作业进入队列时,工作人员启动,但由于该工作将在未来执行,工作人员将关闭并且不会启动,除非另一个工作进入队列(这是提示工作人员启动的唯一事情)
- 你失去了重试失败作业的能力,这在delayed_job中默认是可能的,但是如果失败的作业多次失败,它需要一段时间才能重试(并且逐渐变长),但工作人员将在此期间关闭时间延迟并且没有任何东西可以提示他们重新启动(本质上这与第一个场景中的问题相同)
解决这个问题的方法是让一个工作人员连续运行,因此可以定期监控队列,并在必要时执行作业,甚至启动更多工作人员。但是如果你这样做,你就不会节省任何钱(你有一个工人 24/7 连续运行并且必须为此付费),这就是 heroku 上自动缩放器背后的全部前提。本质上,如果您只是偶尔需要进行后台处理,或者您有可能会失败但重试成功的后台作业,或者您有不需要立即执行的后台作业,那么您就没有自动缩放库可以使用它会为你工作。
这是一种选择。编写 Hirefire 的人后来将其拆分为一个 web 应用程序(Hirefire 应用程序),其本质是为您从外部监控您的 Heroku 工作人员/测功机,并在必要时启动/关闭工作人员测功机。这在测试版中是免费的,但现在它需要花钱,比你 24/7 全天候运行工人所支付的费用要低,但如果你偶尔只需要一些后台工作,它仍然不是微不足道的。无论哪种方式,这是确保您的后台作业基础设施执行您想要的操作的唯一可行方法(以及滚动您自己的解决方案,这意味着拥有像 EC2 实例这样的机器,您可以在其中放置一些脚本,这些脚本将 ping 您的 heroku 应用程序并旋转根据需要关闭/关闭工人 - 不小的努力)。
现在 Hirefire 应用程序也确实为您提供了自动缩放您的测功机,它基于挂钩您的 Heroku 请求队列的延迟来做到这一点。但是我发现这效果不佳,也许如果您靠近您的 heroku 应用程序实际所在的 Amazon 数据中心(我们不是),您可能会有不同的体验。但是,对我们来说,它不必要地旋转了一大堆测功机,并且无论我如何调整设置都不会旋转它们。你可以把它归结为它是一个测试版,从那时起它可能已经改进了,但这就是我的经验。
长话短说,如果您想自动扩展您的员工,使用 Hirefire 应用程序,您将节省的钱比您想象的要少得多,但它仍然是最便宜的选择。如果你想自动缩放测功机,你基本上就不走运了。这只是您为拥有 Heroku 等平台的便利而忍受的限制之一。