我想使用DynamoDB Streams + AWS Lambda来处理聊天消息。 关于同一个对话user_idX:user_idY (一个房间)的消息必须按顺序处理。 全球订购并不重要。
假设我以正确的顺序(room:msg1,room:msg2等)提供DynamoDB,如何保证Stream将按顺序提供AWS Lambda,并确保在单个stream中处理相关消息(空间)的顺序 ?
例如,考虑到我有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提到了这一点,但是我在文档的任何地方都找不到如何实现它:
对单个主键进行的一系列更改的相对顺序将保留在分片中。 此外,给定的键将存在于在给定时间点处活动的一组兄弟碎片中的至less一个。 因此,您的代码可以简单地处理分片中的streamlogging,以便准确跟踪对项目的更改。
1)如何在DynamoDB Streams中设置分区键?
2)如何创build保证分区键一致传递的stream分片?
3)毕竟真的有可能吗? 由于官方文章提到: 一个给定的钥匙将出现在一组在同一时间点处于活动状态的兄弟碎片中的一个,所以看起来msg1可以转到碎片1,然后msg2转到碎片2,就像我的上面的例子?
4)在这个问题中,我发现这个:
您的数据stream具有的分片数量基于表格的分区数量。 所以如果你有一个4分区的DDB表,那么你的stream将有4个分片。 每个分片对应一个特定的分区,所以具有相同分区键的所有项应该出现在同一个分区中,这也意味着这些项将出现在同一个分片中。
这是否意味着我可以自动实现我所需要的? “所有具有相同分区的项目将出现在同一个分片中” 。 Lambda是否尊重这一点?
5)从FAQ :
不能保证跨不同碎片的loggingsorting,并且每个碎片的处理都是并行的。
我不关心全局sorting,只是按照例子合乎逻辑。 但是,不清楚这些碎片是否从逻辑上与FAQ中的这个答案组合。
这个答案有帮助吗?
https://stackoverflow.com/questions/44266633/how-do-dynamodb-streams-distribute-records-to-shards
不能保证跨不同碎片的loggingsorting,并且每个碎片的处理都是并行的。