我已經實施了一個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
問候 /延
你指數退休了嗎? https://developers.google.com/google-apps/documents-list/#implementing_exponential_backoff – 2012-04-05 14:18:46
爲您提取的用戶設置的文檔大小是多少?你所描述的是非常罕見的。你可以用開發服務器重現嗎?您可以使用其他Gmail帳戶重現嗎? – 2012-04-07 04:24:39
從用戶帳戶的文檔設置複製 - 「被查詢的用戶帳戶當前正在使用可用的205824 MB的7000 MB(3%)。」當我使用dev-env的代碼,但使用完全不同的Google Apps domain/app-id/google帳戶時,我無法重現該錯誤。我將嘗試使用dev-env的生產設置。 – user1315063 2012-04-07 18:04:01