Domanda

Ho due istanze di applicazioni del motore di app in esecuzione che desidero comunicare con un'interfaccia Restful.Una volta aggiornati i dati di uno, chiama un web hook sul secondo che recupererà una nuova copia dei dati per il proprio sistema. All'interno di "site1" ho:

 from google.appengine.api import urlfetch

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

All'interno del gestore di data_updated su "site2" ho:

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

I dati passati tra i due siti sono pochissimi ma ricevo il seguente errore.Ho provato ad aumentare la scadenza a 10 secondi ma ancora non funziona.

 DeadlineExceededError: ApplicationError: 5 

Qualcuno può fornire informazioni su ciò che potrebbe accadere?

Grazie - Richard

È stato utile?

Soluzione 2

Modifica del metodo da

  result = urlfetch.fetch(url)

a

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

ha corretto gli errori di scadenza.

Dalla documentazione urlfetch :

scadenza Il tempo massimo di attesa per una risposta da host remoto, come numero di secondi.Se l'host remoto non lo fa risponde in questo lasso di tempo, viene sollevata un'eccezione DownloadError.

Il tempo trascorso in attesa di una richiesta non viene conteggiato per la quota della CPU per la richiesta.Conta ai fini del timer della richiesta.Se l'app il timer della richiesta scade prima che la chiamata URL Fetch ritorni, la chiamata è annullato.

La scadenza può essere fino a un massimo di 60 secondi per i gestori delle richieste e 10 minuti per la coda delle attività e i gestori di lavori cron.Se la scadenza è Nessuno, la scadenza è fissata a 5 secondi.

Altri suggerimenti

Il urlfetch di App Engine non si comporta sempre come previsto, hai circa 10 secondi per recuperare l'URL.Supponendo che l'URL che stai cercando di recuperare sia attivo e in esecuzione, dovresti essere in grado di catturare DeadlineExceededError chiamando from google.appengine.runtime import apiproxy_errors e quindi avvolgendo la chiamata urlfetch in un blocco try / tranne utilizzando except apiproxy_errors.DeadlineExceededError:.

Risposta pertinente qui .

Hai provato a interrogare manualmente gli URL (www.site2.com/data_updated e www.site1.com/get_new_data) con curl o in altro modo per assicurarti che rispondano entro il limite di tempo?Anche se la quantità di dati che devono essere trasferiti è piccola, forse c'è un problema con il gestore che sta causando un ritardo nella restituzione dei risultati.

La quantità di dati trasferiti non è il problema qui, la latenza lo è.

Se l'app con cui stai parlando impiega spesso> 10 secondi per rispondere, dovrai utilizzare un server di "richiamata proxy" su un'altra piattaforma cloud (EC2, ecc.) Se riesci a tenere a bada per un po 'il nuovole istanze di backend dovrebbero rilassare un po 'i limiti di tempo di urlfetch.

Se il tempo di risposta medio è <10 secondi e solo pochi non riescono, riprova un paio di volte.Spero per il tuo bene che le chiamate siano idempotenti (cioè in modo che un nuovo tentativo non abbia effetti negativi).In caso contrario, potresti essere in grado di avvolgere il tuo livello sopra: è un po 'doloroso ma funziona bene, è quello che facciamo.

J

Il documento GAE ora afferma che la scadenza può essere di 60 secondi:

result = urlfetch(url,deadline=60,method=urlfetch.POST)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top