Amazon web services DynamoDB流如何将记录分发到碎片?
我的目标是确保DynamoDB流发布的记录以“正确”的顺序进行处理。我的表包含客户的事件。散列键是事件ID,范围键是时间戳。“正确”顺序意味着相同客户ID的事件按顺序处理。不同的客户ID可以并行处理 我通过Lambda函数使用流。每个碎片自动生成消费者。因此,如果运行时决定对流进行切分,则消耗将并行进行(如果我没有弄错的话),并且在创建CustomerCreated(例如)之前,我将面临处理CustomerAddressChanged事件的风险Amazon web services DynamoDB流如何将记录分发到碎片?,amazon-web-services,amazon-dynamodb,aws-lambda,amazon-dynamodb-streams,Amazon Web Services,Amazon Dynamodb,Aws Lambda,Amazon Dynamodb Streams,我的目标是确保DynamoDB流发布的记录以“正确”的顺序进行处理。我的表包含客户的事件。散列键是事件ID,范围键是时间戳。“正确”顺序意味着相同客户ID的事件按顺序处理。不同的客户ID可以并行处理 我通过Lambda函数使用流。每个碎片自动生成消费者。因此,如果运行时决定对流进行切分,则消耗将并行进行(如果我没有弄错的话),并且在创建CustomerCreated(例如)之前,我将面临处理CustomerAddressChanged事件的风险 这意味着没有办法影响切分。但他们并没有这么明确地说
这意味着没有办法影响切分。但他们并没有这么明确地说。是否有一种方法,例如,对范围键使用客户ID和时间戳的组合?dynamodb流由分组为碎片的流记录组成。碎片可以生成子碎片,以响应dynamodb表上的大量写入。因此,您可以有父碎片,也可能有多个子碎片为确保应用程序按正确的顺序处理记录,必须始终在处理子碎片之前处理父碎片。这在中有详细说明 不幸的是,发送到AWS Lambda函数的DynamoDB Streams记录是严格序列化的,每个分片,并且不能保证记录在不同分片之间的顺序 来自AWS Lamda常见问题解答: Q:AWS Lambda如何处理来自Amazon Kinesis流和Amazon DynamoDB流的数据? Amazon Kinesis和DynamoDB流记录发送到您的AWS Lambda函数是严格序列化的,每个碎片。这意味着如果 你在同一个碎片里放了两张唱片,Lambda保证你的 将使用第一条记录成功调用Lambda函数 在使用第二条记录调用之前。如果调用一个 记录超时、被限制或遇到任何其他错误(Lambda) 将重试,直到成功(或记录达到24小时可用状态) 在继续下一条记录之前。排序 不保证跨不同碎片的记录,并且 每个碎片并行发生 如果使用DynamoDB Streams Kinesis适配器,应用程序将根据DynamoDB文档以正确的顺序处理碎片和流记录。有关DynamoDB Streams Kinesis适配器的更多信息,请参阅
因此,使用dynamodb lambda触发器不能保证订购。您的其他选择包括使用DynamoDB Streams Kinesis适配器或需要大量工作的 分片由表键决定的假设似乎是正确的。我的解决方案是使用客户ID作为散列键,时间戳(或事件ID)作为范围键 说: 对单个数据进行的一系列更改的相对顺序 主键将保留在碎片中。此外,一个给定的密钥 将最多出现在一组兄弟碎片中的一个碎片中 在给定时间点处于活动状态。因此,您的代码可以简单地 在碎片内处理流记录,以便准确跟踪 对项目的更改
证实了这一点。我仍然希望DynamoDB文档能明确地这样说…我刚收到AWS支持部门的回复。它似乎证实了分区映射到碎片的假设。或者按照我的理解,分区被映射到一个碎片树 我的问题是关于由于TTL过期而删除事件,但它也适用于所有其他类型的操作
这并没有回答我的问题:记录如何分组到碎片中?@user818510您如何使用DynamoDB Streams低级API来保证排序?似乎非常小心,不要直接承认碎片之间没有保留顺序。碎片是并行处理的,因此您肯定可以并行处理完全无序的事件。这就像“这个时间顺序的序列是在每个碎片级别上保存的。”为什么他们不直接说。。。时序序列仅在每个碎片级别保留,而不是在流级别保留。