【问题标题】:AppSync mutation that triggers more mutations触发更多突变的 AppSync 突变
【发布时间】:2018-11-05 08:52:58
【问题描述】:

我有两个表:帖子和用户

createPost 突变解析器中,我为某些属性设置了一些默认值(想想 userId、createdAt 时间戳、isDeleted 标志等)。另外,我想增加用户的numPosts 计数器。

这可以通过标准解析器实现吗?

如果不是,有什么更好的选择,为什么?

备选方案 1) 当添加新的 Post 记录以增加用户的 numPosts 计数器时,使用 DynamoDB Stream 并触发 lambda 函数。

备选方案 2) 使用 lambda 解析器并将所有逻辑移到那里,而不是标准解析器。

【问题讨论】:

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


    【解决方案1】:

    Update Expressions可以用于DynamoDB;它显然在 AppSync 的Resolver Mapping Template Reference for DynamoDB 中。通过代码中给出的示例代码,您应该可以通过一些UpdateItem代码操作如下:

    {
        "version" : "2017-02-28",
        "operation" : "UpdateItem",
        "key": {
            "id" : { "S" : "${context.arguments.id}" }
        },
        "update" : {
            "expression" :  "ADD numPosts :incrCount",
            "expressionValues" : {
               ":incrCount" : { "N" : 1 }
            }
        }
    }
    

    编辑:这篇文章假定您的numPosts 计数器作为一个字段保存在您的Users 表中。

    【讨论】:

    • 是的,但在同一个突变中,我还想更新 User 和 Post 的属性。
    【解决方案2】:

    您可以使用 BatchPut 操作同时更新多个表。有关详细信息,请参阅 Amazon DynamoDB Batch Operations 指南。

    你需要一个像这样的解析器

    {
      "version" : "2018-05-29",
      "operation" : "BatchGetItem",
      "tables" : {
        "Posts": {
            ...data
        },
        "NumPosts":{
            ...data
        }
      }
    }
    

    【讨论】:

    • 是的,但是其中一项操作可能会在没有其他操作的情况下完成。
    • 没错。然后,您应该查看响应并相应地处理它。 AppSync 中的BatchPut 操作使您可以灵活地在写入多个表时执行部分更新。但是请注意,对项目的每次更新都是一个原子操作。我建议您使用备选方案 1 - 使用 DynamoDB Stream 并在添加增加用户的 numPosts 计数器的新 Post 记录时触发 lambda 函数。这样你的状态最终是一致的。
    【解决方案3】:

    我走的是“使用 lambda 解析器并将所有逻辑移到那里而不是标准解析器”的路线。为我的应用程序。

    您可以通过这种方式进行大量控制、可靠的日志记录、度量标准,并且几乎可以做任何您想做的事情,但是您必须为 lambda 付费。

    如果其他更改可能在事后发生,并且让数据处于中间状态并不重要,那么观看流的选项可能更有意义。

    如果没有完整的上下文,很难评估最佳选择是什么。

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 2018-12-24
      • 2018-12-02
      • 2019-04-13
      • 2021-05-13
      • 2020-05-30
      • 2018-11-21
      • 2019-12-27
      • 2021-02-24
      相关资源
      最近更新 更多