从谷歌云存储桶下载时如何提高每秒的慢速请求速率

时间:2018-01-01 13:36:19

标签: google-cloud-platform google-cloud-storage rate-limiting quota

我正在使用@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

我怎样才能达到这个标准?

2 个答案:

答案 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;
}));

根据MDN docs for Promise.all

  

Promise.all(iterable)方法返回一个promise,它在iterable参数中的所有promise都已解析时解析,或者拒绝第一个传递的拒绝的promise的原因。