0

Я работаю над сценарием узла, чтобы загрузить все изображения, которые совместно используются моей учетной записью на Google Диске.Как оценить лимит моих API-интерфейсов Google Диска?

Я нахожусь на стене так же, как другие размещали о переполнении стека: Google Drive API file watch rate limits.

Экспоненциальный откат имеет для меня большой смысл, я просто не знаю, как это реализовать.

Любое понимание, которое я мог бы получить, было бы невероятно полезным. Даже просто «начать с ...» было бы здорово!

Я добавил метод, над которым я работаю ниже. Auth и все работает отлично, это всего лишь вопрос получения ошибки userRateLimitExceeded.

Любая помощь будет фантастической и оцененной.

Спасибо!

/** 
* Download all of the shared images. 
* 
* @param {google.auth.OAuth2} auth An authorized OAuth2 client. 
*/ 
function downloadImages(auth) { 
    const gDrive = google.drive({ 
    version: 'v3', 
    auth: auth 
    }); 

    gDrive.files.list({ 
    q: 'sharedWithMe = true and mimeType = "image/jpeg"' 
    }, (err, resp) => { 
    if(err) { 
     console.log('The API returned an error: ' + err); 
     return; 
    } 

    if(!resp.files.length) { 
     console.error('No files found.'); 
    } else { 
     // Remove existing images. 
     // removeImages(); 

     _.each(resp.files, (file) => { 
     if(fs.existsSync(IMAGE_DIR + file.name)) { 
      return; 
     } 

     gDrive.files.get({ 
      fileId: file.id 
     }) 
     .on('end',() => { 
      console.log(chalk.green(file.name + ' successfully downloaded.')); 
     }) 
     .on('error', (err) => { 
      console.log(err); 
     }) 
     .pipe(fs.createWriteStream(IMAGE_DIR + file.name)); 
     }); 
    } 
    }); 
} 

EDIT: Я посмотрел в дозировании, но я предполагаю, что Google-API-nodejs-клиент не поддерживает партии. Я попробовал стороннюю библиотеку под названием «Batchelor». Все еще не может заставить его работать на жизнь меня. :(

+0

Когда вы получаете скорость ограничена, что делает 'gDrive.fkiles. get() 'do? Вы получаете определенную ошибку в обработчике событий .on ('error', ...) ', который вы можете обнаружить? Если да, какая конкретная ошибка? В принципе, если вы можете помочь нам понять, как определить, когда вы получаете ограничение по скорости, мы можем помочь с кодом, чтобы справиться с этим. – jfriend00

+0

@ jfriend00 - Не похоже, что он даже попал в обработчик ошибок. Он просто вернется с объектом ошибки, говорящим «userRateLimitExceeded» или что-то в этом роде. И я говорю, что он не попал в обработчик ошибок, потому что, если бы я сделал что-то вроде 'console.error ('error', error)', я бы вообще не видел свою метку журнала. :( – Will

ответ

1

Это не просто, особенно с использованием языка aync, такого как JavaScript. Во-первых, НЕ делайте экспоненциальную отсрочку, как я объяснил в своем ответе на поставленный вами вопрос. В итоге вы получите огромную задержку между вызовами API.

Вы можете иметь совать вокруг кода в https://github.com/pinoyyid/ngDrive/blob/master/src/http_s.ts Это Угловая 1 услуга, которая обрабатывает GDrives идиосинкразию, в том числе 403. Это doees его, помещая запросы во внутреннюю очередь, и затем у меня есть процесс, который принимает элементы от очередь с переменной скоростью, чтобы максимизировать пропускную способность, но свести к минимуму 403-й и сопутствующие повторные попытки.

Дозатор делает это еще хуже, поэтому d он не идет по этой дороге. Это не скорость HTTP-запросов, которая является лимитирующим фактором, это скорость запросов к внутренним системам GDrive. Пакетный запросов увольняют в GDrive в быстрой последовательности, ОС, скорее всего, вызвать 403.

+0

Оцените ответ. Я не смог получить простой пример ngDrive, работающий локально, к сожалению. Что-то о «401. Это ошибка. Ошибка: invalid_client нет зарегистрированного происхождения». Я думаю, что это то место, где я сдаюсь эта идея.:/ – Will

+0

, что 401 - это просто материал конфигурации. Вам нужно создать/создать идентификатор клиники в консоли API, 2/настроить это в своем приложении, 3/подавать приложение с одного из разрешенных URL-адресов, указанного в шаг 1 – pinoyyid

0

На основе этого documentation, то error 403 или ошибка userRateLimitExceeded, что вы получили означает, что предел для каждого пользователя из консоли разработчика Был достигнут.

Just take Note that the Drive API has a:

  • Courtesy daily quota 1,000,000,000 requests/day
  • Courtesy daily quota per second 100 requests/second
  • Per User Limit 10 requests/second/user

Вот скриншот квоты по умолчанию Drive API

enter image description here

Так что предложенное действие для ошибки:

  • Повысить квоты для каждого пользователя в проект консоли разработчика. (Используйте этот link, чтобы запросить дополнительную квоту)

  • Если один пользователь делает много запросов от имени многих пользователей домена Служб Google, рассмотрит Service Account с делегированием полномочий (устанавливающий quotaUser parameter).

  • exponential backoff.

Для получения дополнительной информации, проверить эти SO вопросы:

+0

«На пользовательский лимит 10 запросов/секунду/пользователь» неверно. Дросселирование скорости более сложное, чем это, и оно не публикуется публично. – pinoyyid

+0

Проверьте свою консоль разработчика, вы увидите, что Пользователь-100 имеет квоту по умолчанию из 1000. Таким образом, это означает, что у вас есть пользовательский лимит 10 запросов/секунда/пользователь. Проверьте снимок экрана, который я предоставляю. – KENdi

+0

Это совсем не значит, что существует множество разных ограничений. t trip trip - это дросселирование скорости, которое работает на алгоритме токена/ведра, который не публикуется. – pinoyyid

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