【问题标题】:Spring MVC on GAE: Slow Load TimeGAE 上的 Spring MVC:加载时间慢
【发布时间】:2011-04-21 21:28:48
【问题描述】:

我最近在谷歌应用引擎上部署了一个 Spring MVC 应用程序,初始加载时间约为 7 秒。加载应用程序后,该应用程序的响应速度非常快。但是,如果应用程序空闲超过 1 分钟(没有任何流量),则应用程序需要由 GAE 再次重新加载,这也需要大约 7 秒。对于 PRD 级别的应用程序,这是不可接受的。 (应用程序是空的——我什至还没有使用 JPA、Sitemesh、Spring Security 等。它只是加载一个带有一些文本的 jsp 页面。

到目前为止,修复“加载时间”的唯一“最佳实践”是设置一个每分钟访问 url 的 cron 作业,从而保持应用程序“加载”。显然这是一个糟糕的解决方案。

所以问题来了:在“响应性”方面,GAE 上的 Spring 是否有任何“最佳实践”?由于 google 和 spring 正在努力开发他们两者之间更好的集成,有没有关于这个问题的任何消息/进展?我找不到任何具体的东西,所以我在这里问它

话题讨论: http://groups.google.com/group/google-appengine-java/browse_thread/thread/80d014fd5abd526f

更新

有一个“票”来创建保留实例,以及“加热”逻辑: http://code.google.com/p/googleappengine/issues/detail?id=2456

【问题讨论】:

  • 出于好奇,为什么 cron 作业“显然”是一个糟糕的解决方案。它“显然”很糟糕,但如果它有效......
  • 随着应用程序的增长,它初始化所需的时间会增加,因此如果应用程序需要 30 秒来初始化等,1 分钟的 cron 作业将变成 30 秒的 cron 作业。仅添加弹簧安全性就会大大增加加载时间。此外,它为应该修复的 Spring/GAE 问题增加了不必要的复杂性。 :)

标签: java performance google-app-engine spring-mvc


【解决方案1】:

GAE 开始提供付费服务,您可以随时保留热实例:

http://googleappengine.blogspot.com/2010/12/happy-holidays-from-app-engine-team-140.html

始终开启 - 对于流量较低或可变的高优先级应用程序,您现在可以通过 App Engine 的始终开启功能保留实例。 Always On 是一项高级功能,每月收费 9 美元,它保留应用程序的三个实例,即使应用程序没有流量,也永远不会关闭它们。这可以减轻加载请求对流量较小或可变的应用程序的影响。

结合热身请求,如果您计划使用 GAE,这是最好的解决方案。

【讨论】:

    【解决方案2】:

    由于SDK 1.4.0,您可以使用warmup requests 避免这种延迟。
    在任何实时请求到达该实例之前,预热请求会将应用程序代码加载到新实例中。

    【讨论】:

    • 这仅在加载初始实例后才有效(这需要超过 10 秒)。
    【解决方案3】:

    好的,由于缺乏回复,我决定继续 cron 工作(因为我目前看不到任何其他选项)

    这是我正在使用的 cron.xml 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <cronentries>
      <cron>
        <url>/keepalive</url>
        <description>Keep the application alive</description>
        <schedule>every 1 minutes</schedule>
      </cron>
    </cronentries>
    

    这是控制器:

    
    package com.xxxxxxxxxxxxx.web;
    
    import org.slf4j.Logger;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    
    @Controller
    @RequestMapping("/keepalive")
    public class KeepAliveController {
    
        private Logger logger = org.slf4j.LoggerFactory.getLogger(KeepAliveController.class);
    
        @RequestMapping(method = RequestMethod.GET)
        public void keepAlive() {
            logger.info("I'm alive!");
        }
    }
    

    【讨论】:

    • 我已经读过,不幸的是没有其他方法!除非我希望我的用户在我的页面加载之前等待 10 秒,否则这是保持它相对“生产就绪”的唯一方法。正如我上面提到的,谷歌正在研究一种解决方案(付费和免费)。在创建此解决方案之前,许多创建要部署在 google 上的 java 应用程序的人都不走运:code.google.com/p/googleappengine/issues/detail?id=2456
    • 如果您的“生产”应用程序有一些 SLA(服务级别协议)要求,那么您需要考虑比 GAE 更好的托管解决方案。 GAE 不保证正常运行时间、响应时间等,尤其是免费帐户。如果您想使用 GAE,那么您的用户将不得不支付等待时间。但是,如果您需要某种可靠性,那么您可能会考虑花几块钱。
    • @Gweebz -- GAE 的网站上没有提到(或警告)Java 应用程序的加载时间可能超过 15 秒,以及从一个“平台”快速切换到另一个(例如亚马逊)在大多数情况下是不可行的。所以那些决定在 GAE 上开发他们的 java 应用程序的人并没有意识到这个巨大的绊脚石。此外,当我启动这个“线程”时,没有支付“永远在线”实例的选项。
    猜你喜欢
    • 2019-06-15
    • 2011-07-11
    • 2013-11-07
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2021-11-10
    相关资源
    最近更新 更多