【问题标题】:Node.js AWS S3 Hangs Indefinitely on Large Number of Image File getObject RequestsNode.js AWS S3 在大量图像文件 getObject 请求上无限期挂起
【发布时间】:2017-09-29 10:57:07
【问题描述】:

我有一个应用程序一次从 Amazon S3 请求多达几百个图像文件。这些文件是使用嵌套的 Promise 按顺序请求的(因此每秒请求的数量或一次可以传输的数据量没有限制,这不是问题),并且在 100 多个文件的情况下一切正常.但是,S3 此后无限期挂起。我该如何解决?请参阅下面的相关代码。

function one_by_one(objects_array, iterator, callback) {
    let start_promise = objects_array.reduce(function (prom, object) {
        return prom.then(function () {
            return iterator(object);
        });
    }, Promise.resolve()); // initial
    if(callback){
        start_promise.then(callback);
    }else{
        return start_promise;
    }
}

let grabImage = function(image){
      params = {Bucket: 'partpics', Key: image};
      let getObjectPromise = s3.getObject(params).promise();
      return getObjectPromise.then(function(data) {
          console.log('Success');
          res.imageBuffers.push(data.Body);
          bufferTemp = res.imageBuffers;
          console.log('res.imageBuffers index: ',res.imageBuffers.length-1);
      }).catch(function(err) {
        console.log(err);
      });

};
let myCallback = function() {
  next();
}
one_by_one(res.insertThis.Image,grabImage,myCallback);

【问题讨论】:

  • 您能否通过对某些 Web 资源进行简单的类似 curl 的调用 (http get) 来替换 S3 GetObject 函数,以确保您的承诺代码/框架不是问题?
  • 这绝对不是问题,因为在我使用任何 Promise 之前我也遇到了同样的问题。我认为问题可能是太多并行请求,因此是承诺。但这显然不是问题。
  • 我尝试了一种不同的方法,使用 request-promise 模块从 AWS Cloudfront 获取数据。它仍然停在完全相同的位置因此我最终确定这不是 AWS S3 问题,而是节点(或可能是操作系统)问题。
  • 仅供参考,我使用 node v6.9.2 进行了快速测试,其中包含 250 个 S3 对象,每个 64KB 大小,我能够使用 async.each (并行)或 async 成功获得所有这些对象.eachSeries(连续)。然后我用你的代码(针对相同的 250x 64KB 对象)进行了测试,结果也很好。
  • 多么奇怪。它似乎也不是我的操作系统,因为当我将它部署到 Heroku 并从那里运行时也会发生同样的事情。

标签: javascript node.js amazon-web-services amazon-s3


【解决方案1】:

最终,我通过将应用程序从 Heroku(需要 Git 推送,因此在本地保存图像文件时导致大型 Git 对象问题)移动到 Digital Ocean(不需要 Git,从而启用本地保存图像)。因此,AWS S3 现在也被排除在外了。此外,这还提供了额外的好处,使应用程序的 PDF 生成速度大大加快。

【讨论】:

    猜你喜欢
    • 2018-07-03
    • 2018-09-02
    • 1970-01-01
    • 2014-02-08
    • 2018-05-19
    • 2017-02-12
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多