Frage

Ich habe zwei Instanzen von App Engine-Anwendungen ausgeführt, die ich mit einer Restful-Schnittstelle kommunizieren möchte.Sobald die Daten von einem aktualisiert wurden, ruft es beim zweiten einen Web-Hook auf, der eine neue Kopie der Daten für sein eigenes System abruft. In 'site1' habe ich:

 from google.appengine.api import urlfetch

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

Im Handler für data_updated auf 'site2' habe ich:

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

Es werden nur sehr wenige Daten zwischen den beiden Standorten übertragen, aber ich erhalte die folgende Fehlermeldung.Ich habe versucht, die Frist auf 10 Sekunden zu erhöhen, aber das funktioniert immer noch nicht.

 DeadlineExceededError: ApplicationError: 5 

Kann jemand einen Einblick in das geben, was passieren könnte?

Danke - Richard

War es hilfreich?

Lösung 2

Ändern der Methode von

  result = urlfetch.fetch(url)

bis

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

hat die Deadline-Fehler behoben.

Aus der URL-Abrufdokumentation :

Frist Die maximale Wartezeit auf eine Antwort von der Remote-Host als Anzahl von Sekunden.Wenn der Remote-Host dies nicht tut Wenn Sie in dieser Zeit antworten, wird ein DownloadError ausgelöst.

Die Wartezeit auf eine Anforderung zählt nicht für das CPU-Kontingent für die Anfrage.Es zählt für den Anforderungszeitgeber.Wenn die App Der Anforderungszeitgeber läuft ab, bevor der URL-Abruf zurückkehrt. Der Aufruf lautet abgebrochen.

Die Frist für Anforderungshandler kann maximal 60 Sekunden betragen und 10 Minuten für Aufgabenwarteschlange und Cron-Job-Handler.Wenn die Frist ist Keine, die Frist ist auf 5 Sekunden festgelegt.

Andere Tipps

Der urlfetch von App Engine verhält sich nicht immer wie erwartet. Sie haben ca. 10 Sekunden Zeit, um die URL abzurufen.Angenommen, die URL, die Sie abrufen möchten, ist aktiv und sollte in der Lage sein, den DeadlineExceededError abzurufen, indem Sie from google.appengine.runtime import apiproxy_errors aufrufen und den urlfetch-Aufruf dann mit except apiproxy_errors.DeadlineExceededError: in einen try / exception-Block einschließen.

Relevante Antwort hier .

Haben Sie versucht, die URLs (www.site2.com/data_updated und www.site1.com/get_new_data) manuell mit curl abzufragen oder auf andere Weise sicherzustellen, dass sie innerhalb des Zeitlimits antworten?Selbst wenn die zu übertragende Datenmenge gering ist, liegt möglicherweise ein Problem mit dem Handler vor, das zu einer Verzögerung bei der Rückgabe der Ergebnisse führt.

Die übertragene Datenmenge ist hier nicht das Problem, die Latenz beträgt.

Wenn die App, mit der Sie sprechen, häufig> 10 Sekunden benötigt, um zu antworten, müssen Sie einen "Proxy Callback" -Server auf einer anderen Cloud-Plattform (EC2 usw.) verwenden. Wenn Sie die neue App für eine Weile zurückhalten könnenBackend-Instanzen sollen die Zeitlimits für das URL-Abrufen etwas lockern.

Wenn die durchschnittliche Antwortzeit <10 Sekunden beträgt und nur relativ wenige ausfallen, versuchen Sie es einfach einige Male.Ich hoffe für Sie, dass die Anrufe idempotent sind (d. H. Damit ein erneuter Versuch keine nachteiligen Auswirkungen hat).Wenn nicht, können Sie möglicherweise Ihre eigene Ebene darüber rollen - es ist ein bisschen schmerzhaft, aber es funktioniert in Ordnung, genau das tun wir.

J

Das GAE-Dokument gibt jetzt an, dass die Frist 60 Sekunden betragen kann:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top