2016-08-02 56 views
0

我有一个场景,其中有一个带有触发器(流)的AWS DynamoDB表到AWS Lambda函数。我可以确保AWS DynamoDB触发器不是由AWS Lambda函数并行处理的吗?

我想用DynamoDB作为事件存储和使用lambda函数保持投影/聚合视图/读取视图中的数据的。

我需要确保的是,当我保存DynamoDB的CreateEntity事件,然后当我保存UpdateEntity也许就在这以后,lambda函数将处理UpdateEntity事件之前的CreateEntity事件。

我的理解是,触发器与λ的平行度依赖于DynamoDB流由碎片的数量。因此,如果Lambda函数使用的DynamoDB Stream具有2个分片,并且一个事件在Shard1上发生,而另一个事件在Shard2上发生,则可以由两个Lambda函数实例并行处理它们。

所以如果CreateEntity事件是Shard1和UpdateEntity是Shard2那么如果Shard1或出于某种原因,lambda函数实例慢则UpdateEntity事件Shard2可能首先被处理。这意味着它不能被添加到投影中,因为没有首先创建实体。

是我的理解是否正确?

有没有一种方法,以确保事件仅由氧功能的一个实例进行处理,这样我可以保证消息的处理的顺序?

或者我必须使用比LAMBDA别的东西吗?例如DynamoDB流与Kinesis一起使用我自己的应用程序,我可以确保只有一个应用程序实例正在运行,并确保按此方式排序。

回答

0

这部分是正确的

如果你CreateEntity X,然后UpdateEntity X,然后在几乎所有的案件。它将发生在同一个分片上(实体根据其复合键在分片上分割)。

它当你的实体拆分为碎片不会工作是唯一的情况下,如果你有独特的实体少量这只能发生,任何许多。如果你是在这种情况下,你正在做的事情错了..

所以在你的情况下,它被保证...它屡试不爽时间时间

+0

99%?所以我可能会失去100个事件中的1个,因为订单可能会被切换?在这样的系统中,这并不完全是我所追求的。我想建立事件的预测。它可能最终是一致的,但它必须是正确的。 在我的情况下将如何确保?基于密钥,我无法找到关于如何选择碎片的任何内容。 – doorstuck

+0

没有。我是99%的场景。正如我写的唯一的情况是你在1%是当你有少量的独特的实体,其中许多人,所以你的实体将被分割超过1共享。如果你的情况如此,你做错了什么 –

+0

要添加到这个讨论中,或许有助于澄清,dynamodb流是基于分区进行分片的,所以对同一分区中项目的所有操作都将在同一个分片中。 –