【问题标题】:GAE scaling rulesGAE 缩放规则
【发布时间】:2017-06-18 08:45:05
【问题描述】:

这与:How does Google App Engine Autoscaling work? 不同。

TLDR;我有一个 GAE 应用程序,它的端点必须等待一段时间才能返回。大约15秒。它在等待时并不是特别努力。由于第三方集成,我真的没有办法实现轮询或回调,而不是漫长的等待。

我担心漫长的等待时间会让 Google 认为我的负载很重,因此新的 gae 实例将毫无意义地生成,并且当我准备好处理实例时,请求可能最终排在队列中新作品。

文档告诉我“[是否启动新实例,以及是否将传入请求发送到队列或实例的决定] 考虑了可用实例的数量、应用程序的速度一直在服务请求(它的延迟),以及启动一个新实例需要多长时间”。

我希望 GAE 期望我的应用程序响应缓慢,但一切正常。

我只是在谷歌的文档中努力寻找一个直接的答案。

PS:我认为这行不通:

max_pending_latency:App Engine 应该等待的最长时间 在开始新的请求之前允许请求在待处理队列中等待 实例来处理它。默认值为“30ms”。

原因是:我说的是请求到达我的视图代码和我的视图代码返回之间的延迟。如果我允许在队列中等待 15 秒,那么客户端请求可能会被撞到队列中,然后当 GAE 认为我的应用程序负载过重(但不是)时就坐在那里,然后 GAE 最终会将请求发送到我的长时间等待视图这将等待很长时间才能返回任何东西,从而导致 GAE 吓坏了,并将更多的东西放在队列中,并试图产生更多的实例。

这是我认为正在发生的事情(大大简化)

  • 请求到达
  • gae 检查是否有可以处理它的实例。是的,它转到了 instanceA(现在会持续一段时间)
  • 10 秒后另一个请求到达
  • GAE 将其放入队列并检查 instanceA 是否可以处理它
  • instanceA 似乎负载过重。 GAE 不会只是将请求发送到 instanceA
  • 请求将在队列中等待一段时间
  • 在某个时间点,请求将转到一个实例。任何一个:
    • instanceA 最终返回,并且负载估计现在较低,因此 instanceA 得到它
    • instanceB 已创建并提供新请求

这是我想要发生的事情:

  • 请求到达
  • gae 检查是否有可以处理它的实例。是的,它转到了 instanceA(现在会持续一段时间)
  • 10 秒后另一个请求到达
  • GAE 将其放入队列并检查 instanceA 是否可以处理它
  • instanceA 不是很忙,所以请求转到那里
  • 我感到工作做得好时散发出温暖的光芒

据我所知,在不产生一百万个实例且排队时间长的情况下,我可以让它工作的唯一方法是不使用 GAE

【问题讨论】:

  • 我猜他们没有给出直接的答案,因为 1. 逻辑可能非常复杂,不容易在纸上表达 2. 如果他们确实写下了一个实际的公式,很可能在下一个版本中不正确:-)。我知道这不是很有帮助,但是...
  • @DanCornilescu 我认为这个问题不是那个非常普遍的问题的重复。 OP 有一个案例,我认为我们可以用具体的见解来回答/解决,就像我在下面尝试的那样,具体的配置。
  • @DanCornilescu 不是重复的。我添加了更多信息

标签: python google-app-engine


【解决方案1】:

我认为您想使用max_pending_latencymin_pending_latency,特别是尝试将它们增加到并超过您提到的标称15 秒阈值。来自app.yaml Reference / Scaling Elements

ma​​x_pending_latency: App Engine 在启动新实例处理请求之前应允许请求在待处理队列中等待的最长时间。默认值为“30ms”。

较高的最大值意味着用户可能会等待更长的时间等待他们的请求得到处理(如果有待处理的请求并且没有空闲实例来为它们提供服务),但您的应用程序的运行成本会更低。

min_pending_latency: App Engine 在启动新实例来处理请求之前,应允许请求在待处理队列中等待的最短时间。

较高的最小值意味着如果所有现有实例都处于活动状态,则请求将保持更长的等待时间。这降低了运行成本,但增加了用户必须等待其请求得到处理的时间。

所以,也许是这样的:

application: simple-sample
module: my_module
version: uno
runtime: python27
api_version: 1
instance_class: F1
automatic_scaling:
  min_idle_instances: 0  # Don't even know if 0 is valid, but should be least costly
  max_idle_instances: 0
  min_pending_latency: 30000ms
  max_pending_latency: 30000ms
  max_concurrent_requests: 80  # Maximum value: you want one instance to handle as much traffic as possible

【讨论】:

  • 我不认为是那个......我不希望在应该将其提供给实例时坐在队列中的东西。我在我的问题中添加了一些东西
  • 这些配置是关于“启动一个新实例来处理它”而不是“应该给一个实例”。如果有空闲实例,请求将发送给它们,没有问题。
  • 我会大大提高 max_concurrent_requests,虽然 - 应用程序应该能够开始处理(许多)请求,而早期的请求仍在处理中。我也会尝试使其成为线程安全的。
  • @DanCornilescu 是的,我的想法是一样的:OP 希望任何一个实例都能处理尽可能多的流量,而不需要 GAE 认为需要一个新实例。更新配置并添加评论。
  • @DanCornilescu 但是如果一个实例看起来很忙(因为它需要很长时间才能响应,因此谷歌估计它处于繁重的负载下)那么它不会被分配任何东西,因为据谷歌所知没有闲着。即使它只是放松并等待另一项服务,gae 也会认为它无法接受进一步的请求。即使它允许大量连接,如果一个实例看起来已经停止,那么 gae 肯定会想要将下一个请求发送到其他地方吗?我再次编辑了我的问题……我说的有道理吗?
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2019-04-06
  • 1970-01-01
  • 2018-07-07
  • 2011-08-20
相关资源
最近更新 更多