【问题标题】:How to acheive strong delete consistency in dynamoDB Global Tables如何在 dynamoDB 全局表中实现强删除一致性
【发布时间】:2019-06-20 20:37:01
【问题描述】:

在 DynamoDB 全局表中,如果一个区域收到对记录的删除请求,而另一个区域同时收到更新,我们如何确保删除操作优先,并且在冲突解决后记录不存在。 换句话说,我们能否实现全局表的强删除一致性?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    您是在寻找因错误而失败的更新,还是在更新之前删除记录是否足以删除记录?

    如果是后者,那么几乎就是这样:项目被删除;有时在更新之前,有时在更新之后;但他们总是被删除。唯一的区别是,根据操作顺序,一些更新似乎成功,而另一些则失败

    但是,如果您需要更新始终失败,那么恐怕您需要提出一个分布式全局锁:它既昂贵又缓慢。

    如果您想亲自查看,我建议您设置一个测试:创建一个全局表并添加一堆项目(例如 10,000 个),然后使用来自同一 EC2 实例的两个 DynamoDB 客户端执行 DELETE 和 UPDATE 请求在一个紧密的循环中的两个不同区域。最后,您应该会看到所有项目都已删除。

    【讨论】:

      【解决方案2】:

      您将永远无法保证全局表的强一致性。

      但是,听起来您正在尝试防止更新覆盖删除的特定竞争条件,这是可以防止的。

      保证删除后不更新的最简单方法是使用特定区域作为每个项目的“主”区域。如果您需要更新或删除项目,请使用主区域的端点。缺点是跨区域写入将比同区域写入具有更高的延迟。但是,这可能是一个可以接受的权衡取舍,具体取决于您的应用程序的详细信息。

      您是如何实现这一点的?您可以将regionId 属性添加到您的表中,并且每次创建项目时,您都会设置一个特定区域,该区域应该是该项目的主区域。每当您要更新/删除一个项目时,请阅读该项目以找到该项目的主区域并向相应的区域端点发出更新/删除请求。

      这就是原则,但实际上有一些东西可以让您更轻松。 DynamoDB 为全局表中的所有项目添加了一些特殊属性(请参阅Global Tables – How it Works),其中一个属性是aws:rep:updateregion,这是它上次更新的区域。只需确保在需要更新或删除项目时读取该属性,然后使用该区域的端点发出更新/删除请求。

      【讨论】:

        猜你喜欢
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 2018-05-29
        相关资源
        最近更新 更多