【问题标题】:Heroku: web dyno vs. worker dyno? How many/what ratio do I need?Heroku:网络测功机与工人测功机?我需要多少/什么比例?
【发布时间】:2012-01-15 14:37:32
【问题描述】:

我很好奇 Heroku 上的 web 和 worker dynos 有什么区别。他们在定价页面上给出了一句话解释,但这让我感到困惑。我怎么知道每个选择多少?我应该瞄准一个比率吗?我对这些东西很陌生,所以有人可以给出深入的解释,或者我可以通过某种方式计算出我需要多少和哪种测功机?

另外,我对每个测功机的小时数是什么意思感到困惑。

http://www.heroku.com/pricing

我也偶然看到了这篇文章。作为他们建议的解决方案之一,他们说要增加测功机的数量。他们在这里指的是哪种类型的测功机?

http://devcenter.heroku.com/articles/backlog-too-deep

【问题讨论】:

    标签: heroku web-hosting


    【解决方案1】:

    https://stackoverflow.com/a/19965981/1233555 - Heroku 采用了随机路由,所以一些 dyno 可以有队列堆积(当它们服务一个冗长的请求时),而其他 dyno 是免费的。通过确保在您的 web dynos 中快速处理所有请求来避免这种情况。这将减少您需要的网络测功机数量,同时需要更多的工作测功机。

    您还需要关心您的 Web 应用程序是否支持并发,而这只有一些 Rails 配置支持 - 尝试 Unicorn,或使用 Thin 精心编写的代码(用于不阻塞 EventMachine 的 I/O)。

    您可能需要尝试而不是计算来查看您需要多少个每种类型的测功机。确保他们的 New Relic 报告测功机队列 - 请参阅上面的链接。

    【讨论】:

      【解决方案2】:

      如果您需要更多 dynos(也就是 Cedar 上的进程),最好的指示是您的 heroku 日志。确保您升级到扩展日志记录(它是免费的),以便您可以跟踪您的日志。

      您正在寻找 heroku.router 条目,而您最感兴趣的值是队列值 - 如果它始终大于 0,那么这是一个好兆头,您需要添加更多测功机。从本质上讲,这意味着进来的请求多于您的进程可以处理的请求,因此它们正在排队。如果他们排队太久而没有返回任何数据,他们将被超时。

      恐怕没有理想的比率,您可以让应用程序每秒处理 100 个请求,需要许多 Web 进程,但只是不使用工作人员。如果您在后台进行处理(例如发送电子邮件等),则只需要工作进程。

      ps 积压太深将是 Dyno Web 进程导致的。

      更新:2013 年 3 月 26 日,Heroku 从日志输出中删除了队列和等待字段。

      队列和等待字段已从路由器日志消息中删除。 此外,Heroku 路由器不再设置 X-Heroku-Dynos-In-Use, X-Heroku-Queue-Depth 和 X-Heroku-Queue-Wait-Time HTTP 标头 传入请求。

      【讨论】:

      • 要查看heroku路由器日志,请执行heroku logs -p router --tail
      • 我没有看到队列 val 我看到 dyno=web.1 connect=2ms service=4ms status=200 bytes=43
      • 他们为什么要删除它们?
      • 您仍然可以通过启用 Heroku Labs 插件log-runtime-metrics 来获取此信息。运行以下命令,heroku labs:enable log-runtime-metrics。在这里阅读更多:devcenter.heroku.com/articles/log-runtime-metrics
      • stackoverflow.com/a/19965981/1233555 - Heroku 已采用随机路由,因此一些 dyno 可以有队列堆积,而其他 dyno 则免费。通过确保 所有 请求在您的 web dynos 中得到非常快速的处理来避免这种情况。
      【解决方案3】:

      许多人提到没有已知的比率,并且您需要的网络工作者与“后台”工作者的比率取决于您设计应用程序的方式 - 这是正确的。但是,我认为作为一般经验法则添加这一点可能会很有用,您希望您的网络工作者 - 以及他们所服务的控制器操作 - 闪电般快速并且非常轻量级,以减少延迟浏览器操作的响应时间。如果有一些浏览器操作需要超过 0.5 秒的实时时间才能提供服务,那么您可能需要构建某种系统,将大部分操作推送到队列中。

      然后,您将设计一个将为该队列提供服务的离线工作者测功机。它们可能需要更长的时间,因为它们的输出没有待处理的 HTTP 响应。也许您从推送操作的初始浏览器请求中呈现的页面将提供一些 Javascript,该 Javascript 启动一个线程,该线程检查请求是否每 5 秒完成一次,或者类似的事情。

      由于与其他人给出的相同原因,我仍然无法为您提供一个可以使用的比率,但希望这可以帮助您决定如何构建您的应用程序。 (我还应该提到,这只是众多有效设计中的一种。)

      【讨论】:

        【解决方案4】:

        简短的回答是,您需要尽可能多的人来减少排队。

        正如 John 所描述的,如果您开始在日志中看到队列,那么您需要更多的测功机。如果您开始看到您的后台队列变得太长(您如何获取此信息取决于您已实施的内容),那么您需要更多的工作人员。

        没有比率,因为它在很大程度上取决于您的应用程序设计和使用情况。

        【讨论】:

        • 好的,谢谢。我假设测功机是指网络测功机。另外,如何检查日志中的队列?更具体地说,我要问的是,当我阅读日志时,如何确定事情是否堆积如山?我是一名 Rails 开发人员,所以我经常处理运行本地服务器并阅读这些日志,但我不确定如果我看到一个队列,我是否知道如何识别队列。
        • 我的回答描述了如何识别队列大小 - 跟踪您登录 heroku 并查找路由器条目和 queue= 值。您的本地日志对您没有帮助 - 您需要在命令行中使用 heroku logs -f
        • @JohnBeynon 好的,谢谢。直到后来重读才意识到这一点。
        【解决方案5】:

        Dynos 基本上是在您的实例上运行的进程。使用新的 Cedar 堆栈,可以将它们设置为执行任意 shell 命令。对于 Web 应用程序,您通常有一个称为“web”的进程,它负责响应来自用户的 HTTP 请求。所有其他进程都是以前所谓的“工人”。这些在后台连续运行,用于诸如 cron、处理队列和任何您不想占用 Web 进程的繁重计算。您还可以扩展每种类型的进程,以便启动每种类型的多个进程以获得额外的并发性。您使用的每个数量实际上取决于您的应用程序的需求及其接收的负载。你可以使用像 New Relic 插件这样的工具来监控这些东西。有关详细信息,请查看 Heroku 开发中心中有关 Process Model 和 Procfile 的文章。

        【讨论】:

        • "Dynos 基本上是在您的实例上运行的进程。"这是一个不正确的说法。 Dyno 存在于不同的实例上。
        猜你喜欢
        • 2017-02-13
        • 2018-06-30
        • 1970-01-01
        • 2018-10-15
        • 2013-04-26
        • 1970-01-01
        • 2015-08-31
        • 2012-05-20
        • 2014-10-02
        相关资源
        最近更新 更多