我想使用 DynamoDB Streams + AWS Lambda 来处理聊天消息。有关同一对话的消息用户 IDX:用户 IDY(房间)必须按顺序处理。全局顺序并不重要。
假设我以正确的顺序(room:msg1、room: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 个分区,那么您的流将有 4 个分片。每个分片对应一个特定分区,因此,如果所有具有相同分区键的项目都应存在于同一个分区中,这也意味着这些项目将存在于同一个分片中。
这是否意味着我可以自动实现我的需要?“具有相同分区的所有项目将存在于同一分片中”。Lambda 尊重这一点吗?
5)从常问问题:
无法保证不同分片之间记录的顺序,并且每个分片的处理都是并行进行的。
我不在乎全局排序,只在乎逻辑排序,就像例子一样。不过,我不清楚碎片是否按照 FAQ 中的这个答案按逻辑分组。
答案1
这个答案有帮助吗?
https://stackoverflow.com/questions/44266633/how-do-dynamodb-streams-distribute-records-to-shards
无法保证不同分片之间记录的顺序,并且每个分片的处理都是并行进行的。