【问题标题】:How does one autoscale web dynos on Heroku?如何在 Heroku 上自动缩放 web dynos?
【发布时间】:2012-02-29 02:58:51
【问题描述】:

使用 Heroku,一个 AUTO 如何在需要时根据网络 dynos 进行扩展?假设我们每 2-3 分钟就有 100 个并发用户激增。如果我们的应用程序卡在 5-6 个网络测功机上。我们被搞砸了。

其次,我无法 24 小时监控流量以确定是否需要扩大或缩小规模。

到目前为止,我见过http://hirefireapp.com/http://www.heroscale.com/ 对这两个有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails-3 heroku scalability


    【解决方案1】:

    heroku 本身不这样做的原因是它是一个非常复杂的问题要解决。

    例如,想象一下您在上面的场景,您突然开始看到一个队列正在形成并想要增加测功机。你再开十个。但是,这不是测功机问题,您的数据库运行缓慢,所以现在您有更多的测功机都在等待数据库,而现在对它的需求更大。

    虽然市面上有自动缩放产品,但我没有尝试过其中的任何一款,并且完全相信目前只有人类才能正确调用缩放。您的里程可能会有所不同。

    我过去发现,将资源设置为预期的使用水平(可能高于当前使用水平)往往效果最好,不包括大量流量涌入(例如在 Hacker News 上等)

    【讨论】:

    • 嗯,但是如果您确实被 Hacker News 击中并且办公室里没有人手动扩大规模,会发生什么?这不会导致到处出现请求超时/将应用程序半离线(500 错误)吗?
    • 不幸的是,对于每个应用程序及其在其运行的硬件上的签名,答案都会有所不同。
    • 好吧,如果应用由于流量涌入而获得 20-30 倍以上的点击量。我很确定某些页面浏览量不会通过。即没有足够的网络处理程序来解决。我相信 Heroku 在终止连接之前有 55 秒的请求超时
    • 30 秒返回响应。问题是你只能通过队列长度告诉你有高流量,添加测功机可能无法解决这个问题。
    • 当然必须有其他方法来检测流量发生了什么。我不是专家,但你可以在每次请求时在键值存储中增加某种计数器。或者为每分钟设置一个不同的计数器,并将分钟数与平均值进行比较。
    【解决方案2】:

    我建立了HireFire 并想分享一些最新信息:

    HireFire 使用我们的测功机管理器自动缩放您的网络和工作人员测功机。我们目前支持以下指标来源:

    • HireFire(工作队列)|工人测功机
    • Heroku Logplex(响应时间)|网络 Dynos
    • Heroku Logplex(连接时间)|网络 Dynos
    • Heroku Logplex(队列时间)|网络 Dynos
    • Heroku Logplex(每分钟请求数)|网络 Dynos
    • Heroku Logplex(CPU 负载)| Web/Worker Dynos
    • NewRelic (Apdex) |网络 Dynos
    • NewRelic(响应时间)|网络 Dynos
    • NewRelic(每分钟请求数)|网络 Dynos

    HireFire(工作队列)

    根据作业的队列大小自动缩放基于工作人员的测功机。使用第一方或第三方库可以轻松完成 Ruby 和 Python 应用程序的集成。无需库也可以轻松集成任何其他语言和/或框架。

    您可以为给定的应用程序配置任意数量的测功机管理器,无需额外费用,这意味着您不限于 Procfile 中的单个“工作人员”条目。这(可选)允许您通过例如每个队列有一个 Procfile 条目并让 HireFire 独立扩展每个单独的队列来更有效地安排工作。


    Heroku Logplex

    Logplex (Logdrain) 策略允许 HireFire 使用您的日志,以解析 Heroku 发出的指标数据,然后我们使用这些数据进行自动缩放。指标包括响应时间、连接时间和负载。除此之外,我们还支持队列时间,可以通过安装我们的库轻松添加。或者,您可以自己编写最少量的代码,将必要的数据推送到 logdrain。

    这种抽象方法(不包括队列时间)不需要更改代码,并且适用于任何语言/框架。只需通过 de Heroku CLI 设置 Logdrain 即可。

    对于指标聚合,您可以在平均值和(任何)百分位数之间进行选择。


    新遗物

    我们与 New Relic 集成。如果您已经在使用它,您可以将它连接到 HireFire 并使用它们的指标(apdex、响应时间和 rpm)来自动扩展您的网络测功机。


    如果您有任何问题,请随时与我们联系!

    【讨论】:

    • 我可以第二次雇佣火。在 www.streetbank.com 上对我们来说效果很好。
    • 它每分钟测试一次延迟和作业队列长度,并适当地放大或缩小。显然你仍然需要一个人参与,因为除了测功机之外还有更多的扩展,但到目前为止,它在处理块状流量方面做得非常好。
    【解决方案3】:

    我在 Rails 社区中的很多朋友使用 Rails Autoscale 在 Heroku 上进行自动缩放。以下是它的工作原理:

    Rails Autoscale 提供了一个微型 Rack 中间件,它可以捕获此时间并定期将其报告回 Rails Autoscale 服务。这类似于 New Relic 的工作原理,只是体积的一小部分。

    Heroku 原生提供的自动缩放功能仅适用于其性能层(起价为 250 美元/月每个测功机)。如果您使用的是 Hobby 或 Standard 计划,则需要找到第三方解决方案。

    我喜欢 Rails Autoscale 的一点是它可以根据请求队列自动向上和向下扩展您的应用程序。

    这是一个不错的功能,尤其是让您安心。如果您正在睡觉,并且遇到流量高峰,则无法手动调整测功机的数量。拥有一个可以自动扩展的工具是不错的保险。

    【讨论】:

      【解决方案4】:

      Heroku 刚刚推出了一个新的插件,它可以自动缩放。不过目前只有网络 dynos。

      看看这个帖子https://stackoverflow.com/a/14075781/484689

      【讨论】:

        【解决方案5】:

        我编写了一个名为 Heroku Vector 的 Heroku 自动缩放引擎。它允许您根据收到的流量来扩展 web 和 sidekiq dynos(而不是等待响应时间的延迟):

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

        您可以将其作为独立的测功机进程运行。

        【讨论】:

          【解决方案6】:

          从 2017 年 1 月起,Heroku 正式支持自动缩放。

          自动缩放易于设置和使用,建议使用 p95 阈值基于您的应用过去 24 小时的响应时间。 基于响应的自动缩放确保您的 web dyno 形成是 始终为最佳效率而设计,同时根据以下因素限制您的成本 你设置的限制。目前包括自动缩放,无需额外 使用 Performance 和 Private web dynos 的应用程序的成本。

          这里是文档: https://devcenter.heroku.com/articles/scaling#autoscaling

          这里是公告:https://blog.heroku.com/heroku-autoscaling

          【讨论】:

            猜你喜欢
            • 2020-11-30
            • 2013-04-28
            • 2012-07-10
            • 2017-09-01
            • 1970-01-01
            • 2016-06-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-28
            相关资源
            最近更新 更多