使用 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,也可参考Amazon 上的相关书籍。
AppSync 的定价
AppSync 的费用由查询/变更的执行次数和实时更新构成。查询和变更每 100 万次请求约 4.00 美元,实时更新(订阅)每 100 万次连接约 2.00 美元加数据传输量计费。启用缓存后会增加缓存实例的按时计费(t2.small 约 0.028 美元/小时),但可减少对 DynamoDB 和 Lambda 的调用次数,因此对于读取密集型工作负载,总成本可能降低。与 API Gateway + Lambda 的 REST 架构相比,单次请求单价较高,但考虑到通过消除 N+1 问题减少后端调用,在复杂数据获取模式下 AppSync 可能更具成本效益。
总结
AppSync 是最适合需要实时更新和灵活数据获取的应用的 GraphQL 服务。通过基于 WebSocket 的订阅实现实时通知,通过管道解析器整合 DynamoDB、Lambda、RDS 等多个数据源。还以托管方式提供多认证的精细访问控制。