【问题标题】:Google App Engine application instance recycling and response timesGoogle App Engine 应用程序实例回收和响应时间
【发布时间】:2011-01-04 07:04:51
【问题描述】:

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

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

我注意到响应时间的巨大差异并开始 调查问题。我很快就找到了原因。 我遇到了与以下主题中所述相同的问题:

Uneven response time between connection to server to first byte sent

Application instances seem to be too aggressively recycled

Getting 'Request was aborted after waiting too long to attempt to service your request.' after application idle

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

有什么解决办法吗? 我正在考虑创建执行关键的最基本的 servlet 任务(服务 API 调用)并保持 UI 不变。 但是那样我就会失去 Springframework 的所有好处。

有什么解决办法吗?

在解决(破解)我遇到的 App Engine 的众多限制之后 在开发我认为会让我搬出去的应用程序时 App Engine 的... GAE 问题胜过如何解决我的应用程序问题...

有什么帮助吗?

问候 康拉德

【问题讨论】:

  • 您与 Google 网上论坛讨论的链接已损坏。
  • 感谢亚当!我修复了链接...

标签: java spring google-app-engine


【解决方案1】:

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

这是一个快速实现的事情,但似乎违背了平台的精神。做你的数字并检查它是否值得。

另一种选择是重构您的应用程序,以利用比目前更多的延迟加载,因此启动时间不会那么长。

不知道你除了这2个还有没有别的选择。

【讨论】:

  • 您好,感谢您的回答,但我不认为实例运行将始终用于服务请求,GAE 是一种云解决方案,因此您的请求甚至可以在不同的机器上服务.
  • 我怀疑如果您定期发送请求,您的应用程序实例将保存在同一台服务器上。即使它被更改为另一个,你真正关心的只是当一个真正的请求来自一个真正的用户时,你的应用程序已经准备好了。只需确保您发送请求的速度足够快,这样您的应用始终“热”且活跃。
  • 我自己没有实现这个,所以我不知道。其他人已经做到了,搜索他们的cmets。您还可以通过检查服务器的响应时间来检测您的时间间隔是否过长并动态更改。
【解决方案2】:

使用新的precompilation 功能。

<!-- appengine-web.xml -->

<precompilation-enabled>true</precompilation-enabled>

【讨论】:

    【解决方案3】:

    如果我们可以将DispatcherServlet 序列化到内存缓存中,然后在冷启动时将其从内存缓存中反序列化(如果存在),那将是一件好事。那么Spring的实例化就真的很短了。

    DispatcherServlet已经被标记为Serializable,我们只需要想办法序列化DispatcherServlet所包含的WebApplicationContext对象即可。

    【讨论】:

    • 有趣的是 DispatcherServlet 被标记为可序列化但包含不可序列化的属性。该死的。
    • 你明白了吗?
    【解决方案4】:

    如果人们住在 AE 领域并想要一个快速而肮脏的保活 pinger,这个功能就像一个魅力(windows):

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

    【讨论】:

      【解决方案5】:

      SDK 1.4.0 有这个新功能:

      • 开发人员现在可以启用预热请求。通过在 一个应用的appengine-web.xml,App 引擎将尝试发送一个 初始化新的预热请求 用户交互之前的实例 它。这可以减少延迟 最终用户看到初始化你的 申请。

      【讨论】:

        【解决方案6】:

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

        如果您可以在没有 Spring 的情况下生活,实用的答案是确保您的应用实例保持温暖。您可以频繁地从外部源 ping 它以使 AppEngine 永远不会卸载它,或者您可以使用运行频率足够高的 AppEngine cron 作业以将您的应用程序保留在内存中。

        我确信 Google 鄙视第二种选择,因为这与 AE 背后的许多基本理念背道而驰,但无论如何,这是他们和我们 9 作为 AE 开发人员必须考虑的问题。

        这是related discussion

        【讨论】:

        • 您好,感谢您的帮助。即使应用程序将在 3 秒内启动 - 这也不是解决方案。在此之后我对 GAE 有点失望,我很遗憾在构建我的应用程序之前没有发现这个问题(幸运的是,我认为在常规基础架构上运行它不会做太多工作)。希望其他人在与 GAE 接触之前会阅读此类帖子。我将尝试通过创建用于服务 API 调用的基本 servlet 来解决它,但这看起来就像回到 CGI 和 shell 脚本:D
        • Konrad,很遗憾听到您在开发周期的后期发现了有关 App Engine 的这一发现。一定非常沮丧。 App Engine 无疑是一种不同于我们通常习惯的那种网络应用程序平台,并且存在一些不那么明显或难以沟通的陷阱。我希望随着 AE 的成熟和编程大众对它的理解程度的提高,这种情况会有所改变。
        猜你喜欢
        • 2019-01-17
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        • 2010-09-07
        • 2010-12-23
        • 2013-02-05
        • 2011-03-08
        • 1970-01-01
        相关资源
        最近更新 更多