繁体   English   中英

管理具有相当大负载的Google App Engine Java实例以避免500个错误

[英]Managing Google App Engine java instances with quite heavy load to avoid 500 errors

我们有一个Google App Engine Java应用程序,每天的小时数为50 - 120 req / s。

我们的前端appengine-web.xml是这样的:

<instance-class>F1</instance-class>
<automatic-scaling>
    <min-idle-instances>3</min-idle-instances>
    <max-idle-instances>3</max-idle-instances>
    <min-pending-latency>300ms</min-pending-latency>
    <max-pending-latency>1.0s</max-pending-latency>
    <max-concurrent-requests>100</max-concurrent-requests>
</automatic-scaling>

通常,1个前端实例可以处理大约20 req / s。 启动时间大约是15秒。

我有几个问题 :

  • 当我更改前端默认版本时,我得到数千个错误500 - 请求在等待太长时间后尝试为您的请求提供服务时中止。 因此,为了避免这种情况,我使用IP地址的流量分割功能从一个版本切换到另一个版本,从1到100%逐步增加5%,正确地执行它需要大约5分钟,并避免大量500错误。 此外,该功能似乎仅适用于默认前端模块。

- >有更好的方法来切换版本吗?

  • 为避免成千上万的错误500 - 请求在等待太长时间后尝试为您的请求提供服务时中止。 ,我们必须使用至少3个驻留(最小空闲)实例。 随着我们的流量增长,即使有3,我们有时仍会得到大量的错误500.我应该去4个居民? 我认为App Engine很好,因为你只需为你使用的实例付费,所以如果为了正常工作,我们需要至少一半在空闲模式下运行的实例,这不是很好,是吗? 它不是真正具有成本效益,因为当负载很低时,仍然有4个空闲实例是一个很大的浪费:(奇怪的是,他们似乎在响应500之前只等待10秒: pending_ms = 10248

- >你有建议避免这种情况吗?

  • 通常,我们还会收到数千个错误500 - 处理此请求的进程遇到问题,导致它退出。 这可能会导致新进程用于您的应用程序的下一个请求。 如果经常看到此消息,则可能会在应用程序初始化期间抛出异常。 (错误代码104) 我不明白,没有任何例外,我们得到数百个它们几秒钟。

- >你有建议避免这种情况吗?

非常感谢您的帮助! ;)

这些错误消息主要与加载请求相关,这些请求在加载时持续时间过长,因此它们完成类似于DeadlineExceededException的操作 ,这会大大影响您可能已经知道的性能和用户体验。

当使用带有谷歌应用程序引擎的DI框架时,这是一个经常出现的问题,到目前为止,这是使用 自动扩展 时不可避免且严重的未解决问题 ,这是App Engine自成立以来为公共请求提供的扩展策略。

尝试将前端实例类更改为F2 ,特别是如果您的内存消耗高于每个实例128MB,并将最小 - 最大挂起延迟设置为15秒,这样您的请求将有更多机会由常驻实例处理。 但是,对于某些请求,您将获得更长的响应时间,因为每次您的应用程序需要新实例时Google App Engine都不会发出预热请求 ,而且我认为F4会破坏银行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM