Я создаю веб-приложение на основе API Google Диска. В основном веб-приложение отображает фото и видео. Мультимедиа хранятся в папке Google Диска: после аутентификации приложение делает запросы к Google Drive API, чтобы получить URL-адрес для мультимедиа, и отображает каждый из них. На данный момент у меня есть только 16 изображений для отображения. Эти изображения жестко прописаны в приложении (для демонстрации).
У меня возникла проблема с доступом моего приложения к API Google Диска. Действительно, после нескольких попыток у меня возникла эта ошибка для случайных запросов
User Rate Limit Exceeded. Rate of requests for user exceed configured project quota. You may consider re-evaluating expected per-user traffic to the API and adjust project quota limits accordingly. You may monitor aggregate quota usage and adjust limits in the API Console: https://console.developers.google.com/apis/api/drive.googleapis.com/quotas?project=XXXXXXX"
Так что я посмотрел консоль API и ничего особенного не увидел, я не превышаю лимит скорости по моему мнению. Может я неправильно использую Google API, на самом деле не знаю ...
Я следил за документацией по API Google Диска, чтобы проверить, не сделал ли я что-то не так. Для каждого запроса API запрос содержит токен доступа, поэтому он должен работать правильно!
Доступна демонстрация приложения: https://poc-drive-api.firebaseapp.com
Также доступен исходный код: https://github.com/Mcdostone/poc-google-drive-api (файл App.js)
В моем случае одновременная загрузка 50 -> 200 файлов с использованием curl multiple. Я купил 10 VPS только для того, чтобы проксировать запрос, чтобы избежать ограничения скорости, но этого не произошло. Вероятно, использование нескольких учетных записей может решить проблему.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


403: Превышен предел скорости пользователя - защита от флуда. Пользователь может делать только определенное количество запросов за раз. к сожалению, ограничение скорости пользователя не отображается на графике, на который вы смотрите. Этот график действительно плохо показывает, что на самом деле происходит. Google тестирует в фоновом режиме и выдает ошибку, если вы превышаете свой лимит. Они не обязаны показывать нам, что на графике
403: User Rate Limit Exceeded
The per-user limit has been reached. This may be the limit from the Developer Console or a limit from the Drive backend.
{ "error": { "errors": [ { "domain": "usageLimits", "reason": "userRateLimitExceeded", "message": "User Rate Limit Exceeded" } ], "code": 403, "message": "User Rate Limit Exceeded" } }
Suggested actions:
- Raise the per-user quota in the Developer Console project.
- If one user is making a lot of requests on behalf of many users of a G Suite domain, consider a Service Account with authority delegation (setting the quotaUser parameter).
- Use exponential backoff.
ИМО, главное, что нужно сделать, когда вы начнете сталкиваться с этим сообщением об ошибке, - это реализовать экспоненциальный откат, чтобы ваше приложение могло замедлиться и снова сделать запрос.
В моем случае я параллельно просматривал папки Google Диска и получал эту ошибку. Я решил проблему, реализовав ограничение скорости на стороне клиента с помощью библиотеки Узкое место с задержкой 110 мс между запросами:
const limiter = new Bottleneck({
// Google allows 1000 requests per 100 seconds per user,
// which is 100ms per request on average. Adding a delay
// of 100ms still triggers "rate limit exceeded" errors,
// so going with 110ms.
minTime: 110,
});
// Wrap every API request with the rate limiter
await limiter.schedule(() => drive.files.list({
// Params...
}));
Я использовал библиотеку ограничитель, чтобы установить ограничение «1000 запросов в 100 секунд», но все равно получал 403 ошибки. Наконец я наткнулся на страницу это, где упоминается, что:
In the API Console, there is a similar quota referred to as Requests per 100 seconds per user. By default, it is set to 100 requests per 100 seconds per user and can be adjusted to a maximum value of 1,000. But the number of requests to the API is restricted to a maximum of 10 requests per second per user.
Поэтому я обновил библиотеку ограничителей, чтобы разрешать только 10 запросов в секунду вместо 1000 каждые 100 секунд, и это работало как шарм.
const RateLimiter = require('limiter').RateLimiter;
const limiter = new RateLimiter(10, 1000);
Я не думаю, что это актуально, потому что страница, на которую вы ссылаетесь, не ограничивает API Google Диска, но говорит: "Следующие квоты применяются к Management API, Core Reporting API v3, MCF Reporting API, Metadata API, User Deletion API. и API отчетов в реальном времени "
Вы можете использовать созданную мной библиотеку с нулевой зависимостью под названием Очередь с ограничением скорости, чтобы ограничить скорость выполнения задач в очереди.
Ограничение 10 запросов в секунду может быть достигнуто следующим образом:
const createQueue = require("rate-limited-queue");
const queue = createQueue(
1000 /* time based sliding window */,
10 /* max concurrent tasks in the sliding window */);
const results = await queue([
() => { /* a request code goes here */ },
() => { /* another request code goes here */ }
// ...
]);
Вы можете скачать любой конкретный файл с Google Диска в свой колаб .. использовать
! gdown https://drive.google.com/uc?id=14ikT5VererdfeOnQtIJREINKSDN
где значение идентификатора сообщения - это то, что вы получите, когда нажмете ссылку для общего доступа к файлу на диске
см. stackoverflow.com/questions/18578768/… и stackoverflow.com/questions/18529524/…. Вам нужно реализовать дросселирование. NB НЕТ экспоненциальная отсрочка