【问题标题】:Can I ensure that AWS DynamoDB triggers are NOT handled in parallel by an AWS Lambda function?我能否确保 AWS Lambda 函数不会并行处理 AWS DynamoDB 触发器?
【发布时间】:2016-12-07 17:02:05
【问题描述】:

我有一个场景,我有一个 DynamoDB 表,其中包含 AWS Lambda 函数的触发器(流)。

我想将 DynamoDB 用作事件存储并使用 Lambda 函数来维护数据的投影/聚合视图/读取视图。

我需要确保当我在 DynamoDB 中保存 CreateEntity 事件时,然后可能在我保存 UpdateEntity 之后,Lambda 函数将在 UpdateEntity 事件之前处理 CreateEntity 事件。

我的理解是 Lambda 触发器的并行性取决于 DynamoDB 流所包含的 Shard 数量。因此,如果 Lambda 函数使用的 DynamoDB 流有 2 个分片,并且一个事件在 Shard1 上进行,另一个事件在 Shard2 上进行,那么它们可以由 Lambda 函数的两个实例并行处理。

因此,如果 CreateEntity 事件在 Shard1 上,UpdateEntity 在 Shard2 上,那么如果 Shard1 或 Lambda 函数实例由于某种原因很慢,则可能首先处理 Shard2 中的 UpdateEntity 事件。这意味着它不能被添加到投影中,因为没有先创建实体。

我的理解正确吗?

有没有办法确保事件仅由 Lambda 函数的一个实例处理,以便我可以确保消息处理的顺序?

或者我必须使用 Lambda 以外的其他东西吗?例如,使用我自己的应用程序将 DynamoDB 流式传输到 Kinesis,我可以确保只有一个应用程序实例正在运行并确保以这种方式排序。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-lambda


    【解决方案1】:

    部分正确

    如果您先创建实体 X,然后再更新实体 X,那么在几乎所有情况下。它会发生在同一个分片上(实体根据它们的复合键在分片上拆分)。

    唯一不起作用的情况是当您的实体被拆分为分片时,只有当您拥有少量唯一实体(其中任意多个)时才会发生这种情况。如果你在这种情况下,那么你做错了什么..

    所以在你的情况下它得到了保证......

    【讨论】:

    • 99% 的时间它每次都有效?因此,由于订单可能被切换,我可能会在 100 个事件中失去 1 个?这并不是我在这样的系统中所追求的。我想建立一个事件的投影。它可能最终是一致的,但它必须是正确的。在我的情况下如何确保它?我找不到任何关于如何根据密钥选择分片的信息。
    • 没有。我是 99% 的场景。正如我所写的那样,您在 1% 中的唯一情况是当您拥有少量唯一实体并且其中有很多时,因此您的实体将被拆分为超过 1 个共享实体。如果是你的情况,那么你做错了什么
    • 添加到这个讨论中,也许有助于澄清,dynamodb 流是基于分区分片的,所以对同一分区中项目的所有操作都将在同一个分片中。
    • @JonathanSeed 谢谢。但是事件本质上是单独的项目,因为这是事件存储的重点。因此,一个事件将被写入一次,从未被触及过。解决方案是让同一个“上下文”中的所有事件共享同一个分区以强制它们在同一个分片上吗?但这会在 DynamoDB 中产生性能问题,因为分区的数量将受到不同“上下文”数量的限制?
    • “只有当您拥有少量唯一实体(其中任意多个)时才会发生这种情况”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 2016-10-19
    • 2020-05-16
    • 2021-03-28
    • 2021-06-16
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多