Heroku 平台扩展指南

Guidelines for Scaling on Heroku Platform

我是 运行 基于 NodeJS 的应用程序,连接到 mongohq-MongoDB,在 free Dyno 上。我想将它迁移到使用 hobby Dyno,这样做的动机不仅是为了避免睡眠时间,也是为了实现更高的 HTTP 流量吞吐量。

阅读 Scaling documentation and the Procfile 文章让我对如何在 Heroku 上进行扩展感到困惑。

Procfile 文章中,据说 web 进程类型是唯一将从 Heroku routing-mesh 接收 HTTP 流量的进程。

所以我的问题是:

  1. 当已经有一个 hobby Dyno 运行 时,执行 'heroku ps:scale web+2' 将导致在同一个 Dyno 上有 +2 个网络进程或添加两个 hobby Dynos(总共三个hobby Dynos)?
    • 总共三个 爱好 Dynos 意味着 3 个 Web 进程和 27 个非 Web 进程可用?
  2. answer中,建议使用cluster模块分叉线程来处理HTTP请求,如何确定应该的worker数量已创建(在 // fork worker processes 循环中)?
  3. 我应该如何决定何时水平扩展我的应用程序(添加更多相同类型的 Dynos)或垂直扩展(更强大的 Dynos,如 standard-1X/2X)
    • 应触发水平缩放以处理更高数量的请求?
    • 应触发垂直缩放以处理更繁重的处理(需要更多的计算资源来响应相应的请求?)

N.B,

this 答案的 Scaling 部分,关于上面问题 #1 的结果 Dynos 仍然不清楚。


请考虑到应用程序优化(例如 find/remove 瓶颈等)不在这个问题的范围内,因为它的目标是更好地理解 Heroku 上的资源利用平台。

我会把这些整理好...

  1. 不,您在业余爱好层中有 10 种流程类型,这意味着如果您 有 1 个 web dyno,你可以再有 9 个 dynos 运行ning 相同的应用程序,这另外 9 个可以是您 Procfile 中的任何条目。

    您只能有一个 web dyno,其余的是您 Procfile 中的其他(最多 9 个)条目。

  2. 这主要是由记忆决定的,这取决于你在做什么 你的应用程序,如果它相当小,那么你可以 运行 更多, Node.js 集群 worker 是独立的 Node.js 进程,这种情况发生了 共享同一个套接字,并且 OS 将请求分布到 进程。

  3. 您需要考虑此处请求的响应时间,如果您 看到 "slow" 请求,你要么优化,要么当你确定 你被优化了,你需要扩大规模,这可能涉及也可能不涉及 增加 运行ning 测功机的数量,这可能是你的事情 与正在减慢请求(例如数据库或外部 服务)。

什么定义了 "slow" 请求?

好吧...您可能会考虑将“budget”作为响应时间,但您需要测量 request/response 时间,通常要达到相当高的粒度级别,因此您可以隔离是什么导致了缓慢的响应,并确保你缩放正确的部分,如果它是一个优化不佳的数据库查询导致你悲伤,那么将你的 dyno 计数加倍将无济于事,如果有的话它可能会使事情变得更糟,所以你需要衡量整体响应时间和魔法请求。

水平缩放和垂直缩放是完全不同的,这个问题的答案取决于你的应用程序,更大的dynos有更多的内存,这意味着它们也许可以在内存中缓存数据,或者处理来自外部服务的更大的有效载荷,也Performance-M 和 Performance-I dynos 对客户来说是 "dedicated",因此,您将受益于更可预测的负载配置文件。

如果你有多个 web dynos,那么 Heroku 路由器将在它们之间随机分配传入的请求,这意味着它们将在一段时间内收到大致相同数量的请求,并且 "Little's Law" 在这里应用,有一个很好的解释如何将它应用到网络请求 here,如果你想要的并发请求,在当前平均响应时间不起作用,你有两个选择,减少平均响应时间,或提高您的能力。

此外,Hobby 等级不会让你的测功机更快,它允许你有更多的进程(测功机)并且它们可以 运行 一天 24 小时,但你需要去其中一个更大的 dyno 类型以获得性能提升。