GAE扩展规则

时间:2017-02-01 14:46:13

标签: python google-app-engine

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

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

我担心漫长的等待时间会让Google认为我处于高负荷状态,因此新的gae实例将无缘无故产生,并且请求可能最终会排在队列中我有实例准备接受新的工作。

文档告诉我" [是否要启动新实例,也许是否将传入请求发送到队列或实例]的决定考虑了可用实例的数量,如何很快你的应用程序一直在处理请求(它的延迟),以及启动新实例所需的时间"。

我希望GAE期望我的应用程序响应缓慢,但正常做其他事情。

我很难在谷歌的文档中找到直接的答案。

PS:我认为这不会起作用:

  

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

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

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

  • 请求到达
  • gae检查是否有可以处理它的实例。是的,它转到了instanceA(现在已经开始了一段时间)
  • 10秒后,另一个请求到达
  • GAE将其置于队列中并检查instanceA是否可以处理它
  • instanceA似乎负载很重。 GAE不会将请求发送到instanceA
  • 请求将在队列中停留一段时间
  • 在某个时间点,请求将转到实例。或者:
    • instanceA最终返回,负载估计现在更低,所以instanceA得到它
    • 实例B已创建并提供新请求

以下是我想要发生的事情:

  • 请求到达
  • gae检查是否有可以处理它的实例。是的,它转到了instanceA(现在已经开始了一段时间)
  • 10秒后,另一个请求到达
  • GAE将其置于队列中并检查instanceA是否可以处理它
  • instanceA非常繁忙所以请求就在那里
  • 我感觉工作的温暖光辉

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

1 个答案:

答案 0 :(得分:0)

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

  

<强> max_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