API Календаря Google возвращает превышение предела скорости 403 в рамках одного пакетного запроса - PullRequest
1 голос
/ 04 августа 2020

Мое приложение создает и удаляет события Календаря Google от имени пользователей. Каждый пользователь авторизуется через портал OAuth, и этот пользователь access_token используется для доступа к API, а не к учетной записи службы.

У меня были проблемы с различными ошибками ограничения скорости, поэтому я начал пакетные запросы . Но, несмотря на пакетные запросы, многие запросы в пакете терпят неудачу. Только я тестирую это локально - других пользователей в службе нет.

Например, ниже вы можете видеть, что несколько delete в пакетном запросе завершились неудачно (номера 2, 6, 7, 8 и др. c.). Этот пакетный запрос с ~ дюжиной delete запросов был единственным, что было отправлено за предыдущие несколько минут, и за предыдущий час было, вероятно, 6 пакетных запросов (многие с той же проблемой).

Если я затем сразу после этого запустил еще один пакетный запрос, я бы увидел ту же картину: некоторые из подзапросов выполнены успешно, а другие - нет. Это наводит меня на мысль, что я не превышал какого-либо глобального / дневного лимита, а скорее что что-то сломано в самом пакетном запросе.

[2020-08-03 13:55:03,101: WARNING/ForkPoolWorker-1] Error with batch delete request "1": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,102: WARNING/ForkPoolWorker-1] Error with batch delete request "3": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,102: WARNING/ForkPoolWorker-1] Error with batch delete request "4": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,103: WARNING/ForkPoolWorker-1] Error with batch delete request "5": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,103: WARNING/ForkPoolWorker-1] Error with batch delete request "6": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,103: WARNING/ForkPoolWorker-1] Error with batch delete request "9": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,103: WARNING/ForkPoolWorker-1] Error with batch delete request "10": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">

(X s - это моя редакция личной информации)

В той мере, в какой это полезно, вот самый основной код c, вызывающий это:

batch = c.new_batch_http_request(callback=batch_delete_callback)
for event in events:
    if event is not None:
        r = c.events().delete(calendarId=gcal_id, eventId=event)
        batch.add(r)
batch.execute()

И обратный вызов:

def batch_delete_callback(request_id, response, exception):
    if exception is not None:
        print('Error with batch delete request "{0}": {1}'.format(
            request_id, exception))

Что я здесь делаю не так и как мне лучше всего справиться или избежать этих 403 от Google?

Обновление

Я просто попытался минимально проверить это, чтобы получить случай немедленного отказа. Я выполнил пакетный запрос, который добавил 12 событий в мой календарь, а затем выполнил пакетный запрос, который попытался удалить те же 12 событий примерно через 15 секунд. Итак, всего 2 пакетных запроса по 12 подзапросов в каждом. И это после 20 часов бездействия с момента последней попытки.

И из 12 delete запросов 8 из них не удалось. Итак, у меня было успешно выполнено 12 create запросов, а затем 8/12 delete запросов вернули 403 Rate Limit Exceeded

Как отмечено в моих комментариях ниже, моя консоль показывает квоты в 1000000 запросов в день и 100000000 запросов в день. 100 секунд на пользователя. Так что я просто не могу сказать, какой у меня предел.

1 Ответ

0 голосов
/ 04 августа 2020

Пакетная обработка уменьшает общее количество запросов, но ограничение скорости по-прежнему действует.

  • Фактически, при пакетной обработке ваш код выполняется быстрее, и вы с большей вероятностью столкнетесь с проблемами ограничения скорости.
  • Вам необходимо замедлить выполнение вашего кода или запросить в консоли разработчика увеличение квоты.

Следующие процедуры рекомендованы в документации , чтобы избежать 403 Rate Limit Exceeded ошибок:

Предлагаемые действия:

  • Увеличьте квоту на пользователя в проекте Developer Console.
  • Если один пользователь отправляя много запросов от имени многих пользователей домена G Suite, рассмотрите возможность использования учетной записи службы с делегированием полномочий (установка параметра quotaUser).
  • Используйте экспоненциальную отсрочку.
...