使用 Lambda 的 DynamoDB Streams,如何按顺序(按逻辑组)处理记录?

Alf*_*sch 6 amazon-dynamodb aws-lambda amazon-dynamodb-streams

我想使用 DynamoDB Streams + AWS Lambda 来处理聊天消息。有关同一对话user_idX:user_idY(房间)的消息必须按顺序处理。全局排序并不重要。

假设我以正确的顺序(room:msg1、room:msg2 等)提供 DynamoDB,如何保证流将按顺序提供 AWS Lambda,并保证跨单个流处理相关消息(房间)的顺序

例如,考虑到我有 2 个分片,如何确保逻辑组进入同一个分片?

我必须完成这个:

Shard 1: 12:12:msg3 12:12:msg2 12:12:msg1 ==> consumer
Shard 2: 13:24:msg2 51:91:msg3 13:24:msg1 51:92:msg2 51:92:msg1 ==> consumer
Run Code Online (Sandbox Code Playgroud)

而不是这个(消息遵循我在数据库中保存的顺序,但它们被放置在不同的分片中,因此错误地并行处理同一房间的不同序列):

Shard 1: 13:24:msg2 51:92:msg2 12:12:msg2 51:92:msg2 12:12:msg1 ==> consumer
Shard 2: 51:91:msg3 12:12:msg3 13:24:msg1 51:92:msg1 ==> consumer
Run Code Online (Sandbox Code Playgroud)

这篇官方文章提到了这一点,但我在文档中找不到如何实现它的任何地方:

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

问题

1) 如何在 DynamoDB Streams 中设置分区键?

2)如何创建保证分区键一致传递的Stream分片?

3)这真的可能吗?由于官方文章提到:给定的密钥最多会出现在给定时间点处于活动状态的一组同级分片中的最多一个中,因此看起来 msg1 可能会转到分片 1,然后 msg2 可能会转到分片 2,正如我的上面的例子?

编辑:这个问题中,我发现了这一点:

流拥有的分片数量取决于表拥有的分区数量。因此,如果您有一个包含 4 个分区的 DDB 表,那么您的流将有 4 个分片。每个分片对应一个特定的分区,因此假设具有相同分区键的所有项目应该存在于同一分区中,这也意味着这些项目将存在于同一分片中。

这是否意味着我可以自动实现我需要的东西?“具有相同分区的所有项目将出现在同一个分片中”。Lambda 尊重这一点吗?

编辑2:来自常见问题解答

不保证不同分片之间记录的顺序,并且每个分片的处理是并行发生的。

我不关心全局排序,只关心示例中的逻辑排序。不过,尚不清楚分片是否与常见问题解答中的答案符合逻辑。

Ale*_*kis 3

对同一密钥的更新的按顺序处理将自动发生。如本演示文稿中所述,每个活动分片运行一个 Lambda 函数。由于特定分区/排序键的所有更新都恰好出现在一个分片沿袭中,因此它们会按顺序进行处理。