【问题标题】:App Engine TimeOut Error: Serving a third-party API with an image stored on App EngineApp Engine 超时错误:使用存储在 App Engine 上的图像为第三方 API 提供服务
【发布时间】:2011-06-16 10:21:47
【问题描述】:

我正在 App Engine 上用 Python 构建一个应用程序。我的应用程序接收图像作为电子邮件附件。当收到一封电子邮件时,我抓取图像并需要将其发送到第三方 API。

我做的第一件事是:
1) 使用图像数据向第三方 API 发出 POST 请求

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

我现在正在做的第二件事是
1) 将图像放入 Datastore
中的传入电子邮件中 2) 将其放入 memcache
3) 向 API 发送一个为图片提供服务的 URL(使用 memcache,如果在 memcache 中找不到,则使用 Datastore)

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

更准确地说,我在日志中看到了两个请求:
- 首先,收到的电子邮件
- 然后,第三方 API HTTP 调用我给他的 URL 上的图像

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

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

我的问题:
1) App Engine 可以处理来自它应该得到响应的主机的请求吗?
2)如果没有,我该如何绕过这个问题?

【问题讨论】:

    标签: python image api google-app-engine timeout


    【解决方案1】:

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

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

    回答您的第一个问题:如果您使用的是 dev_appserver,不,当您有一个外部请求待处理时,您根本无法处理任何请求; dev_appserver 是单线程的,一次处理 1 个请求。生产环境应该能够扩展以做到这一点;但是,如果您的处理程序等待 10 秒以获取 urlfetch,则调度程序可能无法很好地扩展您的应用程序,因为传入请求的延迟是自动扩展的因素之一。

    【讨论】:

    • 我只在生产环境中工作(因为在本地环境中无法处理电子邮件附件)。此外,由于第三方 API 需要身份验证,我使用 URLfetch 的 urllib 或 urllib2 包装器。因此,我不知道如何访问低级 URLfetch 以增加其截止日期限制。也许你是对的,我应该回去修复我昨天使用的 POST 请求......或者我会看看这些 cron 作业。无论如何感谢您的回答!
    • 我不肯定,但我认为出于 URLFetch 超时的目的,电子邮件处理程序也应归类为“离线请求”,因此可能不需要将任务队列任务入队。跨度>
    • 关于在不直接使用 urlfetch 的情况下延长 urlfetch 截止日期,您可以这样做:blog.notdot.net/2009/11/API-call-hooks-for-fun-and-profit(见该帖子的末尾)
    • 感谢您的回答。我终于设法绕过了这个问题。我只是将图像写入 blobstore 并使用 get_serving_url 函数将图像传递给 API。到目前为止,效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2014-04-18
    • 2011-11-19
    • 2010-11-09
    相关资源
    最近更新 更多