Google App Engine应用程序实例的回收和响应时间

我在GAE for Java小组上发布了这个,但我希望能更快地得到一些答案:)

我决定对我的应用程序进行一些长期性能测试。 我每5-30分钟创建一个小客户端点击应用程序,我用这样的客户端运行3-5个线程。

我注意到响应时间差异很大,并开始调查问题。 我发现原因非常快。 我遇到了以下主题中描述的相同问题:

连接到服务器与发送的第一个字节之间的响应时间不均匀

应用程序实例似乎过于积极地回收

获取“请求在等待太长时间后中止以尝试为您的请求提供服务”。 申请闲置后

我正在使用Springframework,它需要大约18到20秒来启动应用程序实例,这导致响应时间从1秒(当请求点击运行应用程序时非常罕见)到创建新应用程序时的22秒。

这有什么解决方案吗? 我正在考虑创建最基本的servlet来执行关键任务(提供API调用)并保持UI不变。 但是我会放弃Springframework的所有好处。

这有什么解决方案吗?

在解决(黑客攻击)我开发我的应用程序时遇到的App Engine的大量限制,我认为这将使我离开App Engine …这总是很多时候想到如何赢得GAE问题而不是如何解决我的应用问题…

有帮助吗?

关心康拉德

我知道有些人正在运行保持活动的东西,以便让他们的应用程序的实例始终运行。 我的意思是,让客户端每隔X秒发送一次请求,这样您的应用就不会被回收。

这是一个快速实施的东西,但似乎违背了平台的精神。 记下你的号码并检查它是否值得。

另一个选择是重构你的应用程序以使用比现在更多的延迟加载,因此开始不需要那么长时间。

除了这2个,我不知道你是否还有其他选择。

使用新的预编译function。

 true 

如果我们可以将DispatcherServlet序列化到内存缓存中,然后在冷启动时从内存缓存中反序列化它(如果它存在的话)会有什么好处。 然后Spring的实例化将非常短暂。

DispatcherServlet已经标记为Serializable ,我们只需要找到一种方法来序列化DispatcherServlet包含的WebApplicationContext对象。

如果人们住在AE-land并想要一个快速而肮脏的保持活力的pinger,这个就像一个魅力(窗口):

http://www.coretechnologies.com/products/http-ping/

SDK 1.4.0具有以下新function:

  • 开发人员现在可以启用预热请求。 通过在应用程序的appengine-web.xml中指定处理程序,App Engine将尝试在用户与之交互之前发送预热请求以初始化新实例。 这可以减少最终用户初始化应用程序时看到的延迟。

对于AppEngine应用程序来说,这绝对是一个棘手的问题。 纯粹主义者会告诉你,为什么你的应用程序需要这么长时间才能启动并从那里开始向后工作。 在您的情况下,答案显而易见:您使用的是Spring,它必须加载许多类文件并实例化许多对象。

如果你能在没有Spring的情况下生活,那么实用的答案是确保你的app实例保持温暖。 您可以经常从外部源ping它,以便AppEngine永远不会卸载它,或者您可以使用经常运行的AppEngine cron作业来保持您的应用程序在内存中。

我确信谷歌鄙视第二种选择,因为这违背了AE背后的许多基本思想,但尽管如此,这是他们和我们的AE开发者必须考虑的问题。

这是一个相关的讨论