我正在App Engine上用Python构建应用程序。我的应用以电子邮件附件形式接收图片。当收到电子邮件时,我抓取图片并需要将其发送给第三方API。
我做的第一件事是:
1)使用图像数据向第三方API发出POST请求
我停止了这种方法,因为urllib2和MultipartPostHandler的编码问题非常糟糕。
我现在正在做的第二件事是
1)将图像放入数据存储区中的传入电子邮件中
2)将其放入 memcache
3)向API发送一个提供图像的URL (使用memcache,如果没有在memcache中找到,则为数据存储区)
我在日志中看到的问题是: DeadlineExceededError:ApplicationError:5
更确切地说,我在日志中看到两个请求:
- 首先,收到的电子邮件
- 然后,我给他的URL上的第三方API HTTP调用我的图像
传入的电子邮件以DeadlineExceededError结束。 对我的应用程序的第三方API调用结果很好,正确地为图像提供服务。
我的解释:
看起来App Engine等待第三方API的响应,然后因超时而关闭,然后提供第三方API对图像的请求。不幸的是,由于连接已关闭,我收到第三方API后无法获得有用的信息。
我的问题:
1)App Engine是否可以处理来自主机的请求以获得响应?
2)如果没有,我该如何绕过这个问题?
答案 0 :(得分:1)
如果您直接使用App Engine URLfetch API,则可以调整请求的超时。默认值为5秒,对于普通处理程序,可以增加到10秒,对于任务队列任务或cron作业中的提取,可以增加到10分钟。
如果外部API需要10秒以上的时间来响应,那么最好的办法就是让你的电子邮件处理程序触发一个调用具有非常高超时设置的API的任务(尽管几乎可以肯定它会是更好地解决你的“非常糟糕的编码问题”;将二进制数据编码到POST有多糟糕?)
回答你的第一个问题:如果你正在使用dev_appserver,那么,当你有一个待处理的外部请求时,你根本无法处理任何请求; dev_appserver是单线程的,一次处理1个请求。生产环境应该能够扩展到这一点;但是,如果您的处理程序等待10秒进行urlfetch,则调度程序可能无法很好地扩展您的应用程序,因为传入请求的延迟是自动扩展的因素之一。