3

我的應用程序需要對每個請求執行許多數據存儲操作。我想並行運行它們以獲得更好的響應時間。App引擎上的異步urlfetch

對於數據存儲庫更新,我正在執行批量放入操作,因此它們都是異步發生的,這可以節省許多毫秒。 App Engine允許並行更新up to 500 entities

但我還沒有找到一個內置的函數,允許不同類型的數據倉庫提取並行執行。

由於App Engine允許urlfetch調用to run asynchronously,我爲每種類型創建了一個getter URL,它將查詢結果作爲JSON格式的文本返回。現在我的應用程序可以對這些可以並行訪問數據存儲區的URL執行異步urlfetch調用。

此技術適用於少量並行請求,但App Engine在嘗試同時運行超過5個或10個這些urlfetch調用時拋出錯誤。

我現在只測試,所以每個urlfetch是相同的查詢;因爲它們可以在小批量中正常工作,但由於同時發生的一些請求而失敗,我認爲它必須與異步urlfetch調用有關。

我的問題是:

  1. 是否有限定,可以異步運行的urlfetch.create_rpc()調用的次數?
  2. 同步urlfecth.fetch()函數有一個'deadline'參數,它將允許函數在發生失敗之前等待最多10秒的響應。有什麼辦法可以告訴urlfetch.create_rpc()需要等待多長時間?
  3. 下面顯示的錯誤是什麼意思?
  4. 是否有更好的服務器端技術來並行運行不同類型的數據存儲區提取?

    文件 「/base/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py」,線501,在get_result 返回自.__ get_result_hook(個體) 文件「/鹼/ python_lib /版本/ 1 ()('Wait()'請求被來自另一個回調的異常中斷'',DownloadError('的ApplicationError:5」,))

+1

谷歌現在已經解決了這個問題,而不需要像asynctools這樣的第三方工具。你現在可以同時獲取和放置。請參閱SDK 1.5.0版本的發佈說明:http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes「增加了對異步調用數據存儲的db.py支持。可用函數爲get_async() ,put_async(),delete_async(),allocate_ids_async()。在異步數據存儲函數的返回值上調用get_result以阻止該調用。 – 2011-07-06 04:26:23

回答

2

由於App Engine允許異步urlfetch調用,但不允許異步數據存儲獲取,因此我試圖使用urlfetch RPC並行地從數據存儲中檢索。

缺乏異步數據存儲的獲得是一個公認的問題:

http://code.google.com/p/googleappengine/issues/detail?id=1889

而且現在有一個第三方的工具,它允許異步查詢:

http://code.google.com/p/asynctools/

「asynctools是庫允許您並行執行Google App Engine API調用,API調用可以混合在一起並排隊,然後全部並行啓動。「

這正是我所期待的。

+1

GAE 1.5+現在有異步數據存儲API。 – 2011-07-02 20:04:06

0

雖然我很害怕,我不能直接回答任何您提出的問題時,我認爲我應該告訴你所有的研究ALO的這些行可能不會導致您爲您的問題的工作解決方案。

問題是數據存儲區的寫入時間比讀取時間要長得多,所以如果您找到一種方法來最大限度地減少可能發生的讀取次數,那麼您的代碼將在很長時間內無法完成將相應的寫入到您已閱讀的所有實體中。

我會認真考慮重新考慮您的數據存儲類的設計,以減少需要發生的讀取和寫入次數,因爲這將很快成爲您的應用程序的瓶頸。

+0

由於App Engine允許異步批量放入,寫入不是問題。儘管個人投入花費的時間比個人花費的時間更長,但通過並行投入花費總時間是可以接受的。我試圖弄清楚如何並行執行不同類型的批量提取以實現與讀取相同的操作。 – 2009-12-27 15:52:36

0

您是否考慮過使用TaskQueues來處理稍後要執行的請求?

如果任務返回4xx狀態,則它將被視爲失敗並將在以後重試 - 因此您可以將錯誤重新傳回並讓任務隊列處理重試請求直至成功。另外,通過一些桶大小和速率的實驗,你可以讓任務隊列減慢請求的速度,以至於不會使數據庫最大化

還有一個很好的包裝器(deferred.defer)更簡單 - 您可以對應用程序中的(幾乎)任何功能進行延遲調用。

+0

我不想推遲請求。我正在嘗試同時執行許多數據存儲操作並將結果返回給用戶。 App Engine提供批量放入以執行不同類型的併發寫入。但我還沒有找到一種方法來做不同類型的併發讀取。 – 2009-12-31 04:48:30