2011-06-16 41 views
1

我正在App Engine上使用Python构建应用程序。我的应用程序收到图像作为电子邮件附件。当电子邮件进入时,我抓住图像,并需要将其发送到第三方API。App Engine超时错误:使用存储在App Engine上的图像提供第三方API

我做的第一件事是:
1)做一个POST请求第三方API与图像数据

我停止这种方法,因为我曾与urllib2的和MultipartPostHandler一些非常糟糕的编码问题。

我现在在做的第二件事是
1)将图像中的传入电子邮件中数据存储
2)把它放在内存缓存
3)发送到API的服务于图像(使用内存缓存或者,如果在内存缓存中没有找到,数据存储)URL

我在我的日志读取的问题是:DeadlineExceededError:的ApplicationError:5

更确切地说,我看到我的日志两个要求:
- 第一,收到的电子邮件
- 然后,第三方API HTTP调用我的图像上的网址我给他

传入电子邮件结束了DeadlineExceededError。 第三方API调用到我的应用程序结束了很好,正确地提供图像。

我的解释:
它看起来像App Engine的等待从第三方API的响应,然后关闭,因为超时,然后提供由第三方API的图像提出的要求。不幸的是,当连接关闭时,一旦它接收到我的图像,我就无法获得第三方API提供的有用信息。

我的问题:
1)应用程序引擎可以处理来自主机的请求时,它假设得到的回应?
2)如果没有,我怎么能绕过这个问题?

回答

1

如果您直接使用App Engine URLfetch API,则可以调整请求的超时时间。默认值是5秒,对于正常处理程序,可以增加到10秒,对于任务队列任务或cron作业中的提取,可以增加到10分钟。

如果外部API需要超过10秒的响应时间,可能最好的办法是让您的电子邮件处理程序触发一个任务,该任务通过超高设置调用API(尽管几乎可以肯定它会要更好地解决你的“很不好的编码问题”;将二进制数据编码到POST有多糟?)

要回答你的第一个问题:如果你使用的是dev_appserver,不,你不能处理任何请求尽管你有一个外部请求待处理; dev_appserver是单线程的,一次处理1个请求。生产环境应该能够扩展来做到这一点;但是,如果处理程序等待10秒钟执行urlfetch,则调度程序可能无法很好地扩展应用程序,因为传入请求的延迟是自动缩放的一个因素。

+0

我只使用生产环境(因为没有办法处理本地环境中的电子邮件附件)。此外,由于第三方API需要认证,我使用URLfetch的urllib或urllib2包装。因此,我不知道如何访问低级别URLfetch来限制其最后期限。也许你是对的,我应该回到修复昨天使用的POST请求......或者我会看看这些cron作业。无论如何感谢您的回答! – Damien 2011-06-16 15:44:04

+0

我并不积极,但我认为电子邮件处理程序也应该被归类为URLFetch超时目的的“脱机请求”,因此排队任务队列任务可能不是必需的。 – 2011-06-17 03:49:07

+0

关于直接使用urlfetch扩展urlfetch截止日期,您可以这样做:http://blog.notdot.net/2009/11/API-call-hooks-for-fun-and-profit(请参阅该帖子的末尾) – 2011-06-17 03:49:57