【问题标题】:DynamoDB write is too slowDynamoDB 写入太慢
【发布时间】:2020-07-28 06:59:35
【问题描述】:

我使用 Lambda 从 JSON Api 读取并通过 http 请求写入 DynamoDB。 JSON Api 非常大(有 200k 个对象),我的函数在写入 DynamoDB 时非常慢。我使用了常规写入功能,10 分钟后我只能在我的 DynamoDB 表中填充 5k 行。我正在考虑使用 BatchWriteItem 但由于它只能在一批中执行 25 次放置,因此写入所有 200k 行仍然需要太多时间。有没有更好的解决办法?

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-dynamodb


    【解决方案1】:

    这是因为你被限制了。

    对于 Lambda

    一次可以运行的 Lambda 并发调用的最大数量为default limit is 1000 concurrent requests

    如果您同时有超过 1000 个并发请求,您需要联系 AWS Support 以增加此请求,您还需要提供一个业务用例说明它为什么需要支持此请求。

    对于 DynamoDB

    无论您使用批处理还是单个PutItem,您的DynamoDB 表都配置了多个WCU (Write Credit Units) and RCU (Read Credit Units)

    单个写入信用单位涵盖 1 KB 或更小的项目的 1 次写入(每个额外的 kb 是另一个单位)。如果超过此值,您将开始受到写入请求的限制,如果您使用的是 SDK,它也可能会使用指数退避来继续尝试写入。

    作为解决方案,您应该执行以下操作之一:

    • 如果这是一次性过程,您可以将 WCU 调整为固定数字,然后等待 5 分钟使其增大,然后按比例缩小。
    • 如果这是您应用程序上的自然流程,则启用 DynamoDB 自动缩放以全天自然增加和减少

    此外,请查看您的数据建模,因为这也会导致限制。

    在极端情况下,如果单个分区接收超过 3,000 个 RCU 或 1,000 个 WCU,则可能会发生限制

    【讨论】:

    • 感谢您的详尽回答,非常有帮助!每天都会使用写入操作,因此我遵循了您的第二个解决方案并启用了 Auto Scaling,并将容量设置为 70% 的目标利用率。我能再问你一个关于主键的问题吗?我使用 Date.now() 为每个项目生成 id,但这会导致冲突,因为写操作工作得如此之快。我可以使用什么作为主键?不幸的是,数据集中没有 id。
    • 当然,您通常如何检索数据?您始终可以连接多个字段以形成主键,但这实际上取决于您如何检索它
    • 数据集看起来有点像这样:日期、自行车型号、生产时间(以分钟为单位)。我按日期检索数据,因为我想计算每天的平均生产时间并将其放在第二个表中。由于每天生产多次相同的自行车模型,连接这两个字段仍然不会给我一个唯一的键。
    • 我个人会选择 Bike Model 作为分区键,然后有一个日期时间的排序键。否则很难做到独一无二:(
    • 没错,在这种情况下时间戳会很有帮助。不幸的是,我只有日期。还有办法让它发挥作用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2018-03-09
    • 2015-04-17
    • 2012-05-27
    • 2021-11-08
    相关资源
    最近更新 更多