【发布时间】:2017-02-12 19:53:20
【问题描述】:
我想使用 DynamoDB Streams + AWS Lambda 来处理聊天消息。关于同一对话 user_idX:user_idY(房间)的消息必须按顺序处理。全局排序并不重要。
假设我以正确的顺序(room:msg1、room:msg2 等)提供 DynamoDB,如何保证 Stream 将按顺序提供 AWS Lambda,保证相关消息的处理顺序(room ) 跨单个流?
例如,考虑到我有 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
这个官方post 提到了这一点,但我在文档中的任何地方都找不到如何实现它:
对单个变量所做的一系列更改的相对顺序 主键将保存在分片中。此外,给定的密钥 最多将出现在一组兄弟分片中的一个中 在给定的时间点活跃。结果,您的代码可以简单地 处理分片内的流记录,以便准确跟踪 更改项目。
问题
1) 如何在 DynamoDB Streams 中设置分区键?
2) 如何创建保证分区键一致交付的 Stream shard?
3) 这真的可能吗?由于官方文章提到:一个给定的密钥最多将出现在一组在给定时间点处于活动状态的同级分片中,因此似乎 msg1 可能会转到分片 1,然后msg2 到分片 2,就像我上面的例子一样?
已编辑:在this 问题中,我发现了这个:
您的流拥有的分片数量取决于 表具有的分区。所以如果你有一个 4 的 DDB 表 分区,那么您的流将有 4 个分片。每个分片 对应于一个特定的分区,所以给定所有具有 相同的分区键应该存在于同一个分区中,它也 表示这些项目将出现在同一个分片中。
这是否意味着我可以自动实现我所需要的? “具有相同分区的所有项目将出现在同一个分片中”。 Lambda 尊重这一点吗?
编辑2:来自FAQ:
不保证跨分片的记录顺序,并且 每个分片的处理都是并行进行的。
我不关心全局排序,只是按照示例进行逻辑排序。不过,尚不清楚分片是否与常见问题解答中的此答案合乎逻辑。
【问题讨论】:
-
how-to-perform-ordered-data-replication-between-applications-by-using-amazon-dynamodb-streams - aws.amazon.com/blogs/database/…
标签: amazon-dynamodb aws-lambda amazon-dynamodb-streams