DynamoDB流如何将记录分发到分片?

Eag*_*eak 10 amazon-web-services amazon-dynamodb aws-lambda amazon-dynamodb-streams

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

我正在通过Lambda函数使用流.每个碎片自动生成消费者.因此,如果运行时决定对流进行分片,则消耗并行发生(如果我做对了)并且我冒着在CustomerCreated之前处理CustomerAddressChanged事件的风险(例如).

文档暗示,有没有办法能够影响分片.但他们并没有这么明确地说.有没有办法,例如,通过使用客户ID和时间戳组合范围键?

cor*_*opy 6

我刚刚收到 AWS 支持人员的回复。这似乎证实了@EagleBeak关于分区映射到分片的假设。或者按照我的理解,分区映射到分片树。

我的问题是关于由于 TTL 过期而导致的 REMOVE 事件,但它也适用于所有其他类型的操作。

  1. 是否为每个主分区键创建一个分片?然后,如果同一分区中有太多项目,分片会被分割成子分片吗?

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

  1. 如果删除的 100 个项目都具有相同的分区键,它们是否会被放入一个分片中?

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

  1. 既然“发送到您的AWS Lambda函数的记录是严格序列化的”,那么在TTL的情况下,这种序列化是如何工作的呢?分片内的顺序是通过分区/排序键、TTL 过期等建立的吗?

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

  • 似乎非常小心,不要直接承认该顺序不会跨分片保留。分片是并行处理的,因此您绝对可以并行处理完全无序的事件。这就像“这个按时间排序的序列被保留在每个分片级别”。他们为什么不直接说...按时间排序的序列仅保留在每个分片级别,而不是流级别。 (3认同)

Eag*_*eak 5

分片由表键确定的假设似乎是正确的。我的解决方案将使用客户ID作为哈希键,并使用时间戳(或事件ID)作为范围键。

这个AWS博客说:

对单个主键进行的一系列更改的相对顺序将保留在分片中。此外,给定密钥将存在于在给定时间点处于活动状态的一组同级碎片中的最多一个。因此,您的代码可以简单地处理分片中的流记录,以便准确跟踪对项目的更改。

这张幻灯片证实了这一点。我仍然希望DynamoDB文档能够明确地这么说...