如何在dynamoDB全局表中实现强删除一致性

时间:2019-06-20 20:37:01

标签: amazon-web-services amazon-dynamodb amazon-dynamodb-global-tables

在DynamoDB全局表中,如果一个区域在一条记录上收到删除请求,而另一个区域在同一时间收到更新,那么我们如何确保Delete操作优先并且在冲突解决之后该记录就不存在。 换句话说,我们可以为全局表实现强删除一致性吗?

2 个答案:

答案 0 :(得分:0)

您是在寻找更新失败并出错的记录吗?如果在更新之前就删除了记录,是否足以删除记录?

如果是后者,那就差不多会发生:项目被删除;有时在更新之前,其他时候之后;但它们总是被删除。唯一的区别是,某些更新似乎可以成功,而其他更新则可能失败,具体取决于操作顺序

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

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

答案 1 :(得分:0)

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

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

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

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

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