我有一个低/零星负载的应用程序,启动新实例(大约 10 秒)导致的延迟远远超过处理我的请求所需的时间,通常在 500 毫秒内完成。
所以为了避免新实例的产生(“加载请求”)导致的延迟峰值,我做了以下两个设置:
- 设置 min idle instances = max idle instances = 1,以确保始终有一个实例在运行(一个实例足以处理我的流量);和
- 将挂起延迟设置为 15 秒,这样 GAE 最多等待 15 秒让一个驻留实例空闲,而不是启动一个新实例。
计费已激活。但是,GAE 仍会启动新实例,从而导致 Not Acceptable 延迟。这是为什么?
在日志中我可以看到我的请求总是在不到 500 毫秒内返回;一个请求不可能排队长达 15 秒。
我该怎么办?非常感谢任何帮助。
更新:我的解决方案是设置一个 cron 作业,每 5 分钟发出一个请求,以始终运行一个动态实例。事实证明(请参阅下面的答案),空闲实例是为疯狂的负载峰值保留的,而不是我 99% 的时间都处于的低负载场景。
最佳答案
正如@koma 所说,app-engine 将创建一个动态实例以保持空闲实例的数量不变,但它不仅会创建一个新实例,而且还会立即使用它,而不是平均使用空闲实例.如果您有一堆空闲实例,应用引擎实际上仍然会更喜欢启动动态实例,即使是在单个请求进入时也是如此,并且会“保存”空闲实例以防出现疯狂的流量高峰。
这是非常违反直觉的,因为您希望它使用已经闲置的实例来为请求提供服务,并为 future 的请求启动动态实例,但这不是它的工作方式。
关于java - 为什么即使我设置了 min idle=1 和 pending latency=max,GAE 仍生成新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14388974/