如何通知 AWS AppSync 订阅者有关客户端变更操作未执行的外部数据库更新?
我需要让我的应用程序客户端在外部数据库发生更改(且这些更改并非通过客户端变更操作执行)时进行实时更新。如何使用 AWS AppSync 通知订阅者这些更改?
简短描述
利用本地解析器实时通知订阅者有关外部数据库的更改,无需进行数据源调用。例如,本地解析器对于定期更新信息的应用程序(如航空应用程序)很有帮助。
完成解决方法部分中的步骤,创建一个 GraphQL API 示例。GraphQL API 会在数据写入 Amazon DynamoDB 表数据源时实时通知订阅者更新情况。
解决方法
使用向导创建 GraphQL API
使用 AWS AppSync 引导式架构向导创建新的 GraphQL API。有关更多信息,请参阅设计 GraphQL API。
1. 打开 AWS AppSync 控制台。
2. 选择 Create API(创建 API)。
3. 在 Getting Started(开始使用)页面的 Customize your API or import from Amazon DynamoDB(自定义 API 或从 Amazon DynamoDB 导入)下方,选择 Create with wizard(使用向导创建),然后选择 Start(开始)。
4. 在 Create a model(创建模型)页面上:
在 Name the model(为模型命名)下,输入您的模型名称。在本示例中,名称为 Book。
在 Configure model fields(配置模型字段)下,定义应用程序的数据类型。在此示例设置中,保留默认字段名称(id 和标题)及类型。
(可选)展开 Configure model table (optional)(配置模型表(可选))以添加索引。
选择 Create(创建)。
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. 选择 Create data source(创建数据源)。
4. 在 New Data Source(新建数据源)页面的 Create new Data Source(创建新数据源)下方,完成以下步骤:
对于 Data source name(数据源名称),输入一个名称。例如,real_time_data。
对于 Data source type(数据源类型),选择 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(保存架构)。
有关更多信息,请参阅设计架构。
将解析器附加到变更
1. 打开 AWS AppSync 控制台。
2. 在 API 的 Schema(架构)页面上,在 Resolvers(解析器)下,向下滚动到 Mutation(变更)。或者,在 Filter types(筛选类型)中输入 Mutation(变更)。
3. 在 createBookExt(...): Book 旁边的 Resolver(解析器)下,选择 Attach(附加)。
4. 在 Create new Resolver(创建新解析器)页面上,对于 Data source name(数据源名称),选择您创建的 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(创建)。
有关更多信息,请参阅配置解析器 (VTL)。
创建新的测试订阅
1. 打开 AWS AppSync 控制台。
2. 在左侧导航窗格中,选择 Queries(查询)。
3. 在 API 的 Queries(查询)页面上,打开复制的浏览器标签页或窗口。
4. 在复制的浏览器标签页或窗口中,清除查询编辑器的内容,并输入以下查询:
subscription onCreateBook { onCreateBook { id title } }
5. 选择播放按钮(执行查询)。复制的浏览器标签页或窗口现已同时订阅 createBook 和 createBookExt 变更。
创建新的测试变更
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 代理。
有关更多信息和其他使用案例示例,请参阅教程: 本地解析器。
相关信息
- 语言
- 中文 (简体)
