我正在使用@google-cloud/storage
库从我的Google云端桶中获取数据。但是,我无法从桶中获得超过5次下载/秒。
const Storage = require('@google-cloud/storage');
const storage = Storage({ keyFilename: './gcloud-api-creds.json' });
const bucket = storage.bucket('my-bucket');
Promise.all(Array.from(Array(80)).map(
(d,i) => bucket.file(`index.html`)
.download()
.then(() => console.log(`done ${i}`))
)).then(() => console.log("READY"));
大约需要14秒才能完成80次下载请求。我相信我的每个用户存储限制都会达到一定程度。
Google云端存储文档声称默认支持~5000 req / s
对象的读取没有限制。 Buckets最初支持大约每秒5000次读取,然后根据需要进行扩展。 (https://cloud.google.com/storage/quotas)
我怎样才能达到这个标准?
答案 0 :(得分:1)
在与谷歌云支持团队讨论后,我们发现实际上使用的带宽限制了应用引擎灵活容器上的请求/秒数量。
根据gsutil perf测试,看起来实例和云存储桶之间只有65mbit下载带宽。
答案 1 :(得分:0)
我认为问题不是@google-cloud/storage
库或任何速率限制,而是如何使用map
方法。
Array.map is executed synchronously,因此,如果您在开始下载之前每次等待完成下载,即使您使用的是Promise.all
而不是并行执行,也会按顺序执行每个请求,因为您是在处理数组时没有创建任何承诺。因此,你的速度比预期慢。
我认为您可能会发现此示例非常有用{source}:
var arr = [1, 2, 3, 4, 5];
var results: number[] = await Promise.all(arr.map(async (item): Promise<number> => {
await callAsynchronousOperation(item);
return item + 1;
}));
Promise.all(iterable)方法返回一个promise,它在iterable参数中的所有promise都已解析时解析,或者拒绝第一个传递的拒绝的promise的原因。