如何通知 AWS AppSync 订阅者尚未通过突变执行的外部数据库更新?

上次更新时间:2020 年 2 月 27 日

我需要应用程序客户端来实时更新外部数据库更改。如何使用 AWS AppSync 通知订阅者这些更改?

简短描述

使用本地解析器即时通知订阅者外部数据库更改,无需触发数据源调用。当订阅者需要实时数据时,这非常有用,例如在需要最新定价和航班时间的航空应用程序中。

按照以下说明创建一个示例 GraphQL API,以在将数据写入 Amazon DynamoDB 表数据源时实时更新订阅者。

解决方法

使用向导创建一个 GraphQL API

使用 AWS AppSync 指导的架构向导创建新的 GraphQL API。有关更多信息,请参阅设计 GraphQL API

1.    打开 AWS AppSync 控制台

2.    选择创建 API

3.    在入门页面上的自定义 API 或从 Amazon DynamoDB 中导入下选择使用向导创建,然后选择开始

4.    在创建模型页面上,执行以下操作:
给模型命名下, 您可以为您的模型输入名称。对于此示例设置,将模型名称 (MyModelType) 保持不变。
配置模型字段下,您可以为您的应用程序定义数据类型。对于此示例设置,将默认的字段名称(idtitle)和类型保持不变。
(可选)展开配置模型表(可选)以添加索引。
选择创建

5.    在创建资源页面上,为您的 API 输入名称,然后选择创建。AWS AppSync 按照指定创建 API,然后打开 API 的查询页面。

创建测试订阅

1.    在 AWS AppSync 控制台中,在 API 的查询页面上,打开一个复制的浏览器选项卡或窗口。

2.    在复制的浏览器选项卡或窗口中的查询编辑器中,输入以下内容:

subscription sub1 {
  onCreateMyModelType{
    id
    title
  }
}

此操作将创建 createMyModelType 突变的订阅

3.    选择播放按钮(执行查询),然后选择 sub1。为突变订阅复制的浏览器选项卡或窗口。

4.    在原浏览器选项卡或窗口中,选择播放按钮(执行查询),然后选择 createMyModelType。此操作将执行突变,您可以同时在原始和复制(订阅)浏览器选项卡或窗口中看到结果。

5.    在您看到订阅行为演示后,关闭复制的浏览器选项卡或窗口。

创建一个“None”类型数据源

None 数据源类型将请求映射模板直接传递到响应映射模板中。

1.    在原浏览器选项卡或窗口中,AWS AppSync 控制台的左侧导航窗格中,选择数据源

2.    选择创建数据源

3.    在新数据源页面上的创建新数据源下,执行以下操作:
数据源名称输入一个名称。例如,real_time_data
对于数据源类型,选择 None

4.    选择创建

有关更多信息,请参阅附加数据源

添加突变至架构中

使用将数据库更新传递到 None 类型数据源的突变更新架构。

1.    在 AWS AppSync 控制台的左侧导航窗格中,选择架构

2.    在架构编辑器中的类型突变 {下,覆盖此内容:

    createMyModelType(input: CreateMyModelTypeInput!): MyModelType

覆盖为:

    addMyModelType(id : ID! , title : String!): MyModelType

3.    在架构编辑器中的类型订阅 {下,覆盖此内容:

        @aws_subscribe(mutations: ["createMyModelType"])

覆盖为:

        @aws_subscribe(mutations: ["addMyModelType"])

注意:您也可以创建一个新突变类型和相应的订阅,而不是覆盖它们。

4.    选择保存架构

有关更多信息,请参阅设计架构

将解析器附加到订阅中

1.    在 AWS AppSync 控制台中,API 的架构页面上,在解析器下向下滚动到突变。或者,为筛选器类型输入突变

2.    在 addMyModelType(...): MyModelType 旁的解析器下,选择附加

3.    在创建新解析器页面上,为数据源名称选择您之前创建的 None 类型数据源的名称。(例如,real_time_data。)

4.    在配置请求映射模板下,覆盖此内容:

    "payload": {
        "hello": "local",
    }

覆盖为:

    "payload": $util.toJson($context.args)

4.    选择保存解析器

有关更多信息,请参阅配置解析器

创建新的测试订阅

1.    在 AWS AppSync 控制台中的左侧导航窗格中选择查询

2.    在 API 的查询页面上,打开复制的浏览器选项卡或窗口。

3.    在复制的浏览器选项卡或窗口中的查询编辑器中,覆盖此内容:

mutation createMyModelType($createmymodeltypeinput: CreateMyModelTypeInput!) {
  createMyModelType(input: $createmymodeltypeinput) {
    id
    title
  }
}

覆盖为:

subscription sub1 {
  onCreateMyModelType{
    id
    title
  }
}

4.    选择播放按钮(执行查询),然后选择 sub2。为突变订阅复制的浏览器选项卡或窗口。

创建新的测试突变

1.    在原浏览器选项卡或窗口中,API 的查询页面上的查询编辑器中,覆盖此内容:

mutation createMyModelType($createmymodeltypeinput: CreateMyModelTypeInput!) {
  createMyModelType(input: $createmymodeltypeinput) {
    id
    title
  }
}

覆盖为:

mutation mutation1 {
  addMyModelType(id:"5",title:"new update"){
    id
    title
  }
}

此操作将创建一个 addMyModelType 突变。

2.    选择播放按钮(执行查询),然后选择 mutation1

3.    在复制(订阅)浏览器选项卡或窗口中,查看订阅者是否实时收到更新。

(可选)请参阅使用按钮示例

构建您的客户端应用程序和应用这些概念时,考虑提供定价和航班时间的航空应用程序的使用案例示例。在此情况下,若要在 DynamoDB 表中的航班详细信息发生更改时通知订阅客户,请执行以下操作:

1.    创建一个将 DynamoDB 流用作触发器的 AWS Lambda 函数。当 DynamoDB 表发生更新时,即会触发 Lambda 函数。有关更多信息,请参阅将 AWS Lambda 用于 Amazon DynamoDB

2.    在 Lambda 函数代码中,包含逻辑以筛选适当的更新,并对 AWS AppSync 执行突变调用。这将使 AWS AppSync 通过订阅来通知订阅者。有关更多信息,请参阅教程:AWS Lambda 解析器

3.    在 AWS AppSync 中,添加带有本地解析器的新突变字段(例如,名称为 publishPrice)。

4.    在订阅字段(例如,名称为 onPriceUpdate)中订阅该突变。架构可能如下所示:

type flightDetails {
  id: ID!
  src: String!
  destn: String!
  price : Int
}

type Mutation {
   # A local resolver targeting a None data source that publishes the message to subscribed clients.
  publishPrice(price: Int): flightDetails
}

type Subscription {
  # Notified whenever *publishPrice* is called.
  onPriceUpdate: Message
    @aws_subscribe(mutations: ["publishPrice"])
}

type Query { ... }

有关更多信息,请参阅设计架构

5.    创建将 DynamoDB 流用作触发器的另一个 AWS Lambda 函数。在此函数中,调用 publishPrice 突变。由于 publishPrice 突变有一个本地解析器,数据不会再次写入 DynamoDB 中。通过此方法,您可以将 AWS AppSync 用作 PubSub 代理。

有关更多信息和另一个示例使用案例,请参阅教程:本地解析器


教程(AWS AppSync 开发人员指南)

运行查询和突变

解析器映射模板参考

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?