我想使用 DynamoDB Streams + AWS Lambda 来处理聊天消息。关于同一会话user_idX:user_idY(房间)的消息必须按顺序处理。全局排序并不重要。
假设我以正确的顺序(房间:msg1、房间:msg2 等)提供 DynamoDB,如何保证 Stream 将按顺序提供 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
而不是这个(消息尊重我保存在数据库中的顺序,但它们被放置在不同的分片中,因此错误地并行处理同一个房间的不同序列):
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
这个官方帖子提到了这一点,但我在文档中找不到如何实现它:
对单个主键所做的一系列更改的相对顺序将保留在分片中。此外,给定的密钥将出现在一组在给定时间点处于活动状态的同级分片中的至多一个中。因此,您的代码可以简单地处理分片中的流记录,以便准确跟踪项目的更改。
问题
1) 如何在 DynamoDB Streams 中设置分区键?
2)如何创建保证分区键一致交付的流分片?
3)这真的可能吗?由于官方文章提到:给定的密钥最多将出现在一组在给定时间点处于活动状态的同级分片中的一个中,因此似乎 msg1 可能会转到分片 1,然后 msg2 可能会转到分片 2,因为我的上面的例子?
编辑:在这个问题中,我发现了这个:
您的流拥有的分片数量取决于表的分区数量。因此,如果您有一个包含 4 个分区的 DDB 表,那么您的流将有 4 个分片。每个分片对应一个特定的分区,因此具有相同分区键的所有项目都应该存在于同一个分区中,这也意味着这些项目将存在于同一个分片中。
这是否意味着我可以自动实现我所需要的?“具有相同分区的所有项目将出现在同一个分片中”。Lambda 尊重这一点吗?
编辑 2:来自常见问题解答:
不保证跨不同分片的记录顺序,并且每个分片的处理是并行发生的。
我不关心全局排序,只是按照示例进行逻辑排序。不过,尚不清楚分片是否与常见问题解答中的此答案合乎逻辑。