我有一个场景,我有一个DynamoDB表,其中包含一个AWS Lambda函数的触发器(流)。
我想将DynamoDB用作事件存储,并使用Lambda函数维护数据的投影/聚合视图/读取视图。
我需要确保当我在DynamoDB中保存CreateEntity
事件时,然后在我保存UpdateEntity
之后,Lambda函数将在之前处理CreateEntity
事件。 UpdateEntity
事件。
我的理解是,触发器与Lambda的并行性取决于DynamoDB流所包含的Shards的数量。因此,如果Lambda函数使用的DynamoDB Stream有2个分片,一个事件在Shard1上运行,另一个事件在Shard2上运行,那么它们可以由Lambda函数的两个实例并行处理。
因此,如果CreateEntity
事件在Shard1上,UpdateEntity
在Shard2上,那么如果Shard1或Lambda函数实例由于某种原因很慢,那么Shard2中的UpdateEntity
事件可能会被处理第一。这意味着它无法添加到投影中,因为没有首先创建实体。
我的理解是否正确?
有没有办法确保事件仅由Lambda函数的一个实例处理,以便我可以确保处理消息的顺序?
或者我必须使用除Lambda之外的其他东西吗?例如,使用我自己的应用程序将DynamoDB流式传输到Kinesis,我可以确保只运行一个应用程序实例,并确保以这种方式进行排序。
答案 0 :(得分:0)
这部分是正确的
如果你是CreateEntity X,然后是UpdateEntity X,那么在几乎所有的情况下。它将在同一个分片上发生(实体根据其复合键在分片上分割)。
唯一不适用的情况是当你的实体被碎片分割时,只有当你拥有少量的独特实体时,才会发生这种情况。如果你在这种情况下那么你做错了什么..
所以在你的情况下确保......