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

3 分钟阅读
0

当外部数据库更改不是通过客户端突变执行的时候,我需要我的应用程序客户端进行实时更新。如何使用 AWS AppSync 通知订阅者这些更改?

简短描述

使用本地解析器实时通知订阅者外部数据库更改,无需使用数据来源调用。例如,本地解析器对于定期更新信息的应用程序(例如航空公司应用程序)很有用。

完成 Resolution(解决办法)一节中的步骤,创建一个示例 GraphQL API。当数据写入 Amazon DynamoDB 表数据来源时,GraphQL API 会实时更新订阅者。

解决方法

使用向导创建一个 GraphQL API

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

1.    打开 AWS AppSync 控制台

2.    选择创建 API

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

4.    在 Create a model(创建模型)页面中:
Name the model(为模型命名)下, 您可以为您的 model(模型)输入名称。在这个例子中,Book(书)是名称。
Configure model fields(配置模型字段)下,为您的应用程序定义数据类型。对于此示例设置,保持默认的字段名称(idtitle)和类型。
(可选)展开配置模型表(可选)以添加索引。
选择
创建

5.    在 Create resources(创建资源)页面中,为您的 API 输入名称。然后,选择 Create(创建)。AWS AppSync 创建 API,然后打开 API 的 Queries(查询)页面。

创建测试订阅

1.    打开 AWS AppSync 控制台

2.    导航到 API 的 Queries(查询)页面,然后打开复制的浏览器选项卡或窗口。

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

subscription onCreateBook {
  onCreateBook {
    id
    title
  }
}

前面的查询创建了一个对 createBook 突变的订阅

4.    选择播放按钮(执行查询)。订阅复制的浏览器标签或窗口以进行 createBook 突变。

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

6.    看到订阅后,关闭复制的浏览器选项卡或窗口。

创建一个 None 类型数据来源

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

1.    在原始浏览器选项卡或窗口中,打开 AWS AppSync 控制台

2.    在左侧导航窗格中,选择 Data Sources(数据来源)。

3.    选择创建数据来源

4.    在 New Data Source(新数据来源)页面上的 Create new Data Source(创建新数据来源)下,执行以下步骤:
数据来源名称输入一个名称。例如,real_time_data
对于数据来源类型,选择 None

5.    选择 Create(创建)。

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

添加突变至架构中

创建第二个突变供管理员使用,或者在更新架构时启动。

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

1.    打开 AWS AppSync 控制台

2.    在左侧导航窗格中,选择 Schema(架构)。

3.    在架构编辑器的 type Mutation { 下方添加以下命令来为外部更新创建新的突变类型:

createBookExt(input: CreateBookInput!): Book

4.    在架构编辑器中的 type Subscription { 下方,找到以下内容:

onCreateBook(id: ID, title: String): Book
        @aws_subscribe(mutations: ["createBook"])

5.    将 "createBookExt" 添加到突变列表中:

onCreateBook(id: ID, title: String): Book
        @aws_subscribe(mutations: ["createBook", "createBookExt"])

6.    选择 Save Schema(保存架构)。

有关更多信息,请参阅 Designing your schema(设计架构)。

为突变附加解析器

1.    打开 AWS AppSync 控制台

2.    在 API 的 Schema(架构)页面的 Resolvers(解析器)下,向下滚动到Mutation(突变)。或者,为筛选器类型输入突变

3.    在 createBookExt(...): Book 旁边的 Resolver(解析器)下方,选择 Attach(附加)。

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

5.    在 Configure the request mapping template(配置请求映射模板)下,找到 request(请求)函数:

export function request(ctx) {
    return {};
}

6.    修改函数以返回 ctx.args

export function request(ctx) {
    return ctx.args;
}

7.    选择 Create(创建)。

有关更多信息,请参阅 Configuring resolvers (VTL)(配置解析器 (VTL))。

创建新的测试订阅

1.    打开 AWS AppSync 控制台

2.    在左侧导航窗格中,选择 Queries(查询)。

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

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

subscription onCreateBook {
  onCreateBook {
    id
    title
  }
}

5.    选择播放按钮(执行查询)。复制的浏览器选项卡或窗口现在订阅了 createBookcreateBookExt 这两种变体。

创建新的测试突变

1.    在原始浏览器选项卡或窗口中,在 API 的 Queries(查询)页面上,清除查询编辑器的内容。然后,输入以下查询:

mutation createBook($createbookinput: CreateBookInput!) {
  createBook(input: $createbookinput) {
    id
    title
  }
}

在编辑器底部的 Query Variables(查询变量)部分中,清除内容并输入以下查询:

{
  "createbookinput": {
    "title": "My New Book"
  }
}

前面的查询使用 createBook 突变新建 Book(书) 。

2.    选择播放按钮(执行查询)。

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 代理。

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


相关信息

解析器教程 (VTL)

运行查询和突变

解析器映射模板参考 (VTL)

相关视频

AWS 官方
AWS 官方已更新 1 年前