我有两个运行app引擎应用程序的实例,我希望与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
任何人都可以提供有关可能发生的事情的任何见解吗?
谢谢 - 理查德
答案 0 :(得分:3)
App Engine的urlfetch
并不总是按预期运行,您有大约10秒的时间来获取URL。假设您尝试获取的URL已启动并运行,您应该能够通过调用DeadlineExceededError
来捕获from google.appengine.runtime import apiproxy_errors
,然后使用{{1}将urlfetch调用包装在try / except块中}。
相关答案here。
答案 1 :(得分:3)
更改方法 从
result = urlfetch.fetch(url)
到
result = urlfetch(url,deadline=2,method=urlfetch.POST)
修复了截止日期错误。
<强>截止强> 等待响应的最长时间 远程主机,为秒数。如果远程主机没有 在这段时间内响应,引发了一个DownloadError。
等待请求所花费的时间不计入CPU配额 对于请求。它确实计入请求计时器。如果应用程序 请求计时器在URL Fetch调用返回之前到期,调用是 取消。
请求处理程序的截止日期最长可达60秒 和任务队列和cron作业处理程序10分钟。如果截止日期是 无,截止日期设置为5秒。
答案 2 :(得分:1)
您是否尝试使用curl
或其他方式手动查询网址(www.site2.com/data_updated和www.site1.com/get_new_data),以确保他们在时间限制内回复?即使需要传输的数据量很小,也许处理程序存在导致延迟返回结果的问题。
答案 3 :(得分:1)
传输的数据量不是问题,延迟是。
如果您正在与之交谈的应用经常采取&gt; 10秒响应,你将不得不在另一个云平台(EC2等)上使用“代理回调”服务器。如果你可以暂时停留一段时间新的后端实例应该稍微放宽urlfetch时间限制。
如果平均响应时间<1。 10秒,只有相对较少的失败,只需重试几次。我希望你的呼吁是幂等的(即重试不会产生不利影响)。如果没有,你可能可以在顶层滚动你自己的图层 - 这有点痛苦,但它运作正常,这就是我们的工作。
Ĵ
答案 4 :(得分:1)
GAE文件现在规定截止日期为60秒:
result = urlfetch(url,deadline=60,method=urlfetch.POST)