App Engine 超时错误:使用存储在 App Engine 的图像调用第三方 API

1 投票
1 回答
603 浏览
提问于 2025-04-16 19:41

我正在用Python在App Engine上开发一个应用程序。我的应用程序接收作为邮件附件的图片。当邮件到达时,我提取图片并需要将其发送到一个第三方API

我首先做的事情是:
1) 用图片数据向第三方API发送一个POST请求。

但是我停止了这个方法,因为我在使用urllib2和MultipartPostHandler时遇到了一些很糟糕的编码问题。

现在我正在做的第二件事是:
1) 将收到的邮件中的图片放入数据存储(Datastore)
2) 将其放入内存缓存(memcache)
3) 向API发送一个提供图片的URL(使用内存缓存,如果在内存缓存中找不到,则使用数据存储)

我在日志中看到的问题是:DeadlineExceededError: ApplicationError: 5

更具体地说,我在日志中看到两个请求:
- 第一个是收到的邮件
- 然后是第三方API对我提供的图片URL的HTTP调用

收到的邮件最终出现了DeadlineExceededError。而第三方API对我应用程序的调用则正常,正确地提供了图片。

我的理解:
看起来App Engine在等待第三方API的响应,然后因为超时而关闭连接,接着再处理第三方API对图片的请求。不幸的是,由于连接已经关闭,我无法获取第三方API在收到我的图片后提供的有用信息。

我的问题:
1) App Engine能否处理来自它期望得到响应的主机的请求?
2) 如果不能,我该如何绕过这个问题?

1 个回答

1

如果你直接使用App Engine的URLfetch API,你可以调整请求的超时时间。默认的超时时间是5秒,但对于普通的处理程序,可以把这个时间增加到10秒;如果是在任务队列或者定时任务中获取数据,超时时间可以增加到10分钟。

如果外部API的响应时间超过10秒,最好的办法可能是让你的邮件处理程序启动一个任务,这个任务去调用API,并设置一个很长的超时时间(不过,实际上,解决你“相当糟糕的编码问题”可能更重要;把二进制数据编码成POST请求有多难呢?)

回答你的第一个问题:如果你在使用dev_appserver,那么在有外部请求等待的时候,你无法处理任何请求;因为dev_appserver是单线程的,一次只能处理一个请求。生产环境应该能够扩展来处理这种情况;不过,如果你的处理程序在等待urlfetch时要等10秒,调度器可能不会很好地扩展你的应用,因为进入请求的延迟是自动扩展的一个因素。

撰写回答