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
Vous reculez de façon exponentielle? https://developers.google.com/google-apps/documents-list/#implementing_exponential_backoff –
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? –
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