【问题标题】:AppEngine URL Fetch > 60 secondsAppEngine URL 获取 > 60 秒
【发布时间】:2015-03-05 21:49:02
【问题描述】:

我的 AppEngine 项目使用 GAE URL 获取 API 从特定链接检索 XML 数据。我使用了来自here 的示例,只是它看起来像这样:

InputStream stream;
URLConnection connection = new URL(url).openConnection();
connection.setConnectTimeout(0);
connection.setReadTimeout(0);
stream = connection.getInputStream();

这需要超过 60 秒(API 允许的最大值),因此会导致 DeadlineExceededException。使用 TaskQueues 也不是here 提到的选项。

到目前为止,还有其他方法可以实现吗?

谢谢!

【问题讨论】:

  • 如果请求时间超过 60 秒,问题可能出在您从中检索 xml 的服务器上
  • 你能用例如curl,如 Tim 所说,排除或确认服务器问题?
  • 嗨@Tim源服务器本身没有任何问题。这是链接:muc2014.communitymashup.net/x3/mashup

标签: java google-app-engine urlfetch


【解决方案1】:

任务队列的活动时间可以超过 AppEngine 自动扩展请求响应期限 1 分钟。在自动扩展上,一个任务可以运行 10 分钟。在基本或手动缩放时,它可以运行 24 小时。请参阅文档here。 (请注意,python 语言实际上与材料无关——GAE、Go、PHP 上的 Java 也是如此)。

最后,我必须回应其他用户所说的话 - 延迟几乎肯定是由您的 URL 获取的端点引起的,而不是由网络或应用程序引擎引起的。您还可以通过查看 App Engine 日志行中的失败请求来确定这一点。 cpu_millis 字段告诉您实际进程 GAE 端处理请求的时间,而 millis 字段将是请求的总时间。如果总时间远高于 cpu 时间,则意味着成本在网络的其他地方。

这可能与多个连接的带宽耗尽有关,相对于端点的有限资源。如果端点是您在评论中添加的muc2014.communitymashup.net/x3/mashup,则可能有助于知道在我发布此评论时,在 unix 时间大约为 1424738921,平均延迟(包括完整响应,而不仅仅是响应开始的时间) 在该端点上大约是 6 秒,尽管如果没有为端点设置扩展系统,那么在负载很重的情况下,这可能会上升到 >60 秒。观察到的延迟已经相当高,但它可能会根据服务器端需要完成的工作类型、正在处理的请求/数据量等而有所不同。

【讨论】:

    【解决方案2】:

    问题在于 EMF 库中的函数正在使用流,这花费了很多时间(以前不是这种情况)。 相反,将 URL 中的内容加载到 StringBuilder 中,将其转换为单独的 InputStream 并将其传递给函数是可行的。所有这些都是在一个 cron 作业中完成的。

    【讨论】:

    • 所以你原来的问题是不准确的?您确定是其他一些(未显示的)消耗输入流的代码实际上导致了超时?我原以为你会完成基本的分析或确定函数中发生的超时是否是由于函数中的这一行或那一行而不是另一行......这就是你无法找到帮助的原因。我希望将来您提出问题并提供所有相关信息,以便人们可以帮助确定正在发生的事情,并可能更快地为您指明正确的方向。
    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多