[英]How do I rate limit my Google Drive API calls?
我正在使用一个节点脚本来下载与我的帐户在Google云端硬盘上共享的所有图像。
就像其他人在Stack Overflow: Google Drive API文件观看率限制上发表的一样,我碰壁。
指数退缩对我来说很有意义,我只是不知道如何去实现它。
我对此有任何见识都将非常有用。 即使只是“开始...”也很棒!
我在下面添加了我正在使用的方法。 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));
});
}
});
}
编辑 :我研究了批处理,但我猜google-api-nodejs-client不支持批处理。 我尝试了一个名为“ Batchelor”的第三方库。 仍然无法让它为我的一生工作。 :(
这并不简单,尤其是从像JavaScript这样的aync语言开始。 首先,正如我在回答您提到的问题时所解释的那样,不要做指数补偿。 API调用之间将导致大量延迟。
您可以在https://github.com/pinoyyid/ngDrive/blob/master/src/http_s.ts中查看代码。这是Angular 1服务,用于处理GDrives特质,包括403。它通过发出请求来完成进入内部队列,然后我执行一个过程,该过程以可变速率从队列中取出项目,以最大化吞吐量,但同时最小化403和伴随的重试。
批处理使情况变得更糟,所以不要走这条路。 限制因素不是http请求率,而是对GDrive内部系统的请求率。 大量请求会快速连续发送到GDrive中,操作系统更有可能触发403。
根据此文档 ,您收到的error 403
或userRateLimitExceeded
错误表示已达到开发者控制台的每用户限制。
请注意,Drive API具有:
- 每天的每日配额1,000,000,000个请求
- 每秒礼貌每日配额100个请求/秒
- 每个用户限制10个请求/秒/用户
这是Drive API的默认配额的屏幕截图
因此,针对您的错误建议采取的措施是:
在开发者控制台项目中提高每用户配额。 (使用此链接要求更多配额)
如果一个用户代表一个Google Apps域中的许多用户发出很多请求,请考虑使用具有授权委派的服务帐户 (设置quotaUser参数 )。
使用指数补偿 。
有关更多信息,请检查以下SO问题:
有了速率限制,您必须注意的是每位用户每秒。
我使用了一个脚本,该脚本每1.3秒发送10个请求,该脚本可以正常工作。
在13秒钟内发送一批100个请求,但途中开始收到403错误。
得出的结论是:注意每秒的限制,而不是每100秒的限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.