Question

J'ai deux instances d'applications d'applications en cours d'exécution que je souhaite communiquer avec une interface reposante. Une fois que les données de l'une sont mises à jour, elle appelle un crochet Web sur la seconde qui récupérera une nouvelle copie des données pour son propre système. À l'intérieur de «site1» j'ai:

 from google.appengine.api import urlfetch

 url = www.site2.com/data_updated
 result = urlfetch.fetch(url)

À l'intérieur du gestionnaire de data_updad sur 'Site2' j'ai:

 url = www.site1.com/get_new_data
 result = urlfetch.fetch(url)

Il y a très peu de données passées entre les deux sites mais je reçois l'erreur suivante. J'ai essayé d'augmenter la date limite à 10 secondes, mais cela ne fonctionne toujours pas.

 DeadlineExceededError: ApplicationError: 5 

Quelqu'un peut-il donner un aperçu de ce qui pourrait se passer?

Merci - Richard

Était-ce utile?

La solution 2

Changer la méthode de

  result = urlfetch.fetch(url)

à

  result = urlfetch(url,deadline=2,method=urlfetch.POST)

a corrigé les erreurs de date limite.

Du Documentation URLFetch:

date limiteLe temps maximum pour attendre une réponse de l'hôte distant, en plusieurs secondes. Si l'hôte distant ne répond pas dans ce laps de temps, un téléchargement est augmenté.

Le temps passé à attendre une demande ne compte pas pour le quota du CPU pour la demande. Il compte pour la minuterie de demande. Si le temporisateur de la demande d'application expire avant que l'appel de récupération d'URL ne revienne, l'appel est annulé.

La date limite peut atteindre un maximum de 60 secondes pour les gestionnaires de demandes et 10 minutes pour les gestionnaires de la file d'attente des tâches et des travaux CRON. Si la date limite n'est pas, la date limite est fixée à 5 secondes.

Autres conseils

Moteur d'applications urlfetch Ne se comporte pas toujours comme prévu, vous avez environ 10 secondes pour récupérer l'URL. En supposant que l'URL que vous essayez de récupérer est opérationnelle, vous devriez pouvoir attraper le DeadlineExceededError en appelant from google.appengine.runtime import apiproxy_errors puis envelopper l'appel d'urlfetch dans un bloc d'essai / sauf en utilisant except apiproxy_errors.DeadlineExceededError:.

Réponse pertinente ici.

Avez-vous essayé manuellement d'interroger les URL (www.site2.com/data_updated et www.site1.com/get_new_data) avec curl Ou autrement pour s'assurer qu'ils répondent dans le délai? Même si la quantité de données qui doit être transférée est petite, il y a peut-être un problème avec le gestionnaire qui entraîne un retard dans le retour des résultats.

La quantité de données transférées n'est pas le problème ici, la latence est.

Si l'application à qui vous parlez prend souvent> 10 secondes pour répondre, vous devrez utiliser un serveur de "rappel proxy" sur une autre plate-forme cloud (EC2, etc.) si vous pouvez vous retenir pendant un certain temps les nouvelles instances backend censé détendre un peu les limites de temps d'urlfetch.

Si le temps de réponse moyen est <10 secondes, et que seuls quelques-uns échouent, réessayez à quelques reprises. J'espère que pour vous, les appels sont idempotents (c'est-à-dire afin qu'une réessayer n'ait pas d'effets négatifs). Sinon, vous pourrez peut-être rouler votre propre couche sur le dessus - c'est un peu douloureux, mais ça marche bien, c'est ce que nous faisons.

J

Le Doc Gae indique désormais que la date limite peut être de 60 secondes:

result = urlfetch(url,deadline=60,method=urlfetch.POST)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top