2012-04-05 2 views
1

J'ai mis en place une application Google App Engine qui télécharge des documents dans des dossiers spécifiques dans Google Docs. Il y a un mois, j'ai commencé à avoir des problèmes de temps de réponse (dépassement de délai sur GdataClient.GetDocList, appel fetch-url, dans Gdata Client) lors de l'interrogation d'un dossier spécifique dans Google Docs. Cela a causé beaucoup de tâches à faire la queue dans la file d'attente des tâches. Lorsque j'ai vu cela, j'ai suspendu les files d'attente pendant un moment - environ 24 heures. Lorsque j'ai redémarré la file d'attente presque tout le où téléchargé à nouveau, sauf 10 des fichiers/tâches. Lorsque j'ai implémenté l'appel GetDocList, j'ai implémenté une fonctionnalité Retry/Sleep pour éviter le "DeadLineExceeded" parfois intermittent que j'ai reçu lors de ma boucle .GetNextLink(). Href-loop. Je sais que ce n'est pas un bon design "Cloud". Mais j'ai été forcé de le faire pour le rendre assez stable pour la production. Pour chaque sommeil, je prolonge le temps d'attente et je ne retente que 5 fois. La dernière fois que j'attends environ 25 secondes avant de réessayer. Ce que je pense, c'est que toutes les tâches dans les files d'attente réessaient tant de fois (même si j'ai limité les tâches à exécuter en mode série, un à la fois. liste noire de l'API Google Docs.Une application Google App Engine ne peut plus accéder à l'API Google Docs

Est-ce que cela peut arriver?

Que dois-je faire pour pouvoir interroger à nouveau Google Docs Api à partir de la même instance d'App Engine? Dois-je migrer l'application App Engine vers un nouvel ID d'application? Lorsque j'essaye ceci de mon environnement de développement, le code fonctionne, il interroge la structure de dossier et renvoie un résultat dans le délai.

La structure de dossiers que j'interroge est assez grande, ce qui signifie que je dois les récupérer via le .GetNextLink(). Href. Dans mon environnement de développement, la structure des dossiers contient beaucoup moins de dossiers.

De toute façon, cela a fonctionné très bien pendant environ un an dans l'instance de production AppEngine. Mais a cessé de travailler autour du 4 au 5 mars.

Le compte utilisateur interrogé utilise actuellement 7000 Mo (3%) des 205824 Mo disponibles.

Lorsque j'utilise le code de dev-env mais avec un domaine Google Apps/app-id/google complètement différent, je ne peux pas reproduire l'erreur.

Lorsque j'ai changé les résultats max à 1 (au lieu de 100 ou 50 ou 20), je réussis par intermittence. Mais comme le résultat max est de 1, j'ai besoin d'interroger plusieurs fois 1000, et comme je ne réussis que 3 max. D'affilée, jusqu'à ce que mon back-off exponentiel se termine, je n'ai jamais mon ensemble complet. Le resultset (le dossier que je recherche se compose de 300 à 400 dossiers (qui se compose d'au moins 2 à 6 sous-dossiers avec des fichiers pdf)

J'ai essayé avec max-résultat 2, puis l'extraction échoue Si je reviens à max-résultat 1, alors il réussit sur un ou deux extractions d'affilée, mais cela ne suffit pas, car j'ai besoin de toute la structure de dossiers pour pouvoir trouver le bon dossier à stocker le fichier en.

J'ai essayé ceci de mon environnement local - c.-à-d. d'une adresse IP complètement différente et elle échoue toujours.Cela signifie que l'application de moteur d'application n'est pas bloquée d'accéder à google docs. passer de 2 à 1 le prouve également.Conclusion: Le temps de retour lent de l'API Google Docs doit être dû à la quantité importante de fichiers et de collections dans la collection que je parcours. Gardez à l'esprit que cette collection contient environ 3500 Mb. Est-ce un problème?

Log: DocListUrl pour obtenir des entrées de = https://docs.google.com/feeds/default/private/full/folder:XXXXXXX/contents?max-results=1. Réessayer RetryGetDocList, attendez 1 seconde.


Retrying RetryGetDocList, attendez 1 seconde.
Retrying RetryGetDocList, attendez 4 secondes.
Retrying RetryGetDocList, attendez 9 secondes.
Retrying RetryGetDocList, attendez 16 secondes.
Retrying RetryGetDocList, attendez 25 secondes.


ApplicationError: 5
retraçage (appel le plus récent en dernier): Fichier "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", ligne 703, en appel handler.post (* groupes) fichier "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsHandler.py", ligne 418, en poste succès = uploader.Upload (blob_reader, fileToUpload. uploadSize, fileToUpload.MainFolder, fileToUpload.ruleTypeReadableId, fichierToUpload.rootFolderId, fichierToUpload.salesforceLink, fichierToUpload.rootFolder, fichierToUpload.type_folder_name, fichierToUpload.file_name, currentUser, client, logObj) Fichier "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsClasses.py", ligne 404, dans le fichier collections = GetAllEntries ('https://docs.google.com/feeds/default/private/ full /% s/contenu? max-results = 1 '% (ruleTypeFolderResourceId), client) Fichier "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsClasses.py", ligne 351, dans GetAllEntries = RetryGetDocList (client.GetDocList, chunk.GetNextLink(). href) fichier "/base/data/home/apps/XXX/prod-43.358023265943651014/DocsClasses.py", ligne 202, dans RetryGetDocList FunctionCall retour (uri) Fichier "/base/data/home/apps/XXX/prod-43.358023265943651014/gdata/docs/client.py", ligne 142, dans get_doclist auth_token = auth_token, ** kwargs) Fichier "/ base/data/home/applications /XXXX/prod-43.358023265943651014/gdata/client.py ", ligne 635, dans get_feed ** kwargs) Fichier" /base/data/home/apps/XXXXX/prod-43.358023265943651014/gdata/client.py ", ligne 265, dans la requête uri = uri, auth_token = auth_token, http_request = http_request, ** kwargs) Fichier "/base/data/home/apps/XXXX/prod-43.358023265943651014/atom/client.py", ligne 117, dans demande self.http_client.request de retour (http_request) fichier "/base/data/home/apps/XXXXX/prod-43.358023265943651014/atom/http_core.py", ligne 420, à la demande http_request.headers, http_request._body_parts) Fichier "/base/data/home/apps/XXXXX/prod-43.358023265943651014/atom/http_core.py", ligne 497, dans _http_request return connection.getresponse() Fichier "/base/python_runtime/python_dist/lib/python2.5/httplib.py", ligne 206, dans getresponse deadline = self.timeout) Fichier "/ base/python_runtime/python_lib/versions/1/google/appengine /api/urlfetch.py ​​", ligne 263, dans la recherche return rpc.get_result() Fichier" /base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py ", ligne 592, dans get_result rentrez-vous.__get_result_hook (auto)

