GraphQL 实时 API - 通过 AWS AppSync 构建数据驱动应用程序
讲解使用 AWS AppSync 构建 GraphQL API 的方法。
GraphQL API 的优势与 AppSync 的定位
GraphQL 是 Facebook 开发的查询语言,其特点是客户端可以指定并获取所需的数据。REST API 中每个端点都返回固定的响应结构,因此容易发生过度获取(获取不需要的数据)和获取不足(需要多次请求)。AWS AppSync 是以全托管方式提供 GraphQL API 的服务,全面支持从架构定义、解析器设置到实时订阅、认证 / 授权的各个方面。作为后端数据源,可以直接连接 DynamoDB、Aurora Serverless、Lambda、OpenSearch 和 HTTP 端点,并可以将多个数据源整合到 1 个 GraphQL 架构中。
实时订阅与离线同步
AppSync 的主要功能之一,是基于 GraphQL 订阅的实时数据同步。客户端注册订阅后,当服务器端的数据发生变更时,会通过 WebSocket 收到通知。它适合聊天应用程序、协同编辑工具、实时仪表板、实时记分板等要求即时性的用例。AppSync 承担 WebSocket 连接的管理、扩展和重新连接处理。此外,与 Amplify DataStore 组合使用时,则支持离线时的数据操作和恢复在线时的同步。设备离线期间也会将数据保存在本地存储中,网络连接恢复后,会基于冲突解决逻辑自动与服务器同步。AppSync 在 1 个服务中同时具备 GraphQL 的架构驱动开发和实时功能。
认证 / 授权与 Cognito 集成
AppSync 提供 5 种认证模式,可以根据用例灵活选择。API 密钥认证适合公共 API 和开发环境,Cognito 用户池认证提供包括用户注册 / 登录 / 令牌管理在内的认证流程。IAM 认证适合 AWS 服务之间的通信,OpenID Connect 认证与 Auth0、Okta 等外部身份提供商联动。在 Lambda 授权方中实现自定义的认证逻辑,以支持自有的认证方式。特别是在与 Cognito 的集成中,可以基于用户池的组信息进行字段级别的授权。以下是在 GraphQL 架构中定义授权规则的示例。
type Post @model
@auth(rules: [
{ allow: owner }
{ allow: groups, groups: ["Admin"], operations: [read, update, delete] }
{ allow: public, operations: [read], provider: iam }
]) {
id: ID!
title: String!
content: String!
owner: String
}通过这一定义,可以以声明方式设置这样的授权规则:帖子的创建者可以执行所有操作,Admin 组可以读取 / 更新 / 删除,未认证用户只能读取。借助多重认证模式,也可以在同一个 API 中为已认证用户和未认证用户授予不同的访问权限。
管道解析器与数据源集成
AppSync 的管道解析器是在 1 个 GraphQL 请求中执行针对多个数据源的操作的功能。例如,从 DynamoDB 获取用户信息,从 Aurora 获取该用户的订单历史,再用 Lambda 函数计算推荐内容,这样的 3 阶段处理通过单个 GraphQL 查询来处理。可以将每个步骤的输出作为下一个步骤的输入传递,并可以以声明方式定义复杂的数据聚合模式。可以使用 JavaScript 运行时编写解析器,无需使用 VTL(Velocity Template Language)就能编写数据转换和业务逻辑。以下是 JavaScript 解析器的示例。
// 请求处理程序
export function request(ctx) {
return {
operation: 'GetItem',
key: util.dynamodb.toMapValues({ id: ctx.args.id }),
};
}
// 响应处理程序
export function response(ctx) {
return ctx.result;
}通过缓存功能,可以缩短频繁访问的数据的响应时间,并减轻对后端的负载。使用 AppSync 的合并 API 功能,可以将多个团队独立开发的 GraphQL API 汇集到 1 个统一的端点,也适合微服务架构的构成。
使用该服务的价值
在 AWS AppSync 中,与 GraphQL API 的构建和运营相关的多项工作由 AWS 一方承担。作为全托管服务,不需要 WebSocket 服务器的构建 / 运营、扩展和补丁应用,开发团队可以专注于 API 的架构设计和业务逻辑。AppSync 的费用为查询 / 变更每 100 万个请求 4.00 美元,实时更新每 100 万条 2.00 美元(截至 2026 年 8 月)。通过与 Cognito 的集成将认证 / 授权自动化、通过与 DynamoDB 和 Aurora 的直接连接简化解析器、通过 Amplify DataStore 进行离线同步,有助于减少开发工作。通过合并 API 进行的微服务整合,在使团队之间能够独立开发的同时,为客户端提供统一的端点。
AppSync 的费用
查询和变更每 100 万个请求约 4.00 美元,实时更新(订阅)每 100 万条约 2.00 美元。启用缓存后,会增加缓存实例的按小时费用,另一方面后端的调用次数会减少。与 API Gateway + Lambda 的 REST 架构相比,请求单价偏高,但如果考虑通过解决 N+1 问题减少的后端调用,在复杂的数据获取模式中,也有 AppSync 成本效益更好的情况。
总结
AWS AppSync 以全托管方式提供 GraphQL API,全面支持实时订阅、离线同步、多层次的认证 / 授权以及基于管道解析器的复杂数据整合。通过与 Cognito 的集成进行用户管理、与 DynamoDB 和 Aurora 的直接连接,以及通过与 Amplify 的联动加速前端开发,支撑着现代数据驱动应用程序的构建。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。