【发布时间】: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