Pregunta

Tengo dos instancias de la aplicación del motor de ejecución de las aplicaciones que quiero comunicarme con una interfaz Restful.Una vez que los datos de uno se actualiza, se llama a una web de gancho en el segundo que van a recuperar una copia actualizada de los datos para su propio sistema.Dentro de 'sitio1' tengo:

 from google.appengine.api import urlfetch

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

En el interior del controlador para data_updated en 'site2' tengo:

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

Hay muy poca información que se transmite entre los dos sitios, pero me aparece el siguiente error.He intentado aumentar el plazo de 10 segundos, pero esto aún no funciona.

 DeadlineExceededError: ApplicationError: 5 

¿Alguien puede proporcionar información sobre qué puede estar pasando?

Gracias - Richard

¿Fue útil?

Solución 2

Cambiar el método de

  result = urlfetch.fetch(url)

hasta

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

ha corregido los errores de fecha límite.

De la documentación de urlfetch :

fecha límite La cantidad máxima de tiempo para esperar una respuesta del host remoto, como un número de segundos.Si el host remoto no responder en este período de tiempo, se genera un error de descarga.

El tiempo dedicado a esperar una solicitud no cuenta para la cuota de CPU para la solicitud.Cuenta para el temporizador de solicitud.Si la aplicación El temporizador de solicitud expira antes de que vuelva la llamada de recuperación de URL, la llamada es cancelado.

La fecha límite puede ser de hasta un máximo de 60 segundos para los administradores de solicitudes. y 10 minutos para los controladores de tareas en cola y cron.Si el plazo es Ninguno, la fecha límite está establecida en 5 segundos.

Otros consejos

Aplicación del Motor urlfetch no siempre se comportan como se espera, usted tiene 10 segundos para recuperar la dirección URL.Suponiendo que el URL que usted está tratando de recuperar está en marcha y funcionando, usted debería ser capaz de captar la DeadlineExceededError llamando from google.appengine.runtime import apiproxy_errors y luego envolver la urlfetch llamada dentro de un bloque try/except el uso de except apiproxy_errors.DeadlineExceededError:.

Respuesta pertinente aquí.

¿Ha intentado consultar manualmente las URL (www.site2.com/data_updated y www.site1.com/get_new_data) con curl o de otra manera para asegurarse de que responden dentro del límite de tiempo?Incluso si la cantidad de datos que deben transferirse es pequeña, es posible que haya un problema con el controlador que está causando un retraso en la devolución de los resultados.

La cantidad de datos que se transfieren no es el problema aquí, la latencia sí.

Si la aplicación con la que está hablando a menudo tarda> 10 segundos en responder, tendrá que usar un servidor de "devolución de llamada proxy" en otra plataforma en la nube (EC2, etc.). Si puede esperar un tiempo el nuevoSe supone que las instancias de backend relajan un poco los límites de tiempo de urlfetch.

Si el tiempo de respuesta promedio es <10 segundos y solo unos pocos fallan, vuelva a intentarlo unas cuantas veces.Espero por su bien que las llamadas sean idempotentes (es decir, para que un reintento no tenga efectos adversos).Si no es así, es posible que pueda colocar su propia capa encima; es un poco doloroso pero funciona bien, es lo que hacemos.

J

El documento de GAE ahora establece que el plazo puede ser de 60 segundos:

result = urlfetch(url,deadline=60,method=urlfetch.POST)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top