【问题标题】:How to reduce runtime for Lambda function that reads JSON and puts data in DynamoDB如何减少读取 JSON 并将数据放入 DynamoDB 的 Lambda 函数的运行时间
【发布时间】:2020-09-28 11:57:14
【问题描述】:

我的 Lambda 函数向 JSON api 发出 get 请求,并将数据放入 DynamoDB。但是,运行时间太长,因为 JSON 非常大。如何调整代码以减少运行时间?或者我可以调整我的 DynamoDB 设置以加快写入过程吗?

exports.handler = async (event) => {
    try {
        const data = await httprequest();

         for (var i = 0; i < data.d.results.length; i++){
         var iden = Date.now();
        var identifier = iden.toString();

            var params = {
            Item: {
                ID: identifier,           
                journal: data.d.results[i].journal
            },

            TableName: ''test"
        };

        await docClient.put(params).promise();

        }


        console.log('Document inserted.');

        return JSON.stringify(data);
    } catch(err) {
        console.log(err);

        return err;
    }
};

【问题讨论】:

  • DynamoDB 读/写容量是可配置的,因此您可以提高表的写入性能。希望您的分区键是日志,而不是时间戳。当然,还可以使用批量写入。
  • @jarmod 谢谢,会的!使用时间戳作为分区键有什么问题?
  • 时间戳倾向于聚集,导致读/写在 NoSQL 数据库的分片中分布不均。具有更均匀的分区键分布允许更大的并行化。另外,您通常不能查询时间戳。并且对于多个非常接近时间的连续写入可能会意外地具有相同的时间戳,这意味着如果您在这些多个项目中使用的排序键没有更改,那么您实际上是在更新现有项目而不是写入新项目。

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


【解决方案1】:

与其一一插入数据,不如考虑批量写入。见:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

BatchWriteItem 操作在一个或多个表中放置或删除多个项目。对 BatchWriteItem 的一次调用可以写入多达 16 MB 的数据,其中可以包含多达 25 个放置或删除请求。要写入的单个项目可以大到 400 KB。

【讨论】:

  • 谢谢你,正是我想要的!
  • 很高兴它有帮助!
猜你喜欢
  • 2021-03-09
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2023-03-19
  • 2020-05-23
相关资源
最近更新 更多