DynamoDB streams如何将记录分配到分片?

20

我的目标是确保DynamoDB流发布的记录按照“正确”的顺序进行处理。我的表包含客户事件,哈希键是事件ID,范围键是时间戳。“正确”的顺序意味着同一客户ID的事件按顺序处理。不同客户ID可以并行处理。

我通过Lambda函数消费流。每个分片自动创建消费者。因此,如果运行时决定对流进行分片,则消耗将并行进行(如果我理解正确),我面临在处理CustomerCreated之前就处理CustomerAddressChanged事件等风险。

文档暗示没有办法影响分片。但它们没有明确说明。是否有方法,例如使用客户ID和时间戳的组合作为范围键?


相关:https://dev59.com/hZ3ha4cB1Zd3GeqPcv-l#42187242 - Ruben Bartelink
3个回答

12
假设分片由表键确定的观点似乎是正确的。我的解决方案将使用客户ID作为哈希键,时间戳(或事件ID)作为范围键。
这篇AWS博客说:
“在单个主键上进行的一系列更改的相对顺序将在一个分片内保留。此外,给定键最多存在于一组同时处于活动状态的兄弟分片中的一个中。因此,您的代码只需按顺序处理分片中的流记录,即可准确跟踪项目的更改。”
这张幻灯片证实了这一点。我仍然希望DynamoDB文档能明确地说明这一点...

6
我刚刚收到了AWS支持团队的回复。它似乎确认了@EagleBeak对于将分区映射到分片的假设,或者我理解的是,一个分区被映射到一个分片树中。
我的问题是关于由于TTL过期而导致的REMOVE事件,但它也适用于所有其他类型的操作。
  1. 每个主分区键都会创建一个分片吗?如果同一分区中有太多项目,则将分片拆分为子分片?

在DynamoDB表中,每个分区都会创建一个分片。如果由于同一分区中有太多项目而需要进行分区拆分,则该分片也会被拆分为子分片。当父表上存在高水平的写入活动时,分片可能会拆分,以便应用程序可以并行处理来自多个分片的记录。

  1. 如果这100个已删除的项目都具有相同的分区键,则它们将放在一个分片中吗?

假设这100个项目都具有相同的分区键值(但具有不同的排序键值),它们将存储在同一分区上。因此,它们将从同一分区中删除,并放置在同一个分片中。

  1. 由于“发送到AWS Lambda函数的记录是严格序列化的”,在TTL的情况下,这种序列化是如何工作的?分片内的顺序是通过分区/排序键,TTL过期等来确定的吗?

DynamoDB Streams捕获您DynamoDB表中项目级修改的时间排序序列。此时间排序序列在每个分片级别上保留。换句话说,分片内的顺序是根据创建、更新或删除项目的顺序确定的。


3
似乎非常小心,不直接承认跨分片时该顺序未被保留。分片是并行处理的,因此您可以在并行处理中完全按任意顺序处理事件。就像“这个时间排序序列在每个分片级别上得到了保留。”为什么他们不直接说...时间排序序列仅在每个分片级别上得到保留,而不是在流级别上。 - Triynko

4
一个dynamodb流由分组成的流记录组成。当在dynamodb表上写入的数量很高时,一个分片可以生成子分片。因此,您可以拥有父分片和可能的多个子分片。为确保应用程序以正确的顺序处理记录,必须始终先处理父分片,然后再处理子分片。这在文档中详细描述。
不幸的是,发送到AWS Lambda函数的DynamoDB Streams记录严格序列化,每个分片和跨不同分片的记录排序不能保证。 从AWS Lamda FAQs: 问:AWS Lambda如何处理来自Amazon Kinesis流和Amazon DynamoDB Streams的数据?

发送到AWS Lambda函数的Amazon Kinesis和DynamoDB Streams记录是严格序列化的,每个分片一个。这意味着如果您将两条记录放入同一分片中,则Lambda保证在调用第二条记录之前会成功调用第一条记录的Lambda函数。如果一个记录的调用超时、被限流或遇到任何其他错误,Lambda将重试直到成功(或记录达到其24小时过期时间)才继续处理下一条记录。不同分片之间的记录顺序不能保证,并且每个分片的处理是并行进行的。

如果您使用DynamoDB Streams Kinesis Adapter,根据DynamoDB文档here,您的应用程序将按照正确顺序处理物理分片和流记录。有关DynamoDB Streams Kinesis适配器的更多信息,请参见Using the DynamoDB Streams Kinesis Adapter to Process Stream Records
因此,使用dynamodb lambda触发器无法保证排序。您的其他选择包括使用DynamoDB Streams Kinesis适配器或DynamoDB Streams Low-Level API,但这需要更多的工作。

3
这并没有回答我的问题:记录是如何被分组成分片的? - EagleBeak
1
@user818510,您如何使用DynamoDB Streams低级API来保证顺序? - titus
这意味着你在阅读措辞中所发现的风险实际上并不存在。@titus低级API和/或kinesis适配器以确保正确顺序的传递方式遍历分片和同级节点的树。请注意,该API是Java为中心的(例如,除了使用Lambda之外,没有其他有意义的.NET实现)。 - Ruben Bartelink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接