【问题标题】:DynamoDb how to handle big transactionsDynamoDb 如何处理大交易
【发布时间】:2020-03-23 22:54:48
【问题描述】:

在我的用例中,我有一个用户上传一个包含 60k 行的 csv 文件,每行最好是 DynamoDb 中的一个条目。

用户可以随时上传文件。当他上传新文件时,必须删除和替换旧数据。在 SQL 数据库中,您会:

  • 开启交易
  • removeAllFromDb()
  • save() 数据库中的每个条目
  • 关闭/回滚事务

我存储的数据确实适合对象存储,不存在任何关系。再加上 DynamoDb 为 Aurora 带来的成本效益。

由于 DynamoDb 的批处理操作每个请求只能处理 25 个对象,因此如果由于某种原因无法完全处理新文件,则保留旧数据非常重要。

有没有一种简洁的方法可以使用 DynamoDb 实现这一目标?

【问题讨论】:

    标签: transactions nosql amazon-dynamodb


    【解决方案1】:

    看来你应该看看 DDB 中的版本控制..

    Using Sort Keys for Version Control

    • 对于每个新项目,创建该项目的两个副本:一个副本的开头应该有一个版本号前缀为零(例如 v0_)
      的排序键,一个应该有一个版本号前缀一个
      (如 v001_)。

    • 每次更新项目时,在更新版本的排序键中使用下一个更高版本的前缀,并复制更新的 内容到版本前缀为零的项目中。这意味着 任何项目的最新版本都可以使用零轻松定位 前缀

    编辑
    在这种情况下,您实际上不会删除行... 但是,是的,在更新过程中会有一个时间点,用户可以获得旧数据和新数据。这就是最终一致背后的理念。

    如果你不能忍受,为什么要使用 DDB?

    似乎最好将文档存储在 S3 中并使用 Athena 进行查询。

    【讨论】:

    • 那还不包括deleteAll()?而且它会留下一个空白,让客户读取新旧数据的混合
    • 我们选择了一种不同的方法并将我们的数据保存在 ElastiCache (Redis) 中,因为它支持事务。无论如何,我们都会在 dynamoDb 表上启用 DAX。感谢您与我一起思考!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多