如何通知 AWS AppSync 订阅者未由客户端突变执行的外部数据库更新?

上次更新日期:2021 年 10 月 6 日

当外部数据库更改不是通过客户端突变执行的时候,我需要我的应用程序客户端进行实时更新。如何使用 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 代理。

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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?