1

我有两个正在运行的应用程序引擎应用程序实例,我想与 Restful 接口进行通信。一旦更新了其中一个的数据,它会在第二个上调用一个 Web 挂钩,该挂钩将为它自己的系统检索数据的新副本。在'site1'里面我有:

 from google.appengine.api import urlfetch

 url = www.site2.com/data_updated
 result = urlfetch.fetch(url)

在“site2”上的 data_updated 处理程序中,我有:

 url = www.site1.com/get_new_data
 result = urlfetch.fetch(url)

两个站点之间传递的数据很少,但我收到以下错误。我尝试将截止日期增加到 10 秒,但这仍然不起作用。

 DeadlineExceededError: ApplicationError: 5 

任何人都可以提供任何关于可能发生的事情的见解吗?

谢谢 - 理查德

4

5 回答 5

3

App Engine 的urlfetch行为并不总是如预期的那样,您有大约 10 秒的时间来获取 URL。假设您尝试获取的 URL 已启动并正在运行,您应该能够通过调用捕获DeadlineExceededErrorurlfetch 调用from google.appengine.runtime import apiproxy_errors,然后使用except apiproxy_errors.DeadlineExceededError:.

相关答案在这里

于 2011-06-18T11:13:13.160 回答
3

改变方法从

  result = urlfetch.fetch(url)

  result = urlfetch(url,deadline=2,method=urlfetch.POST)

已修复截止日期错误。

urlfetch 文档

期限 等待远程主机响应的最长时间,以秒为单位。如果远程主机在这段时间内没有响应,则会引发 DownloadError。

等待请求所花费的时间不计入请求的 CPU 配额。它确实计入请求计时器。如果应用请求计时器在 URL Fetch 调用返回之前到期,则调用将被取消。

请求处理程序的截止时间最长为 60 秒,任务队列和 cron 作业处理程序的截止时间最长为 10 分钟。如果deadline 为None,则deadline 设置为5 秒。

于 2011-06-18T12:38:09.920 回答
1

传输的数据量不是这里的问题,延迟才是。

如果您正在与之交谈的应用程序的响应时间通常超过 10 秒,那么您将不得不在另一个云平台(EC2 等)上使用“代理回调”服务器。如果您可以推迟一段时间,则新的后端实例是应该稍微放宽 urlfetch 的时间限制。

如果平均响应时间 < 10 秒,并且只有相对较少的部分失败,则重试几次。我希望为您着想,这些调用是幂等的(即重试不会产生不利影响)。如果没有,您也许可以在上面滚动您自己的层 - 这有点痛苦,但它工作正常,这就是我们所做的。

Ĵ

于 2011-06-18T00:06:02.027 回答
1

GAE 文档现在声明截止日期可以是 60 秒:

result = urlfetch(url,deadline=60,method=urlfetch.POST)
于 2011-11-03T20:56:23.480 回答
1

您是否尝试过手动查询 URL(www.site2.com/data_updated 和 www.site1.com/get_new_data)以curl确保它们在时限内响应?即使需要传输的数据量很小,也可能是处理程序存在问题,导致返回结果出现延迟。

于 2011-06-17T18:25:58.017 回答