Fichier "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", ligne 371, dans _get_fetch_result DeadlineExceededError raise (str (err)) DeadlineExceededError: ApplicationError : 5

Cordialement /Jens

+0

Vous reculez de façon exponentielle? https://developers.google.com/google-apps/documents-list/#implementing_exponential_backoff –

+0

Quelle est la taille du jeu de documents pour l'utilisateur que vous récupérez? Ce que vous décrivez est extrêmement rare. Pouvez-vous reproduire avec le serveur de développement? Pouvez-vous reproduire avec un compte Gmail différent? –

+0

Copié à partir des paramètres de doc du compte utilisateur - "Le compte utilisateur interrogé utilise actuellement 7000 Mo (3%) des 205824 Mo disponibles." Lorsque j'utilise le code de dev-env mais avec un domaine Google Apps/app-id/google complètement différent, je ne peux pas reproduire l'erreur. Je vais essayer avec les paramètres de production de dev-env. – user1315063

Répondre

2

sur les réponses occasion de l'API Google Documents List dépassent la date limite pour les demandes App Engine HTTP. Cela peut être le cas avec de très grands corpus de documents renvoyés dans l'API.

Pour contourner ce problème, définissez le paramètre max-results sur un nombre inférieur à 1000. Répétez la requête en utilisant exponential back-off. Pour éviter les téléchargements, utilisez la file d'attente des tâches dans App Engine pour terminer les téléchargements, ainsi que resumable upload with the API.

Vous pouvez demander à l'équipe App Engine d'augmenter la taille du délai d'attente HTTP de votre application à un grand nombre de secondes, ce qui permettrait à cette demande de réussir. Cependant, il est rare que l'équipe approuve une telle demande sans un fort besoin.

+0

J'utilise exponentielle back-off et Task Queues et API de téléchargement resumable. – user1315063

+0

Voir mon ajout de journaux, url-sample et description d'exception – user1315063

+0

Le temps de retour lent de l'API Google Docs doit être dû à la quantité importante de fichiers et de collections dans la collection que je parcours. Gardez à l'esprit que cette collection contient environ 3500 Mo (environ: 2000 - 3000 fichiers). Vic, comment puis-je contacter l'équipe App Engine pour discuter de la possibilité d'étendre le délai d'attente de la demande? Vic, l'API deviendra-t-elle plus lente et plus lente en raison de cette quantité de fichiers. Pourrait-il avoir quelque chose à faire que nous avons ajouté 200 Go d'espace de stockage Docs? – user1315063