【问题标题】:App engine aborted request error during tasks burst任务突发期间应用引擎中止请求错误
【发布时间】:2018-12-07 17:37:27
【问题描述】:

我有一个关于在处理大量任务时在 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>

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

您对如何处理这种情况有什么建议吗?将min-pending-latency 设置为高值可以在这件事上产生积极的影响?

谢谢你的帮助:)

【问题讨论】:

  • 你对应的任务队列配置是什么?
  • 你能确定“太长”的真正含义吗?也许在请求中添加一个应用程序日志,将任务排入队列并检查从该任务到出现上述错误的时间增量?
  • 在您的示例appengine-web.xml 中,您使用&lt;threadsafe&gt;false&lt;/threadsafe&gt; 并同时使用并发。根据this doc,不建议这样做。遵循那里的建议并检查您如何实现并发。让我们知道这是否有帮助

标签: java performance google-app-engine


【解决方案1】:

Japa 应用程序的实例启动时间往往较长,这可能在您的场景中发挥重要作用。

需要考虑的事项:

  • 检查您的队列配置,确保它不是导致任务处理瓶颈的原因
  • 启用多线程(在您的配置中使用&lt;threadsafe&gt;true&lt;/threadsafe&gt;),如果您的应用程序可以容忍这种情况(并非总是可行)。或者,如果只是这个特定的任务处理程序是/可以使线程安全的,则可能将其拉入单独的服务并使其成为多线程。这将允许一个实例同时处理多个任务,从而减少所需的实例数量,从而降低对实例启动时间的影响
  • 启用/增加备用/驻留/空闲实例的数量(使用min-idle-instances 扩展配置元素) - 这些实例旨在处理临时请求高峰,直到 GAE 启动新的动态实例来处理流量增加(这需要一些时间,包括实例启动时间),另见Why do more requests go to new (dynamic) instances than to resident instance?
  • 使用TaskOptions.countdownMillis(long)/TaskOptions.etaMillis(long)Using the DeferredTasks instead of a worker service 及时错开您的任务以避免过于突然的任务高峰,这会减少这些任务考虑在队列中花费的有效时间,让 GAE 有机会启动足够的实例来处理它们

【讨论】:

  • 谢谢,这真的很有帮助。实际上,我已经通过使用 max-concurrent-requests、target-throughput-utilization 和 min&max-pending-latency 来修复它,因为实例上的请求过多会导致我这边出现内存问题。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2017-01-29
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多