2012-04-05 10 views
1

Ich habe eine Google App Engine-Anwendung implementiert, die Dokumente in bestimmte Ordner in Google Text & Tabellen hochlädt. Vor einem Monat fing ich an, Probleme mit der Reaktionszeit zu haben (Frist überschritten auf GdataClient.GetDocList, Abruf-URL-Aufruf, in Gdata Client), wenn ich nach einem bestimmten Ordner in Google Docs frage. Dies führte dazu, dass viele Aufgaben in der Aufgabenwarteschlange aufgeständert wurden.Kann eine Google App Engine-App den Zugriff auf die Google Docs-API blockieren

Als ich das sah, pausierte ich die Warteschlangen für eine Weile - etwa 24 Stunden. Als ich die Warteschlange neu gestartet habe fast alle von wo wieder hochgeladen, außer 10 der Dateien/Aufgaben.

Als ich den GetDocList-Aufruf implementiert habe, habe ich eine Wiederholungs-/Schlaffunktion implementiert, um das gelegentlich auftretende "DeadLineExceeded" zu vermeiden, das ich während meiner .GetNextLink() .href-Schleife bekommen habe. Ich weiß, dass dies kein gutes "Cloud" -Design ist. Aber ich musste dies tun, um es stabil genug für die Produktion zu machen. Für jeden Schlaf verlängere ich die Wartezeit und ich versuche es nur 5 mal. Das letzte Mal warte ich ca. 25 Sekunden bevor ich es erneut versuche.

Was ich denke, ist, dass alle Aufgaben in den Warteschlangen so oft wiederholt wurden (obwohl ich die Aufgaben im Serial-Modus einzeln begrenzt haben. Maximum 5 pro Minute), dass die App Engine App wo in der Google Docs API aufgelistet.

Kann das passieren?

Was muss ich tun, um Google Docs Api erneut von derselben App Engine-Instanz abfragen zu können?

Muss ich die App Engine-App auf eine neue Anwendungs-ID migrieren?

Wenn ich dies aus meiner Entwicklungsumgebung versuche, funktioniert der Code, es fragt die Ordnerstruktur ab und gibt ein Ergebnis innerhalb des Zeitlimits zurück.

Die Ordnerstruktur, die ich abfrage, ist ziemlich groß, was bedeutet, dass ich sie über die .GetNextLink(). Href abrufen muss. In meiner Entwicklungsumgebung enthält die Ordnerstruktur viel weniger Ordner.

Wie auch immer, dies hat seit etwa einem Jahr in der Produktion AppEngine-Instanz sehr gut funktioniert. Aber aufgehört zu arbeiten um den 4. - 5. März.

Der Benutzer-Account, der abgefragt wird, verwendet derzeit 7000 MB (3%) der verfügbaren 205824 MB.

Wenn ich den Code von Dev-Env aber mit völlig anderen Google Apps Domain/App-ID/Google-Konto verwende, kann ich den Fehler nicht reproduzieren.

