Почему и как превышена квота критических запросов на чтение при использовании batchCreateContacts

Я программирую экспорт контактов из нашей базы данных в Google Контакты с помощью Google People API. Я программирую запросы по URL-адресу через Google Apps Script.

Код ниже - с использованием https://people.googleapis.com/v1/people:batchCreateContacts - работает от 13 до 15 отдельных запросов, но затем Google возвращает это сообщение об ошибке:

Превышена квота для метрики квоты «Критические запросы чтения (чтение контактов и профиля)» и ограничения «Критических запросов чтения (чтения контактов и профиля) в минуту на пользователя» службы people.googleapis.com для потребителя »project_number: *** '.

Для скорости отправляю запрос пакетами по 10 параллельных запросов.

У меня есть два вопроса по этой проблеме:

  1. Почему для создания контактов я бы использовал квоту, касающуюся запросов чтения?
  2. Учитывая приведенную ниже ссылку на изображение, почему отправка 2 пакетов по 10 одновременных запросов (точнее: от 13 до 15 отдельных запросов) в любом случае превысила этот квантовый предел? ограничение квоты в 90 запросов чтения на пользователя в минуту, как показано на console.cloud.google.com

Спасибо за любые разъяснения!

Дополнительная литература: https://developers.google.com/people/api/rest/v1/people/batchCreateContacts

  let payloads = [];
  let lengthPayloads;
  let limitPayload = 200;
/*Break up contacts in payload limits*/
  contacts.forEach(function (contact, index) /*contacts is an array of objects for the API*/
    {
      if(!(index%limitPayload))
      {
        lengthPayloads = payloads.push(
          {
            'readMask': "userDefined",
            'sources': ["READ_SOURCE_TYPE_CONTACT"],
            'contacts': []
          }
        );
      }
      payloads[lengthPayloads-1]['contacts'].push(contact);
    }
  );
Logger.log("which makes "+payloads.length+" payloads");
  let parallelRequests = [];
  let lengthParallelRequests;
  let limitParallelRequest = 10;
/*Break up payloads in parallel request limits*/
  payloads.forEach(function (payload, index)
    {
      if(!(index%limitParallelRequest))
        lengthParallelRequests = parallelRequests.push([]);
      parallelRequests[lengthParallelRequests-1].push(
        {
          'url': "https://people.googleapis.com/v1/people:batchCreateContacts",
          'method': "post",
          'contentType': "application/json",
          'payload': JSON.stringify(payload),
          'headers': { 'Authorization': "Bearer " + token }, /*token is a token of a single user*/
          'muteHttpExceptions': true
        }
      );
    }
  );
Logger.log("which makes "+parallelRequests.length+" parallelrequests");
  let responses;
  parallelRequests.forEach(function (parallelRequest)
    {
      responses = UrlFetchApp.fetchAll(parallelRequest); /* error occurs here*/
      responses = responses.map(function (response) { return JSON.parse(response.getContentText()); });
      
      responses.forEach(function (response)
        {
          if(response.error)
          {
            Logger.log(JSON.stringify(response));
            throw response;
          }
          else Logger.log("ok");
        }
      );

Вывод логов:

что составляет 22 полезной нагрузки

что делает 3 параллельных запроса

хорошо (15 раз)

(сообщение об ошибке)


person SVerlinden    schedule 25.05.2021    source источник


Ответы (1)


Превышена квота для метрики квоты «Критические запросы чтения (чтение контактов и профиля)» и ограничения «Критических запросов чтения (чтения контактов и профиля) в минуту на пользователя» службы people.googleapis.com для потребителя «project_number: *** '.

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

Когда вы отправляете пакетный запрос с 10 запросами в нем, он считается за десять запросов, а не как один пакетный запрос. Если вы пытаетесь запустить эту параллель, вы явно превысите количество запросов в минуту на пользовательскую квоту.

Притормози, это не гонка.

Почему для создания контактов я бы попал в квоту по запросам на чтение?

Я бы забил это плохим сообщением об ошибке.

Учитывая приведенную ниже ссылку на картинку, почему отправка от 13 до 15 запросов все равно превысит эту квоту? ((перед этим кодом есть 3 запроса на чтение)) ограничение квоты в 90 запросов на чтение на пользователя в минуту, как показано на console.cloud.google.com

Ну, вы отправляете 13 * 10 = 130 в минуту, что превышает запрос в минуту. Также нет способа узнать, насколько быстро работает ваша система, она может работать быстрее, поскольку это будет зависеть от того, что еще сервер делает в то время, когда он получает ваши запросы, в какую минуту они фактически записываются.

Мой совет - просто соблюдайте лимиты квот и не пытайтесь понять, почему на серверах Googles так много переменных, чтобы можно было определить, что такое минута. Вы можете отправить 100 запросов за 10 секунд, а затем попытаться отправить еще 100 за 55 секунд, и вы получите сообщение об ошибке, которое вы также можете получить через 65 секунд, в зависимости от того, когда они попали на сервер и когда сервер завершил обработку ваших начальных 100 запросов. .

Снова притормози.

person DaImTo    schedule 25.05.2021
comment
Спасибо за информацию. Где я могу найти квоты на проект? Далее я уточнил свой вопрос: он достигает предела на втором пакете из 10 запросов (так, действительно, на 13-м одиночном запросе). Итак, он не достигает лимита в 90 запросов ... Так почему же он достигает этого лимита? - person SVerlinden; 26.05.2021
comment
Чего вы не понимаете, так это того, что если вы получаете сообщение об ошибке, оно достигает квоты в 90 запросов. Гугл не врет, нужно сбавлять обороты. Квоты на основе проекта находятся в той же области, что и все квоты, в которых просто не указывается пользователь. - person DaImTo; 26.05.2021
comment
Хорошо, я считаю, что Google не лжет :-). Но я хотел бы понять, как он считает эти запросы, потому что я не дохожу до 90. Кроме того, я не могу найти квоты на основе проекта. Я смотрю на ссылка. В другом месте облачной консоли я получаю сообщение `` Использование квоты для каждого пользователя не отображается '', но ничего о квоте проекта ... Во всяком случае, когда нужно сделать следующий пакет из 10 запросов, я заставил программу подождать минуту первый. Это предотвращает ошибку. - person SVerlinden; 26.05.2021
comment
Я занимаюсь этим десять лет. Невозможно понять, как Google регистрирует эти запросы. Вам необходимо учитывать, насколько быстро сервер обрабатывает ваши данные. Если я также запускаю что-то на том же сервере, что и вы, и мои вещи загружают процессор, ваши данные будут работать медленнее или быстрее. Вы также должны понимать, что приложение консоли - это оценка, это не на 100% правильное, это просто руководство. Я также написал кое-что для Flood buster :) - person DaImTo; 26.05.2021