Pergunta

Tenho duas instâncias de aplicativos do App Engine em execução que desejo comunicar com uma interface Restful.Uma vez que os dados de um são atualizados, ele chama um web hook no segundo que irá recuperar uma nova cópia dos dados para seu próprio sistema. Dentro de 'site1' eu tenho:

 from google.appengine.api import urlfetch

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

Dentro do manipulador de data_updated em 'site2' eu tenho:

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

Há muito poucos dados sendo transmitidos entre os dois sites, mas recebo o seguinte erro.Tentei aumentar o prazo para 10 segundos, mas ainda não funciona.

 DeadlineExceededError: ApplicationError: 5 

Alguém pode fornecer informações sobre o que pode estar acontecendo?

Obrigado - Richard

Foi útil?

Solução 2

Mudando o método de

  result = urlfetch.fetch(url)

para

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

corrigiu os erros de prazo.

Da documentação do urlfetch :

prazo O tempo máximo de espera por uma resposta do host remoto, como um número de segundos.Se o host remoto não responder neste período de tempo, um DownloadError é gerado.

O tempo gasto esperando por uma solicitação não conta para a cota de CPU para o pedido.Ele conta para o cronômetro de solicitação.Se o aplicativo o temporizador de solicitação expira antes que a chamada de busca de URL retorne, a chamada é cancelado.

O prazo pode ser de no máximo 60 segundos para manipuladores de solicitações e 10 minutos para fila de tarefas e manipuladores de cron job.Se o prazo for Nenhum, o prazo está definido para 5 segundos.

Outras dicas

O urlfetch do App Engine nem sempre se comporta como esperado, você tem cerca de 10 segundos para buscar o URL.Supondo que o URL que você está tentando buscar esteja instalado e funcionando, você deve conseguir pegar o DeadlineExceededError chamando from google.appengine.runtime import apiproxy_errors e, em seguida, envolvendo a chamada urlfetch em um bloco try / except usando except apiproxy_errors.DeadlineExceededError:.

Resposta relevante aqui .

Você tentou consultar manualmente os URLs (www.site2.com/data_updated e www.site1.com/get_new_data) com curl ou de outra forma para se certificar de que eles estão respondendo dentro do limite de tempo?Mesmo que a quantidade de dados que precisa ser transferida seja pequena, talvez haja um problema com o manipulador que está causando um atraso no retorno dos resultados.

A quantidade de dados transferidos não é o problema aqui, mas a latência.

Se o aplicativo com o qual você está falando costuma demorar> 10 segundos para responder, você terá que usar um servidor de "retorno de chamada proxy" em outra plataforma de nuvem (EC2, etc.). Se você puder esperar um pouco o novoas instâncias de back-end devem relaxar um pouco os limites de tempo do urlfetch.

Se o tempo médio de resposta for <10 segundos e apenas alguns poucos estiverem falhando, tente novamente algumas vezes.Espero que, para o seu bem, as chamadas sejam idempotentes (ou seja, para que uma nova tentativa não tenha efeitos adversos).Se não, você pode enrolar sua própria camada por cima - é um pouco doloroso, mas funciona bem, é o que fazemos.

J

O documento GAE agora afirma que o prazo pode ser de 60 segundos:

result = urlfetch(url,deadline=60,method=urlfetch.POST)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top