16

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

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

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

4

3 回答 3

7

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

这个 AWS 博客说:

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

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

于 2017-05-31T17:37:37.683 回答
4

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

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

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

    为您的 DynamoDB 表中的每个分区创建一个分片。如果由于同一分区中的项目过多而需要分区拆分,则分片也会拆分为子分片。一个分片可能会因其父表上的高水平写入活动而分裂,以便应用程序可以并行处理来自多个分片的记录。- https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/

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

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

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

    DynamoDB Streams 在您的 DynamoDB 表中捕获按时间排序的项目级修改序列。这个按时间排序的序列保存在每个分片级别。换句话说,分片内的顺序是根据创建、更新或删除项目的顺序建立的。- https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html

于 2018-08-02T08:55:37.523 回答
3

dynamodb 流由分组为分片的流记录组成。碎片可以生成子碎片以响应 dynamodb 表上的大量写入。所以你可以有父分片,也可以有多个子分片。为确保您的应用程序以正确的顺序处理记录,父分片必须始终在子分片之前处理。这在docs中有详细描述。

不幸的是,发送到 AWS Lambda 函数的 DynamoDB Streams 记录是严格按分片序列化的,并且不能保证跨不同分片的记录顺序

来自 AWS Lamda 常见问题解答:

问:AWS Lambda 如何处理来自 Amazon Kinesis 流和 Amazon DynamoDB 流的数据?

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

如果您使用 DynamoDB Streams Kinesis Adapter,您的应用程序将根据此处的 DynamoDB 文档以正确的顺序处理分片和流记录。有关 DynamoDB Streams Kinesis Adapter 的更多信息,请参阅使用 DynamoDB Streams Kinesis Adapter 处理流记录

因此,使用 dynamodb lambda 触发器并不能保证排序。您的其他选项包括使用 DynamoDB Streams Kinesis Adapter 或DynamoDB Streams Low-Level API,这需要更多的工作。

于 2017-05-31T04:38:13.080 回答