2

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

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 Backend Ошибка
  • 503 Backend ошибки
  • 500 Внутренняя ошибка произошла во внутреннем интерфейсе

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

+1

Бэкэнд-ошибка - защита от наводнений. Google рекомендует применять экспоненциальную отсрочку. – DaImTo

+0

@DalmTo можете ли вы разместить ссылку на документацию? – xmedeko

+1

У вас есть возможность поиска Google. Ошибки Google являются общедоступными для всех API. Https://developers.google.com/drive/v3/web/handle-errors#500_backend_error – DaImTo

ответ

2

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

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

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

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

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