Javascript 如何对我的Google Drive API调用进行分级限制?
我正在编写一个节点脚本,以下载与我在Google Drive上的帐户共享的所有图像 正如其他人发布的关于堆栈溢出的帖子一样,我遇到了麻烦: 指数退避对我来说很有意义,我只是不知道如何去实现它 我对这方面的任何见解都会非常有帮助。即使只是一个“开始…”也会很棒 我在下面添加了我正在研究的方法。授权,一切正常,只需接收Javascript 如何对我的Google Drive API调用进行分级限制?,javascript,node.js,google-drive-api,rate-limiting,google-api-nodejs-client,Javascript,Node.js,Google Drive Api,Rate Limiting,Google Api Nodejs Client,我正在编写一个节点脚本,以下载与我在Google Drive上的帐户共享的所有图像 正如其他人发布的关于堆栈溢出的帖子一样,我遇到了麻烦: 指数退避对我来说很有意义,我只是不知道如何去实现它 我对这方面的任何见解都会非常有帮助。即使只是一个“开始…”也会很棒 我在下面添加了我正在研究的方法。授权,一切正常,只需接收userratelimited错误即可 任何和所有的帮助都将是非常棒的,非常感谢 谢谢大家! /** * Download all of the shared images. *
userratelimited
错误即可
任何和所有的帮助都将是非常棒的,非常感谢
谢谢大家!
/**
* 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客户端不支持批处理。我尝试了一个叫做“Batchelor”的第三方lib。为了我的生命,我还是无法让它发挥作用(这并不简单,特别是在像JavaScript这样的aync语言中。首先,正如我在回答您所引用的问题时所解释的,不要做指数退避。API调用之间会有巨大的延迟 您可以在中查看代码 这是一个Angular 1服务,处理GDrives的特性,包括403。它通过将请求放入内部队列来实现,然后我有一个进程,以可变速率将项目从队列中取出,以最大限度地提高吞吐量,同时最小化403和伴随的重试
批处理会让情况变得更糟,所以不要走这条路。限制因素不是http请求的速率,而是请求发送到GDrive内部系统的速率。一批请求快速连续地发送到GDrive,操作系统更有可能触发403。这并不简单,尤其是从像Ja这样的aync语言首先,不要做指数退避,正如我在回答你提到的问题时所解释的那样。API调用之间会有很大的延迟 您可以在中查看代码 这是一个Angular 1服务,处理GDrives的特性,包括403。它通过将请求放入内部队列来实现,然后我有一个进程,以可变速率将项目从队列中取出,以最大限度地提高吞吐量,同时最小化403和伴随的重试 批处理会让情况变得更糟,所以不要走这条路。限制因素不是http请求的速率,而是请求发送到GDrive内部系统的速率。一批请求快速连续地发送到GDrive,操作系统更有可能触发403。基于此,
错误403
或u您得到的错误表示已达到开发人员控制台的每用户限制
请注意,驱动器API有一个:
- 每日限额100000000请求/天
- 礼节性每日配额每秒100个请求
- 每个用户限制10个请求/秒/用户
下面是驱动器API的默认配额的屏幕截图
因此,针对您的错误建议的操作是:
- 提高开发人员控制台项目中的每用户配额。(使用此选项可请求更多配额)
> P>如果一个用户代表谷歌应用程序域的许多用户提出了很多请求,请考虑授权委托(设置)。
- 使用
有关更多信息,请检查以下问题:
基于此,您得到的错误403
或UserRateLimitOvered
错误意味着已达到开发人员控制台的每用户限制
请注意,驱动器API有一个:
- 每日限额100000000请求/天
- 礼节性每日配额每秒100个请求
- 每个用户限制10个请求/秒/用户
下面是驱动器API的默认配额的屏幕截图
因此,针对您的错误建议的操作是:
- 提高开发人员控制台项目中的每用户配额。(使用此选项可请求更多配额)
> P>如果一个用户代表谷歌应用程序域的许多用户提出了很多请求,请考虑授权委托(设置)。
- 使用
有关更多信息,请检查以下问题:
对于速率限制,您必须注意的是每秒每用户的速率
我使用了一个脚本,每1.3秒发送一批10个请求,该脚本运行良好
在13秒内发送一批100个请求,但中途会出现403个错误
因此,结论是:注意每秒,而不是每100秒的限制。对于速率限制,您必须注意的是每用户每秒
我使用了一个脚本,每1.3秒发送一批10个请求,该脚本运行良好
在13秒内发送一批100个请求,但中途会出现403个错误
因此,结论是:注意每秒,而不是每100秒的限制。当您受到速率限制时,gDrive.fkiles.get()
do做什么?您是否在.on('error',…)中遇到特定错误
您可以检测到的事件处理程序?如果是,那是什么具体的错误?基本上,如果您能帮助我们知道如何在您受到速率限制时检测,我们可以帮助代码来处理它。@jfriend00-它看起来甚至没有到达错误处理程序。它只会返回一个错误对象,上面写着“UserRateLimitExtered”或者别的什么。我说它没有到达错误处理程序,因为如果我执行类似于console.error('error',error)
的操作,我将根本看不到我的日志标签。:(当您受到速率限制时,会看到什么<