【问题标题】:Spring on AppEngine: application slow startup and..... death?AppEngine 上的 Spring:应用程序启动缓慢和......死亡?
【发布时间】:2012-03-06 22:19:43
【问题描述】:

这个帖子似乎也死了:http://groups.google.com/group/google-appengine-java/browse_thread/thread/80d014fd5abd526f

会发生什么:

  • 在本地,通过 mvn gae:run,应用程序运行良好;
  • 我将应用程序部署到 GAE;
  • 第一次调用“/”网址时,我等了很长时间,但没有什么奇怪的:应用程序正在初始化,但它以 500 错误结束;
  • 我继续使用我的应用程序....一切正常;
  • 我停止使用应用程序 3 小时(例如);
  • 我用它回来了……它死了!再次初始化需要很多时间!这太可怕了!再次出现 500 错误

异常堆栈跟踪是:

Uncaught exception from servlet
javax.servlet.UnavailableException: com.google.apphosting.api.DeadlineExceededException: This request (fc36c7e0f23da9e6) started at 2012/03/06 21:26:41.562 UTC and was still executing at 2012/03/06 21:27:42.117 UTC.
    at org.mortbay.jetty.servlet.ServletHolder.makeUnavailable(ServletHolder.java:415)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:458)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:202)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:422)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:695)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:679)

GAE java 团队还没有解决这个错误吗?

我能做什么?我想避免设置一个 cron 作业来每 5 分钟轮询一次我的 url :-(

【问题讨论】:

    标签: spring google-app-engine


    【解决方案1】:

    我相信简单的答案是为服务付费并创建一个resident instance,然后您就不会受到弹簧可能特别昂贵的旋转/拆卸的影响。

    另一种选择是修剪您的应用程序,使其启动时间不会太长。

    【讨论】:

    • 这看起来是一个不错的解决方案,但在这个“测试”阶段,我不会支付任何费用。谢谢! :) 现在,我创建了一个让我的应用程序保持活力的 cron 作业.... 看起来也不错。
    • 在我昨天阅读的一些谷歌文档中(丢失了链接),他们说他们可以识别用于保持应用程序温暖的 cron 作业。不知道他们会怎么做,但只是想我会提出来。
    • 好吧,扮演 Google 的拥护者,如果免费层是围绕使用空闲周期构建的(在不活跃使用时关闭应用程序),那么人为保持温暖的应用程序基本上是在窃取资源用于其他合法活跃的应用程序。如果您仅每 3 小时使用一次您的应用程序,则资源可能会在此期间分配给其他应用程序,但由于您的应用程序由于人为请求而无法进行资源共享而常驻,这意味着 Google 必须为免费层分配更多硬件.至少……我想这是他们的看法。
    【解决方案2】:

    让我们弄清楚,预热请求并不能解决 DeadlineExceededException 错误。

    您看到的 DeadlineExceededException 是由于启动时间超过 60 秒。

    预热请求不会使启动更快。

    付费实例不会使启动更快。

    启动成本主要是由于类路径上的类加载和资源加载。 任何扫描类/资源的类路径的加载速度都很慢。

    减少扫描时间取决于您的应用在启动时加载的框架。通常的嫌疑人是 Spring 和 JSF。

    -lp

    【讨论】:

    • 我同意预热请求不会使启动更快。但是从我的实验来看,jar 扫描只需要 3 秒(在 F1 上),jar 加载实际上大约是 7
    【解决方案3】:

    您可以使用warmup requests 使您的实例在第一个用户请求发送到它之前加速。

    注意:当您没有运行实例时,这不会影响第一次请求的延迟时间,它只会在新实例(现有实例之外)启动时有所帮助。但是,它应该有助于解决第一个请求时的 500 错误。

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 2010-11-08
      • 2018-02-20
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多