2012-04-05 112 views
1

我已經實施了一個Google App Engine應用程序,可將文檔上傳到Google文檔中的特定文件夾。一個月前,當我在Google文檔中查詢特定文件夾時,我開始出現響應時間問題(GdataClient.GetDocList超時,Gdata Client中的fetch-url調用)。這導致很多任務在Task Queue中排隊。Google App Engine應用可否被禁止訪問Google Docs API

當我看到這個,我暫停了一會兒 - 約24小時的隊列。當我重新啓動隊列時,幾乎所有的地方都再次上傳,除了10個文件/任務。

當我實現了GetDocList調用時,我實現了一個重試/休眠功能,以避免在我的.GetNextLink()。href-loop期間有時出現斷斷續續的「DeadLineExceeded」。我知道這不是一個好的「雲」設計。但我不得不這樣做才能讓它足夠穩定以用於生產。對於每一次睡眠,我都會延長等待時間,而我只會重試5次。我最後一次等待約25秒後再重試。

我認爲隊列中的所有任務都重試了很多次(儘管我限制了在串行模式下運行的任務,一次最多5次),App Engine應用程序所在的位置黑名單從Google Docs Api中列出。

這可能發生嗎?

我需要做些什麼才能夠從同一App Engine實例中再次查詢Google Docs Api?

我是否需要將App Engine應用程序遷移到新的應用程序ID?

當我從我的開發環境嘗試這個代碼時,它會查詢文件夾結構並在限定時間內返回結果。

我查詢的文件夾結構相當大,這意味着我需要通過.GetNextLink()。href取得它們。在我的開發環境中,文件夾結構包含更少的文件夾。

無論如何,這在生產AppEngine實例中已經運行了大約一年。但在3月4日至5日左右停止工作。

被查詢的用戶帳戶當前正在使用7000 MB(3%)的可用205824 MB。

當我使用dev-env的代碼,但使用完全不同的Google Apps domain/app-id/google帳戶時,我無法重現該錯誤。

當我將最大結果更改爲1(而不是100或50或20)時,我間斷地成功。但是,由於最大結果是1,我需要查詢許多1000次,並且因爲我只能連續執行最大3次,直到我的指數退避退出,我永遠不會得到我的整個結果集。結果集(我查詢的文件夾由300到400個文件夾組成(其中包含至少2 - 6個包含pdf文件的子文件夾)

我試過用max-result 2,然後取出失敗如果我改回max-result 1,那麼它在一行中的一次或兩次抓取都會成功,但這並不是很好,因爲我需要整個文件夾結構才能找到一個正確的文件夾來存儲文件英寸

我試過這個從我的本地環境 - 即從一個完全不同的IP地址,它仍然失敗,這意味着應用程序引擎應用程序不會阻止訪問谷歌文檔。從2變爲1也證明了這一點。

結論: Google文檔API的返回時間很慢必須歸因於我正在循環的集合中的大量文件和集合。請記住,這個集合包含大約3500 Mb。這是一個問題嗎?

日誌: DocListUrl獲取= https://docs.google.com/feeds/default/private/full/folder:XXXXXXX/contents?max-results=1的條目。

重試RetryGetDocList,等待1秒鐘。
重試RetryGetDocList,等待1秒鐘。
重試RetryGetDocList,等待4秒鐘。
重試RetryGetDocList,等待9秒鐘。
重試RetryGetDocList,等待16秒鐘。
重試RetryGetDocList,等待25秒。


的ApplicationError:5
回溯(最近通話最後一個): 文件 「/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py」,線路703,在通話 handler.post(*組) 文件 「/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsHandler.py」,線418,在後 成功= uploader.Upload(blob_reader,fileToUpload。 uploadSize,fileToUpload.MainFolder,fileToUpload.ruleTypeReadableId,fileToUpload.rootFolderId,fileToUpload.salesforceLink,fileToUpload.rootFolder,fileToUpload.type_folder_name,fileToUpload.file_name,currentUser,client,logObj) 文件「/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsClasses.py」,第404行,上傳 collections = GetAllEntries('https://docs.google.com/feeds/default/private/ full /%s/contents?max-results = 1'%(ruleTypeFolderResourceId),client) 文件「/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsClasses.py」,行351,在GetAllEntries 塊= RetryGetDocList(client.GetDocList,chunk.GetNextLink()。href) 文件「/base/data/home/apps/XXX/prod-43.358023265943651014/DocsClasses.py」,行202,在RetryGetDocList return functionCall(uri) 文件「/base/data/home/apps/XXX/prod-43.358023265943651014/gdata/docs/client.py」,第142行,在get_doclist中 auth_token = auth_token,** kwargs) 文件「/ base/data/home /應用/XXXX/prod-43.358023265943651014/gdata/client.py「,第635行,在get_feed中 ** kwargs) 文件」/base/data/home/apps/XXXXX/prod-43.358023265943651014/gdata/client.py「,行265,請求 uri = uri,auth_token = auth_token,http_request = http_request,** kwargs) 文件「/base/data/home/apps/XXXX/prod-43.358023265943651014/atom/client.py」,第117行,in請求 返回self.http_client.request(HTTP_REQUEST) 文件 「/base/data/home/apps/XXXXX/prod-43.358023265943651014/atom/http_core.py」,線420,在請求 http_request.headers,http_request._body_parts) 文件「/base/data/home/apps/XXXXX/prod-43.358023265943651014/atom/http_core.py」,第497行,在_http_request中 返回connection.getresponse() 文件「/base/python_runtime/python_dist/lib/python2.5/httplib.py」,第206行,在getresponse中 deadline = self.timeout) 文件「/ base/python_runtime/python_lib/versions/1/google/appengine /api/urlfetch.py​​「,第263行,取回 返回rpc.get_result() 文件」/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py「,第592行,在get_result 迴歸自我。__get_result_hook(個體經營)