Wenn ich die Max-Ergebnisse auf 1 (statt 100 oder 50 oder 20) änderte, bin ich mit Unterbrechungen erfolgreich. Aber da das Max-Ergebnis 1 ist, muss ich viele 1000 Mal abfragen, und da ich nur mit maximal 3 hintereinander erfolgreich bin, bis mein exponentielles Back-Off beendet ist, bekomme ich nie mein gesamtes Resultset. Die Ergebnismenge (der Ordner, den ich abfrage habe, besteht aus 300 bis 400 Ordnern (die wiederum aus mindestens 2 - 6 Unterordnern mit pdf-Dateien bestehen)

Ich habe versucht mit max-result 2, dann schlägt der Abruf fehl bei jedem fall. wenn ich wieder zu max-result 1 übergehe, dann gelingt es auf ein oder zwei abholungen hintereinander, aber das reicht nicht aus.Da ich die ganze ordnerstruktur brauche um einen richtigen ordner zum speichern zu finden die Datei in.

Ich habe das aus meiner lokalen Umgebung ausprobiert - also von einer komplett anderen IP-Adresse und es schlägt immer noch fehl. Das bedeutet, dass die app-engine app nicht auf google docs geblockt wird Wechsel von 2 zu 1 beweist das auch.

Fazit: Die langsame Rückkehr Zeit von der Google Docs API muss aufgrund der umfangreichen Anzahl von Dateien und Sammlungen in der Sammlung, die ich durchläuft. Beachten Sie, dass diese Sammlung etwa 3500 MB enthält. Ist das ein Problem?

Protokoll: DocListUrl, um Einträge von = https://docs.google.com/feeds/default/private/full/folder:XXXXXXX/contents?max-results=1 zu erhalten.

Erneut versuchen RetryGetDocList, 1 Sekunde warten.
Wiederholen RetryGetDocList, warten Sie 1 Sekunde.
Wiederholen RetryGetDocList, warten Sie 4 Sekunden.
Wiederholen RetryGetDocList, warten Sie 9 Sekunden.
Erneut versuchen RetryGetDocList, 16 Sekunden warten.
Wiederholen RetryGetDocList, warten Sie 25 Sekunden.


Application: 5
Traceback (jüngste Aufforderung zuletzt): File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", Linie 703, in Anruf handler.post (* Gruppen) Datei "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsHandler.py", Linie 418, in der Post Erfolg = 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) Datei "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsClasses.py", Zeile 404, in Upload collections = GetAllEntries ('https://docs.google.com/feeds/default/private/ voll /% s/Inhalt? max-results = 1 '% (ruleTypeFolderResourceId), Client) Datei "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsClasses.py", Zeile 351, in GetAllEntries Chunk = RetryGetDocList (client.GetDocList, chunk.GetNextLink(). href) File "/base/data/home/apps/XXX/prod-43.358023265943651014/DocsClasses.py", Leitung 202, in RetryGetDocList return Function (uri) Datei "/base/data/home/apps/XXX/prod-43.358023265943651014/gdata/docs/client.py", Zeile 142, in get_doclist auth_token = auth_token, ** kwargs) Datei "/ base/data/home/Apps /XXXX/prod-43.358023265943651014/gdata/client.py ", Zeile 635, in get_feed ** kwargs) Datei" /base/data/home/apps/XXXXX/prod-43.358023265943651014/gdata/client.py ", Zeile 265, in Anfrage uri = uri, auth_token = auth_token, http_request = http_request, ** kwargs) Datei "/base/data/home/apps/XXXX/prod-43.358023265943651014/atom/client.py", Zeile 117, in Anfrage Rückgabe self.http_client.request (http_request) Datei "/base/data/home/apps/XXXXX/prod-43.358023265943651014/atom/http_core.py", Zeile 420, in Anfrage http_request.headers, http_request._body_parts) Datei "/base/data/home/apps/XXXXX/prod-43.358023265943651014/atom/http_core.py", Zeile 497, in _http_request zurück connection.getresponse() Datei "/base/python_runtime/python_dist/lib/python2.5/httplib.py", Zeile 206, in getresponse deadline = self.timeout) Datei "/ base/python_runtime/python_lib/versions/1/google/appengine /api/urlfetch.py ​​", Zeile 263, im Abruf Rückgabe rpc.get_result() Datei" /base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py ", Zeile 592, in get_result Rückkehr selbst.__get_result_hook (Selbst-)

File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", Linie 371, in _get_fetch_result raise DeadlineExceededError (str (err)) DeadlineExceededError: Application : 5

Grüße /Jens

+0

Sind Sie exponentiell rückwärts? https://developers.google.com/google-apps/documents-list/#implementing_exponential_backoff –

+0

Welche Größe hat das Dokument für den Benutzer, von dem Sie das Dokument abrufen? Was du beschreibst ist extrem selten. Können Sie mit dem Entwicklungsserver reproduzieren? Können Sie mit einem anderen Google Mail-Konto reproduzieren? –

+0

Aus den Benutzereinstellungen des Benutzeraccounts kopiert - "Das Benutzerkonto, das abgefragt wird, verwendet derzeit 7000 MB (3%) der verfügbaren 205824 MB." Wenn ich den Code von dev-env verwende, aber mit einem völlig anderen Google Apps Domain/App-ID/Google-Konto, kann ich den Fehler nicht reproduzieren. Ich werde es mit den Produktionseinstellungen von Dev-Env versuchen. – user1315063

Antwort

2

gelegentlich Antworten aus der Dokumentenliste API Google überschreiten die Frist für die HTTP-Anfragen App Engine. Dies kann der Fall sein, wenn extrem große Dokumentenkorpusse in der API zurückgegeben werden.

Um dies zu umgehen, setzen Sie den Parameter max-results auf eine kleinere Zahl als 1000.

Wiederholen Sie die Anfrage auch mit exponential back-off.

Um fehlgeschlagene Uploads zu umgehen, verwenden Sie die Aufgabenwarteschlange in App Engine, um Uploads abzuschließen, sowie resumable upload with the API.

Sie können anfordern, dass das App Engine-Team die Größe des HTTP-Zeitlimits Ihrer Anwendung auf eine große Anzahl von Sekunden erhöht, damit diese Anforderung erfolgreich ausgeführt werden kann. Es ist jedoch selten, dass das Team eine solche Anfrage ohne ein starkes Bedürfnis genehmigt.

+0

Ich verwende exponentielle Back-Off- und Task-Warteschlangen und eine hochladbare Upload-API. – user1315063

+0

Siehe mein Hinzufügen von Protokollen, URL-Beispiel und Ausnahme Beschreibung – user1315063

+0

Die langsame Rückkehr Zeit von Google Docs API muss aufgrund der umfangreichen Menge von Dateien und Sammlungen in der Sammlung, die ich durchlaufe. Beachten Sie, dass diese Sammlung ca. 3500 MB enthält (ca. 2000 - 3000 Dateien). Vic, wie kann ich mich an das App Engine-Team wenden, um die Möglichkeit zu besprechen, das Anforderungstimeout zu verlängern? Vic, wird die API aufgrund dieser Menge an Dateien langsamer und langsamer. Könnte es etwas zu tun haben, dass wir 200 GB Docs Storage Space hinzugefügt haben? – user1315063

Verwandte Themen