Google Task Queue время от времени возвращает 500

#python #google-app-engine #google-compute-engine #task-queue

#python #google-app-engine #google-compute-engine #очередь задач

Вопрос:

У меня есть Python, процесс, арендующий задачи из Google TaskQueue REST API каждую секунду в неограниченном цикле:

 credentials = GoogleCredentials.get_application_default()
task_api = googleapiclient.discovery.build('taskqueue', 'v1beta2', credentials=credentials)
while True:
    tasks = task_api.tasks().lease(...).execute()
    time.sleep(1)
  

Иногда процесс хорошо выполняется в течение нескольких часов. Но иногда часто происходит сбой из-за одной из ошибок HTTP:

  • Ошибка серверной части 500
  • Ошибка сервера 503
  • 500 Произошла внутренняя ошибка в серверной части

Процесс выполняется на сервере Google Computing Engine. Он использует ключ учетной записи службы, указанный переменной GOOGLE_APPLICATION_CREDENTIALS env. Это ошибка очереди задач Google или я что-то пропустил? Например. нужно ли мне перечитывать учетные данные перед каждым запросом на аренду?

Комментарии:

1. ошибка сервера — защита от наводнений google рекомендует реализовать экспоненциальный откат.

2. @DalmTo можете ли вы опубликовать ссылку на какую-либо документацию?

3. У вас двоих есть возможности поиска в Google. Ошибки Google являются общесистемными, они хороши для всех API developers.google.com/drive/v3/web /…

4. Хм, речь идет о Google Диске, не знал, что это применимо и к движку приложений Google.

5. Как я уже сказал, «Ошибки Google являются общесистемными, это хорошо для всех API» ошибки 400 и 500 являются стандартными в системах Googles, за исключением странных ошибок 400, которые могут быть специфичными для API. так что да, это относится к ошибкам app engine 500. ошибки 500 — это способ сервера сообщить вам, что вы собираетесь поститься, или сбой сервера, подождите секунду и повторите попытку. для его запуска и ответа редко требуется более 6 попыток.

Ответ №1:

Поскольку @DalmTo только что ответил в комментариях, я суммирую его ответы и добавляю решение Python.

Ошибка, вызванная поддержкой Google 5xx, — это защита от наводнений, и Google рекомендует реализовать экспоненциальный откат. Несмотря на ссылки, указывающие на API Google Drive, ошибки Google являются общесистемными для всех API (включая GAE). Для его запуска и ответа редко требуется более 6 попыток.

После изучения источников googleapiclient я обнаружил, что экспоненциальный откат уже реализован в этой библиотеке, поэтому решение очень простое:

 tasks = task_api.tasks().lease(...).execute(num_retries=6)
  

Источники http.py::_should_retry_response() показывают, что помимо ошибок HTTP 5xx запрос повторяется также, когда ответ JSON содержит userRateLimitExceeded rateLimitExceeded ошибку или.