【问题标题】:AWS Lambda | Read Multiple Files from S3 | Create combined JSON | Facing performance issueAWS Lambda |从 S3 读取多个文件 |创建组合 JSON |面临性能问题
【发布时间】:2019-12-23 19:34:16
【问题描述】:

我正在从 AWS lambda 上的 S3 读取多个 JSON 文件,并在经过一些处理后最终创建一个 JSON,我能够读取这些文件并将它们组合起来,但它似乎不是优化最小 IO 操作的最佳方式,我面临着性能损失当文件很大时。

这里是我的简化代码

exports.handler = function (e, callback) {
    helper.data.readJSON(s3_param)
        .then(function (data_1) {
            var data_1 = JSON.parse(data_1);
            helper.data.readJSON(s3_param)
                .then(function (data_2) {
                    var data_2 = JSON.parse(data_2);
                    helper.data.readJSON(s3_param)
                        .then(function (data_3) {
                            var data_3 = JSON.parse(data_3);
                            return SomeFuntion(data_1, data_2, data_3);
                        });
                });
        });
};

这是从 S3 读取文件的 readJSON 代码

async function readJSON(params) {
        const data = (await (S3.getObject(params).promise())).Body.toString('utf-8');
        return data;
    }

有人可以建议更好的方法吗?

【问题讨论】:

  • 避免 promise-as-callback 反模式,返回每个 Promise 以供下一个外部 .then 使用
  • 我建议你看看 Amazon Athena。

标签: node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

我想您可以使用Promise.all 并行执行操作。像

async function readJSON(params) {
  const data = (await (S3.getObject(params).promise())).Body.toString('utf-8');
  return JSON.parse(data);
}

exports.handler = async event => {
  const [data_1, data_2, data_3] = await Promise.all([
    readJSON(s3_param1),
    readJSON(s3_param2),
    readJSON(s3_param3)
  ]);
  return someFunction(data_1, data_2, data_3);
};

希望对你有帮助

【讨论】:

  • 谢谢,它对我有用,至少我在性能方面提高了 50-70 毫秒,这大约减少了 10% 的消耗时间。
猜你喜欢
  • 2019-10-27
  • 2020-05-23
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
相关资源
最近更新 更多