истечение времени ожидания urlfetch для движка приложения - PullRequest
1 голос
/ 17 июня 2011

У меня есть два запущенных приложения ядра приложений, которые я хочу связать с интерфейсом Restful.Как только данные одного обновляются, он вызывает веб-хук для второго, который извлекает свежую копию данных для своей собственной системы.Внутри 'site1' у меня есть:

 from google.appengine.api import urlfetch

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

Внутри обработчика для data_updated на 'site2' у меня есть:

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

Между этими двумя сайтами очень мало данных, но яполучите следующую ошибку.Я пытался увеличить срок до 10 секунд, но это все еще не работает.

 DeadlineExceededError: ApplicationError: 5 

Может ли кто-нибудь дать представление о том, что может происходить?

Спасибо - Ричард

Ответы [ 5 ]

3 голосов
/ 18 июня 2011

Изменение метода с

  result = urlfetch.fetch(url)

на

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

исправило ошибки Крайнего срока.

Из документации urlfetch :

дедлайн Максимальное время ожидания ответа от удаленного хоста в виде количества секунд.Если удаленный хост не отвечает в течение этого времени, возникает ошибка DownloadError.

Время, потраченное на ожидание запроса, не учитывается в квоте ЦП для запроса.Это рассчитывает на таймер запроса.Если таймер запроса приложения истекает до того, как возвращается вызов URL Fetch, вызов отменяется.

Крайний срок может составлять максимум 60 секунд для обработчиков запросов и 10 минут для очереди задач и обработчиков заданий cron.Если крайним сроком является Нет, крайний срок устанавливается равным 5 секундам.

3 голосов
/ 18 июня 2011

App Engine urlfetch не всегда ведет себя так, как ожидается, у вас есть около 10 секунд, чтобы получить URL.Предполагая, что URL-адрес, который вы пытаетесь получить, запущен и работает, вы должны быть в состоянии перехватить DeadlineExceededError, вызвав from google.appengine.runtime import apiproxy_errors, а затем заключив вызов urlfetch в блок try / Кроме того, используя except apiproxy_errors.DeadlineExceededError:.

Соответствующий ответ здесь .

1 голос
/ 04 ноября 2011

В документе GAE теперь указано, что крайний срок может быть 60 секунд:

result = urlfetch(url,deadline=60,method=urlfetch.POST)
1 голос
/ 18 июня 2011

Количество передаваемых данных здесь не проблема, задержка равна.

Если приложение, с которым вы разговариваете, часто тратит на ответ> 10 секунд, вам придется использовать прокси-сервер обратного вызова на другой облачной платформе (EC2 и т. Д.). Если вы можете некоторое время удерживать новый предполагается, что экземпляры бэкэнда несколько ослабят временные ограничения urlfetch.

Если среднее время отклика составляет <10 секунд, и только относительно немногие отказывают, просто повторите попытку несколько раз. Надеюсь, ради вас звонки идемпотентны (то есть повторная попытка не оказывает неблагоприятного воздействия). Если нет, возможно, вы сможете накатить свой собственный слой поверх - это немного больно, но работает нормально, это то, что мы делаем. </p>

J

1 голос
/ 17 июня 2011

Вы пытались вручную запрашивать URL-адреса (www.site2.com/data_updated и www.site1.com/get_new_data) с помощью curl или иным образом, чтобы убедиться, что они отвечают в течение срока? Даже если объем данных, которые необходимо передать, невелик, возможно, существует проблема с обработчиком, который вызывает задержку в возврате результатов.

...