我一直在寻找DynamoDB来创建一个接近事务的东西。我正在观看这个视频演示:https://www.youtube.com/watch?v=KmHGrONoif4,其中演讲者在30分钟左右标记了使得动力学操作接近ACID兼容的方法。他表示最好的概念是使用dynamodb流,但没有显示演示或示例。我有一个非常简单的场景,我看到的是有一个名为USERS的表。每个用户都有一个朋友列表。如果两个用户不再希望成为朋友,则必须从两个用户的实体中删除(我无法从一个实体中删除一个朋友,并且由于例如崩溃,第二个用户实体的朋友属性未更新,导致数据不一致)。我想知道是否有人可以提供一些简单的演练哦如何完成这样的事情,看看它是如何工作的?如果可以提供代码,那将很好地了解它是如何工作的。
干杯!
答案 0 :(得分:0)
以下是他所指的交易库:https://github.com/awslabs/dynamodb-transactions 您可以通读设计:https://github.com/awslabs/dynamodb-transactions/blob/master/DESIGN.md
以下是Kinesis客户端库: http://docs.aws.amazon.com/kinesis/latest/dev/developing-consumers-with-kcl.html
当您写入DynamoDB时,您可以获得包含表中发生的所有操作的输出流。该流可以由Kinesis客户端库使用和处理。
在您的情况下,让您的客户端从第一个用户删除它,然后从第二个用户删除它。在Kinesis客户端库中,当您使用流并查看用户被删除时,请查看他与谁成为朋友并在需要时进行检查/删除 - 如果需要,可以通过相同的方式进行删除。它不是真正的交易,并且依赖于KCL保证将处理来自流的记录的事实。
为了增加这种混淆,KCL使用Dynamo来存储流处理时的位置以及检查点处理的记录。
答案 1 :(得分:0)
你应该尽量减少对交易的需求,这是一个小规模的好概念,但是一旦你变得非常成功并且需要支持数百万和数十亿的记录,它就无法真正扩展。
如果您正在考虑NoSQL思维模式,可以考虑使用稍微不同的数据模型。一个简单的例子是在" friend-with"上的单个表上使用Global Secondary Index。属性。当您使用一对朋友添加单个记录时,记录和索引都将在单个操作中更新。删除友谊记录时,表和索引都将在单个操作中更新。
如果您选择使用更新流机制或全局二级索引,您应该考虑最终的一致性"分布式系统的案例。可以在毫秒内实现一致性,但也可能需要更长时间。您应该分析业务影响以及可以采取的技术措施来解决它。例如,在向用户呈现之前,您可以验证两个记录(主表以及索引,如果您在索引中找到它)的存在。