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