Google DriveAPIの上にWebアプリケーションを構築しています。基本的に、Webアプリケーションは写真とビデオを表示します。メディアはGoogleドライブフォルダに保存されます。認証されると、アプリケーションはGoogleドライブAPIにメディアのURLを取得するように要求し、それぞれを表示します。今のところ、表示する画像は16枚だけです。これらの画像は、アプリケーションでハードライトされています(デモ用)。
アプリケーションがGoogleDriveAPIにアクセスする際に問題が発生しました。確かに、複数回試行した後、ランダムなリクエストに対してこのエラーが発生しました
ユーザーレート制限を超えました。ユーザーへのリクエストの割合が、構成されたプロジェクトのクォータを超えています。 APIへの予想されるユーザーごとのトラフィックを再評価し、それに応じてプロジェクトのクォータ制限を調整することを検討してください。 APIコンソールで総クォータ使用量を監視して制限を調整できます: https://console.developers.google.com/apis/api/drive.googleapis.com/quotas?project=XXXXXXX "
だから私はAPIコンソールを見て、特別なことは何も見ませんでした、私によるとレート制限を超えていません。たぶん私はグーグルAPIを間違って使用しています、私は実際にはわかりません...
Google Drive APIのドキュメントに従って、何か問題があったかどうかを確認しました。 APIリクエストごとに、リクエストにはアクセストークンが含まれているため、正しく機能するはずです。
アプリのデモが利用可能です: https://poc-drive-api.firebaseapp.com
ソースコードも利用できます: https://github.com/Mcdostone/poc-google-drive-api (file App.js)
403:ユーザーレート制限を超えました は洪水防御です。ユーザーは一度に非常に多くのリクエストしか行うことができません。残念ながら、ユーザーのレート制限は、表示しているグラフには表示されていません。そのグラフは、実際に何が起こっているのかを示すのに非常に苦手です。 Googleはバックグラウンドでテストし、制限を超えている場合はエラーを追い出します。グラフで実際にそれを示す必要はありません
403:ユーザーレート制限を超えました
ユーザーごとの制限に達しました。これは、開発者コンソールからの制限またはドライブバックエンドからの制限である可能性があります。
{"error":{"errors":[{"domain": "usageLimits"、 "reason": "userRateLimitExceeded"、 "message": "User Rate Limit Exceeded"}]、 "code":403、 "message" : "ユーザーレート制限を超えました"}}
推奨されるアクション:
- DeveloperConsoleプロジェクトでユーザーごとの割り当てを増やします。
- 1人のユーザーがGSuiteドメインの多くのユーザーに代わって多くのリクエストを行っている場合は、権限の委任があるサービスアカウントを検討してください( quotaUser パラメーターを設定)。
- 指数バックオフを使用します。
このエラーメッセージが表示され始めたときにIMOが行う主なことは、実装することです 指数バックオフ このようにして、アプリケーションの速度を落とし、再度リクエストを行うことができます。
limiter ライブラリを使用して「100秒あたり1000クエリ」の制限を適用していましたが、それでも403エラーが発生していました。私はついに this ページに出くわしました。
APIコンソールには、ユーザーあたり100秒あたりのリクエスト数と呼ばれる同様の割り当てがあります。デフォルトでは、ユーザーあたり100秒あたり100リクエストに設定されており、最大値1,000に調整できます。ただし、APIへのリクエストの数は、ユーザーごとに1秒あたり最大10リクエストに制限されています。
そこで、リミッターライブラリを更新して、100秒ごとに1,000リクエストではなく、毎秒10リクエストのみを許可するようにしました。これは魅力のように機能しました。
const RateLimiter = require('limiter').RateLimiter;
const limiter = new RateLimiter(10, 1000);
私の場合、Googleドライブフォルダを並行して繰り返し、このエラーが発生していました。 Bottleneck ライブラリを使用して、リクエスト間に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...
}));