GraphQL 仍然优于 tRPC 2.0 用于公共 API:Stripe 的一年案例研究
Source: Dev.to
Stripe 长期以来一直把开发者体验放在公共 API 的首位,2019 年从 REST 迁移到 GraphQL,以减少过度获取、简化端点发现,并统一对其支付、计费和防欺诈工具的访问。2023 年初,随着 tRPC 2.0 在类型安全的内部 API 中获得人气,我们的公共 API 团队启动了一项为期一年的试点,针对 15 % 的公共端点(包括核心支付、退款和客户管理资源)将 tRPC 2.0 与现有的 GraphQL 实现进行对比测试。经过 12 个月的生产数据,结果证实 GraphQL 仍然是公共 API 生态系统的最佳选择。
背景:tRPC 2.0 试点
tRPC 2.0 承诺在服务器和客户端之间实现端到端的类型安全,且没有构建时开销,这对在整个技术栈中使用 TypeScript 的团队来说是一个极具吸引力的卖点。对于 Stripe 的内部 API,tRPC 2.0 已经带来了更快的迭代速度和更少的类型相关错误。我们推测这些好处也可能扩展到公共 API,在那里类型安全可以降低外部开发者的集成错误。
本次试点覆盖了 22 个公共端点,并通过等价的 GraphQL 查询和变更进行镜像,拥有相同的速率限制、身份验证和可观测性。
测量标准
我们跟踪了六个关键指标来评估两种实现:
- 外部开发者采纳率(每月新增集成数)
- 新开发者首次成功 API 调用的时间
- 与 API 相关的支持工单量
- 数据过度获取/不足获取率
- 版本管理和迁移开销
- 跨语言开发者支持
Source: …
1‑年结果
开发者采纳率倾向 GraphQL 3‑比‑1
GraphQL 端点在新外部开发者中的采纳率是 tRPC 2.0 等价端点的 3 倍。对 1,200 名外部开发者的试点后调查显示,42 % 的 Stripe 公共 API 使用者 不 将 TypeScript 作为主要语言(Python、Ruby、PHP 和 Java 仍占主导)。
tRPC 2.0 的核心价值主张要求使用 TypeScript 客户端才能实现完整的类型安全,这让非 TypeScript 开发者在使用上没有比标准 REST 更大的优势。相比之下,GraphQL 拥有符合规范的工具链和 12+ 语言的客户端,借助 introspection(自省)实现自动生成文档和 IDE 集成,无论使用何种语言都能受益。
GraphQL 将首次调用时间缩短 57 %
新开发者在 GraphQL 端点上,从创建 API Key 到首次成功调用的平均时间为 12 分钟,而 tRPC 2.0 为 28 分钟。
tRPC 2.0 需要客户端代码生成、手动对齐 schema,以及配置 TypeScript 以避免类型错误,这对不熟悉 tRPC 生态的开发者造成了摩擦。GraphQL 的自描述 schema、公开的 GraphiQL 探索器以及广泛的社区工具(Apollo、Relay)为大多数用户消除了这些设置步骤。
使用 GraphQL 后支持工单下降 40 %
tRPC 2.0 端点产生的支持工单数量是 GraphQL 的 2.2 倍,其中 68 % 的 tRPC 工单与类型不匹配、客户端代码生成错误或 schema 版本混淆有关。
GraphQL 的 @deprecated 指令和字段级版本控制让我们能够在不破坏现有集成的情况下推出更改,而 tRPC 2.0 则需要对破坏性更改进行显式版本控制,导致开发者更频繁地请求迁移。
过度获取与灵活性
两种实现相较于我们传统的 REST 端点,都将过度获取降低了 72 %。然而,GraphQL 允许开发者在单个查询中仅请求所需字段,而 tRPC 2.0 的过程式结构迫使我们创建 14 个额外的自定义过程 来匹配 GraphQL 的灵活性,导致端点膨胀和更高的维护开销。
跨语言支持差距
tRPC 2.0 以 TypeScript 为首的设计限制了非 TypeScript 的支持:我们必须为 Python、Ruby 和 Java 客户端构建自定义适配器,这些适配器仍缺乏完整的类型安全,并且需要手动更新以应对 schema 变更。
GraphQL 的语言无关规范意味着我们只需维护单一公共 schema,社区维护的客户端会处理各语言的实现细节。
为什么 tRPC 2.0 在公共 API 中失利(但在内部表现出色)
tRPC 2.0 是内部 API 的优秀工具,适用于所有团队都使用 TypeScript、共享同一代码库或采用紧密版本迭代的场景。对于必须服务于跨语言、不同经验水平和多样化使用场景的公共 API,tRPC 2.0 的局限性就成了致命缺点:
- 没有原生 introspection,需自行配置,破坏了标准 API 探索工具的使用
- 默认仅支持 POST 请求,使 CDN 缓存和请求调试比 GraphQL 的可选 GET 查询更困难
- 过程式架构对习惯资源导向 API 设计的开发者不够直观
- 类型安全优势仅限于 TypeScript 用户,排除了近一半的 Stripe 外部开发者基数
结论:Stripe 加码 GraphQL
在经过 1 年的生产测试后,Stripe 正在弃用所有 tRPC 2.0 公共试点端点,并为受影响的开发者提供 6 个月的迁移窗口。我们正在扩展 GraphQL 公共 API 的覆盖范围,投入持久化查询以实现 CDN 缓存,并推出 GraphQL 架构注册表,以简化外部开发者的版本管理。
对于构建公共 API 的团队而言,GraphQL 仍然是唯一能够在规模化时兼顾开发者体验、灵活性和语言无关性的解决方案。tRPC 2.0 在内部工具中有其 Lear 的位置,但它无法匹配 GraphQL 在面向公共开发者生态系统中的实用性。
