2017-01-11 7 views
1

Я использую python в движке Google, и продолжаю получать google.appengine.api.urlfetch_errors.DeadlineExceededError по запросам, сделанным с машины, которая выполняет некоторую обработку. Запросы занимают примерно 60 секунд, иногда немного дольше, поэтому я попытался увеличить срок.Является ли google.appengine.api.urlfetch крайним сроком до 60 секунд?

Запросы завернуты в повторную попытку, и из журналов я вижу, что время между попытками всегда равно ~ 60 с. Я предполагаю, что это либо потому, что я неправильно настроил ситуацию, либо неправильно понял ограничения срока.

Машина конфигурации является:

instance_class: B8 
basic_scaling: 
    max_instances: 1 
    idle_timeout: 10m 

код я использую (отредактированный для простоты):

from google.appengine.api import urlfetch 
from retrying import retry 

timeout = 600 
retries = 10 

@retry(
    stop_max_attempt_number=retries, 
    wait_exponential_multiplier=1000, 
    wait_exponential_max=1000*60*5 
) 
def fetch(url): 
    """Fetch remote data, retrying as necessary""" 
    urlfetch.set_default_fetch_deadline(timeout) 
    result = urlfetch.fetch(url) 
    if result.status_code != 200: 
     raise IOError("Did not receive OK response from server") 
    return result.content 

data = fetch(config['url']) 

Я попытался установить крайний срок явно как urlfetch.fetch(url, deadline=timeout) но установка по умолчанию похоже, подход, который большинство людей предлагает.

Может ли кто-нибудь уточнить, существует ли максимальное значение, которое может быть установлено для deadline?

+0

Я уверен, что 60 секунд - это максимальное значение для urlfetch (и стандартных интерактивных запросов), но, похоже, оно больше не документировано. 60 секунд - это долгое время, чтобы открыть соединение - возможно, вам лучше опросить другую сторону? – snakecharmerb

+0

Спасибо snakecharmerb. Честно говоря, я нашел противоречивую информацию (некоторые из них могут быть из более старых версий GAE). Я обнаружил, что источники, требующие 60-х, являются максимальными, а другие говорят, что это относится только к классам «automatic_scaling». Конечно, поиск в github находит много людей, вызывающих 'urlfetch.set_default_fetch_deadline()' со значениями выше 60, и учитывая, что я не могу найти ограничение, зарегистрированное где угодно в документах, которые мне бы хотелось, чтобы кто-то сказал мне, что я просто отсутствует что-то очевидное! –

+0

Да, к сожалению, docstring для 'set_default_fetch_deadline' просто говорит:« Эта функция не выполняет никакой проверки диапазона или типа значения », что не очень полезно. Независимо от ограничения, я бы подумал о том, чтобы попытаться использовать другой подход, чтобы не связывать экземпляр так долго, если не потребуется так много времени для переноса данных? FWIW его ценность [этот java doc] (https://cloud.google.com/appengine/docs/java/outbound-requests#request_timeouts) говорит 60-е годы для исходящего запроса, вы можете предположить, что те же ограничения применяются в java-world ., – snakecharmerb

ответ

1

Запрос Таймер

Google App Engine запрос таймер (Java/Python/Go) гарантирует, что запросы имеют конечный срок службы и не увязнуть в бесконечном цикле. В настоящее время крайний срок для запросов на внешние экземпляры составляет 60 секунд. (У экземпляров backend нет соответствующего предела.) Каждый запрос, включая разминку (запрос/_ah/warmup) и запросы на загрузку (заголовок журнала загрузки «load_request = 1»), подпадает под это ограничение.

Если запрос не возвращается в течение 60 секунд, и DeadlineExceededError будет выброшен и не пойман, запрос будет прерван и будет возвращена ошибка внутреннего внутреннего сервера. Если DeadlineExceededError пойман, но ответ создается недостаточно быстро (у вас меньше секунды), запрос прерывается и возвращается 500 внутренних ошибок сервера.

Насколько я читаю документ, я думаю, что максимальное время ожидания запроса составляет 60 секунд в движке приложения. Here is the link to the documentation

+0

Спасибо Бравину, я прочитал эту документацию и использую то, что она рекомендует, но когда я меняю крайний срок (например, до 600 с), все равно кажется, что тайм-аут после максимума 60. Что я пытаюсь установить, есть ли максимальное значение, служащее лимитом, или я делаю ошибку в своем коде. –

+0

@JamieCollinson Пожалуйста, ознакомьтесь с обновленным ответом. –

+0

ценят, что вы нашли время ответить, но это 'google.appengine.runtime.DeadlineExceededError', а не' google.appengine.api.urlfetch_errors.DeadlineExceededError'. Также крайний срок подачи заявок относится только к экземплярам, ​​которые являются автоматическим масштабированием. Как ручные, так и базовые экземпляры масштабирования могут выполняться неограниченное количество в документах (https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine#scaling_types_and_instance_classes) –

Смежные вопросы