我正在尝试将我们的Web应用程序的项目存储迁移到Amazon S3。到目前为止一切都那么好但似乎copyFolder花费的时间比预期的要长得多,我想知道我做错了什么。
当用户执行特定命令时,我需要将S3上的两个文件夹复制到同一个存储桶中的新文件夹中。第一个文件夹包含4个文件,为45KB,第二个文件夹为33KB,包含3个项目。在文件系统上,整个操作大约需要15ms,但在S3上需要至少1.5秒。我没想到这在S3上差异如此之大,因为文件已经在服务器上,但也许我有一个误解。
以下是我用来复制文件夹的主要功能:
exports.copyFolder = function(oldPath, newPath, callback) {
var _this = this;
console.time("dir");
this.getDirectoryListing(oldPath, function(err, data) {
console.log("DIR");
console.timeEnd("dir");
var params = {
Bucket: 'bucket-name',
Key: newPath,
CopySource: oldPath
}
var filesToCopy = data.length;
var filesCopied = 0;
data.forEach(function(fileToCopy) {
console.time("copy");
_this.copyFile(fileToCopy.Key, fileToCopy.Key.replace(oldPath, newPath), function() {
console.log("COPY");
console.timeEnd("copy");
filesCopied++;
if(filesCopied >= filesToCopy && callback) {
callback();
}
});
});
});
}
复制文件非常简单:
exports.copyFile = function(oldPath, newPath, callback){
var params = { Bucket: 'bucket-name', Key: newPath, CopySource: 'bucket-path/' + oldPath };
s3.copyObject(params, function(err, data) {
if(callback)
callback(err, data);
});
}
getDirectoryListing只调用listObjects来获取源文件夹中的所有文件。此代码全部使用node.js aws-sdk,但调用是常见的S3 API调用。每次调用copyFile似乎需要大约300毫秒,这似乎很多。反正有加速吗?