任务突发期间应用引擎中止请求错误



我有一个关于在处理大量任务时在 App Engine 上收到任务失败消息的问题。

错误如下:

请求

在等待太长时间以尝试处理您的请求后中止。

我的服务配置如下:

<threadsafe>false</threadsafe>
<runtime>java8</runtime>
<system-properties>
<property name="appengine.api.urlfetch.defaultDeadline" value="${urlfetch.deadline.override}"/>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<instance-class>F2</instance-class>
<automatic-scaling></automatic-scaling>

在我的代码中,我想运行并发操作,因此我启动了许多任务来并发运行。问题是,有时我可能会收到显示的错误,因为没有那么多实例准备好处理我的调用,并且当请求的持续时间超过它可以在队列中停留的最长时间时,它就会死亡。

您对如何处理这种情况有什么建议吗?将高值设置为最小挂起延迟可以对此问题产生积极影响?

谢谢你的帮助:)

Japa 应用往往具有较长的实例启动时间,这可能在你的方案中起着重要作用。

需要考虑的事项:

  • 检查您的队列配置,确保它不是导致任务处理瓶颈的配置
  • 启用多线程(在配置中使用<threadsafe>true</threadsafe>(,如果您的应用程序可以容忍(并不总是可能的(。或者,如果只有这个特定的任务处理程序是/可以成为线程安全的,则可以将其拉入单独的服务中并使其多线程化。这将允许一个实例同时处理多个任务,减少所需的实例数量,从而降低实例启动时间的影响
  • 启用/增加备用/驻留/空闲实例的数量(使用min-idle-instances扩展配置元素( - 这些实例旨在处理临时请求峰值,直到 GAE 启动新的动态实例来处理流量增加(这需要一些时间,包括实例启动时间(,另请参阅为什么流向新(动态(实例的请求多于流向常驻实例的请求?
  • 及时错开任务以避免过于突然的任务高峰,使用TaskOptions.countdownMillis(long)/TaskOptions.etaMillis(long)或使用延迟任务代替工作线程服务,这减少了这些任务在队列中花费的有效时间,使 GAE 有机会启动足够的实例来处理它们

相关内容

最新更新