使用 AWS AppSync 构建实时 GraphQL API - 订阅与解析器设计
介绍通过基于 WebSocket 的订阅实现实时通知,并使用 DynamoDB / Lambda 管道解析器整合多个数据源的设计模式。
AppSync 与 REST API 如何选择
AppSync 是 AWS 的托管 GraphQL 服务,每秒最多可处理数千个请求,并通过 WebSocket 支持最多 10 万个并发连接。使用 REST API 时,需要调用多个端点来组装所需的数据,而使用 GraphQL,只需一个查询即可只获取所需的字段。它适合移动应用等带宽受限的环境,以及跨多个数据源获取数据的仪表板。另一方面,对于简单的 CRUD 或面向第三方的公开 API,API Gateway + Lambda 的 REST 架构更简单。AppSync 适合需要实时更新的应用、复杂的数据获取模式,以及前端团队要求 API 灵活性的场景。
实时订阅
AppSync 的订阅在 WebSocket 上运行,以 Mutation 的执行为触发向客户端推送数据。在 Schema 中定义 Subscription 类型,并用 @aws_subscribe 指令指定目标 Mutation,即可设置实时通知。在聊天应用中,执行新消息的 Mutation 后,消息会分发给订阅同一聊天室的所有客户端。通过订阅的筛选,客户端可以只接收与自己相关的数据变更。连接管理由 AppSync 自动完成,因此无需运维 WebSocket 服务器。
解析器设计与数据源整合
解析器是连接 GraphQL 字段与数据源的组件。DynamoDB 解析器使用 VTL(Velocity Template Language)或 JavaScript 编写映射模板,执行 GetItem、PutItem、Query、Scan 等 DynamoDB 操作。管道解析器可以串行执行多个函数,并将前一个函数的结果传递给下一个函数。例如,可以采用这样的结构:第一个函数从 DynamoDB 获取用户信息,下一个函数从另一个表获取该用户的订单历史。一种分别使用的方式是:Lambda 解析器用于涉及复杂业务逻辑或外部 API 调用的处理,DynamoDB 解析器用于简单的 CRUD。
AppSync 的定价
AppSync 的费用由查询 / 变更的执行次数和实时更新构成。查询和变更每 100 万次请求约 4.00 美元,实时更新(订阅)每 100 万次更新约 2.00 美元,在此基础上再加上连接时间和数据传输量的费用(截至 2026 年 8 月)。启用缓存后会增加缓存实例的按小时计费(t2.small 约 0.028 美元/小时),但由于可以减少对 DynamoDB 和 Lambda 的调用次数,对于读取较多的工作负载,总成本有时会降低。与 API Gateway + Lambda 的 REST 架构比较成本时,除了请求的单价之外,还要看通过消除 N+1 问题而减少的后端调用次数。
Schema 设计的基础
GraphQL API 的设计从定义 Schema 开始。Schema 声明了所处理数据的类型以及客户端可以执行的操作,它本身就是 API 的规范。定义获取数据的查询、进行变更的变更操作,以及实时接收变更的订阅。首先认真设计 Schema,客户端和服务器的开发人员就能基于共同的规范并行工作。能够不多不少地只获取要用的数据是 GraphQL 的特点,而 Schema 设计是其前提。
解析器的种类与设计
解析器将 Schema 中定义的操作与对实际数据源的处理联系起来。对单个数据源的简单处理,使用单元解析器。依次调用多个数据源或组合多个处理时,使用将多个步骤串联起来的管道解析器。这样就可以在一次请求中整合并返回多项相关数据。部分数据源还提供可从解析器直接集成的机制,可以省去多余的代码。根据操作的复杂程度选择解析器的结构。
认证 / 授权模式
AppSync 支持多种认证方式,可以根据 API 的用途进行选择。包括与用户认证平台集成的方式、使用 AWS 权限机制的方式、基于简易密钥的方式、插入自有认证逻辑的方式等。此外,还可以按字段控制授权,进行只向特定用户组公开特定数据之类的精细控制。也可以组合多种认证方式,按用途分别使用。在 API 设计阶段决定谁可以访问哪些数据。
离线支持与冲突解决
对于移动应用等在网络不稳定的环境中使用的应用,要将离线时的行为纳入设计。AppSync 提供了离线时也能在本地操作数据、并在连接恢复时与服务器同步的机制。此时,如果多个用户修改了同一数据,变更可能会发生冲突。事先设计好优先采用哪一方的变更之类的冲突解决方法,就能保持数据的一致性。纳入离线支持和冲突解决,使应用在通信状况不稳定时可以使用。
总结
AppSync 是一项适合需要实时更新和灵活数据获取的应用的 GraphQL 服务。它通过基于 WebSocket 的订阅实现实时通知,并通过管道解析器整合 DynamoDB、Lambda、RDS 等多个数据源。它还以托管方式提供基于多种认证的精细访问控制。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。