【问题标题】:How to implement TTL on column in DynamoDB?如何在 DynamoDB 中的列上实现 TTL?
【发布时间】:2018-01-01 06:10:52
【问题描述】:

阅读 DynamoDB(DDB) 文档后,我知道项目/行只有内置 TTL。那我想知道有没有方便的方法来实现列的TTL?当 TTL 过期时,项目列中的值(如果有)将被消除。一般用例是行中的某些字段具有有限的持久性。 TTL 确保程序业务逻辑的稳健性。

我了解到有使用 AWS lambda 的 DDB 触发器,但限制是 AWS lambda 仅处理 DDB 流(项目更新)。如果一个项目在表中静置很长时间,则项目中感兴趣的列在预期的 TTL 后不会被擦除。如果我遗漏了什么,请纠正我。

我知道可以添加一个作业来定期轮询 DDB。我不喜欢这个想法,因为这对 DDB 来说是一个重大负担,因为该作业需要扫描 DDB(索引),并且扫描可能很耗时,具体取决于感兴趣的 DDB 表的大小,并且是数据争用的来源。

问候,

六月

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    正如 Amit 提到的,DynamoDB 不提供在列上启用 TTL 的机制。

    也就是说,我可以看到这可以构建在 DynamoDB 之上。

    我还没有尝试过,所以这只是理论,但如果有人想 TTL 列;

    想象两个表: 一个。您希望对列进行 TTL 处理的当前表(我们称之为 Original) 湾。您的 TTL 逻辑将基于的新表(我们称之为 TTL 表)

    1. 创建一个新的 TTL 表,以关闭基于列的 TTL,并将 Lambda 与此关联。
    2. 将 Lambda 触发器绑定到原始表,您希望对列进行 TTL,并且在每个事件上,使用以下数据对 TTL 表执行 PUT 操作: 一个。原始表中的主键 湾。 TTL时间 C。要从原始表中删除的属性
    3. 当 TTL 表上的 TTL 过期时,您可以根据主键和属性触发从原始表中删除列。

    它似乎可以构建,但我建议彻底测试它。

    HTH

    【讨论】:

    • 感谢 Abhaya 的回答。我想它有效。我从另一个来源了解到,可以通过 aws lamdba 在计划的事件(cloudwatch 事件)上配置 ddb 触发器,以扫描表索引以清理陈旧的列值。基于空间和时间之间的权衡,一个人可以选择你的提案或我在这里提到的另一个。
    【解决方案2】:

    默认情况下,DynamoDB 不提供在列上启用 TTL 的机制,有关如何在 dynamoDB 上启用 TTL 的更多信息,请参阅 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html

    您提到的其他解决方案显然无效,如果您应用这些解决方案,您最终将向 AWS 支付大量费用。

    注意:- DynamoDB 不是缓存解决方案,其中 TTL 是非常基本的要求,如果您想要一些基于 TTL 的功能,那么您应该在 DynamoDB 之上构建一个缓存(AWS 提供弹性缓存,你可以在其中使用 memcache 或 redis)并在那里实现 TTL。

    【讨论】:

    • 感谢阿米特的回答。在我的用例中,有限的持久性至少是 24 小时(通常可能是几天),所以我猜缓存不是一个选项。我选择不使用缓存的另一个原因是应用程序需要在缓存之上构建分布式锁,并且存在缓存数据库一致性问题。即使任何缓存解决方案都有内置的分布式锁,应用程序仍然需要处理缓存/数据库的一致性问题。顺便说一句,缓存必须处理运行时替换问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2017-08-06
    相关资源
    最近更新 更多