文件 「/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py​​」,線路371,在_get_fetch_result 提高DeadlineExceededError(STR(ERR)) DeadlineExceededError:的ApplicationError :5

問候 /延

+0

你指數退休了嗎? https://developers.google.com/google-apps/documents-list/#implementing_exponential_backoff – 2012-04-05 14:18:46

+0

爲您提取的用戶設置的文檔大小是多少?你所描述的是非常罕見的。你可以用開發服務器重現嗎?您可以使用其他Gmail帳戶重現嗎? – 2012-04-07 04:24:39

+0

從用戶帳戶的文檔設置複製 - 「被查詢的用戶帳戶當前正在使用可用的205824 MB的7000 MB(3%)。」當我使用dev-env的代碼,但使用完全不同的Google Apps domain/app-id/google帳戶時,我無法重現該錯誤。我將嘗試使用dev-env的生產設置。 – user1315063 2012-04-07 18:04:01

回答

2

在從谷歌文檔列表API場合響應超過App Engine的HTTP請求的最後期限。在API中返回文檔的非常大的語料庫時可能會出現這種情況。

要解決此問題,請將max-results參數設置爲小於1000的數字。

此外,請使用exponential back-off重試請求。

要解決上傳失敗問題,請使用App Engine中的任務隊列完成上傳,以及resumable upload with the API

您可以請求App Engine團隊將應用程序的HTTP超時大小增加到允許此請求成功的大量秒數。但是,團隊在沒有強烈需求的情況下批准此類請求的情況很少。

+0

我正在使用指數回退和任務隊列以及可恢復的上傳API。 – user1315063 2012-04-06 19:42:06

+0

查看我的日誌,url-sample和異常描述 – user1315063 2012-04-06 19:47:07

+0

從Google Docs API返回緩慢的時間必須是由於我正在循環訪問的集合中的大量文件和集合。請記住,該集合包含大約3500 Mb(大約2000 - 3000個文件)。 Vic,我如何聯繫App Engine團隊討論延長請求超時的可能性? Vic,由於文件數量太多,API會變得越來越慢。它可以做些什麼,我們已經增加了200GB的文檔存儲空間? – user1315063 2012-04-24 14:11:28