干货|Netflix 联邦 GraphQL 平台的过程及教训

在之前的文章和QConPlus讨论中 , 我们讨论了GraphQLFederation作为一种解决方案是如何分发我们的GraphQL模式及其实现的 。 在这篇文章中 , 我们会将注意力转移到成功运行联邦GraphQL平台所需的内容上——从它实现的过程到我们汲取的经验教训等方面 。

干货|Netflix 联邦 GraphQL 平台的过程及教训
文章图片
我们迄今为止的旅程
在过去的一年中 , 我们已经实现了联邦GraphQL架构所需的核心基础架构 , 正如我们前一篇文章所描述的那样:

干货|Netflix 联邦 GraphQL 平台的过程及教训
文章图片
StudioEdge架构
该平台上的第一个Graph域服务(DomainGraphService , DGS)是我们在第一篇文章(StudioAPI)中讨论过的GraphQL单体应用 。 接下来 , 我们与其他几个应用程序团队合作一起制作了DGS , 使其API能与之前的单体应用一起公开 。 到2019年底 , 我们有了第一个使用联邦Graph的Studio应用程序 , 性能没有任何下降 。 我们知道这个架构是可行的之后 , 就专注于为它更广泛的使用做准备了 。 我们的目标是在2020年4月开放StudioEdge自助服务平台 。
2020年4月是一个动荡的时期 , 疫情大流行 , 人们一夜之间就过渡到了远程办公 。 尽管如此 , 各小组还是开始了成群结队地投入到Graph中 。 很快 , 我们每天都有数百名工程师直接为API贡献力量 。 而那个曾经是瓶颈的StudioAPI单体应用呢?我们将StudioAPI公开的字段迁移到个人拥有的DGS中 , 而不破坏用户的API 。 原单体应用预计将在2020年底完全弃用 。
这段旅程并非没有挑战 。 最大的挑战在于需在整个组织内协调这一战略 。 最初 , 有很多人持怀疑态度并有异议;这个概念相当新 , 需要整个组织高度一致才能成功 。 我们的团队花了很多时间来解决不同意见 , 并根据开发人员的反馈对架构进行了调整 。 通过我们的原型开发以及与一些关键批评声音的积极合作 , 我们能够逐渐增加信心并弥合关键差距 。
一旦我们在这个想法上达成了广泛的一致 , 我们就需要确保其采用是无缝的 。 这就需要构建鲁棒性强的核心基础设施 , 以确保良好的开发人员体验 , 并能解决关键的跨域问题 。
核心基础设施
我们的GraphQL网关(GraphQLGateway)基于Apollo的参考实现 , 并且用Kotlin编写 。 这使得我们能够访问Netflix的Java生态系统 , 同时也为我们提供了鲁棒性强的语言特性 , 比如用于高效并行抓取的协程(coroutines) , 以及具有null安全的表述性类型系统(expressivetypesystem) 。
模式注册(SchemaRegistry)是内部开发的 , 也是用的Kotlin 。 为了存储模式变更 , 我们使用了一个内部库 , 该库是在Cassandra数据库之上实现的事件源模式 。 使用事件源允许我们实现新的开发者体验特性 , 比如SchemaHistory视图 。 模式注册还集成了我们的CI/CD系统 , 如Spinnaker , 可以为DGS自动设置云网络 。
开发人员教育与经验
在之前的架构中 , 只有单体应用StudioAPI的团队需要学习GraphQL 。 在StudioEdge中 , 每个DGS团队都需要在GraphQL上积累专业知识 。 GraphQL有自己的学习曲线 , 对于像批处理(Batching)和先行断言(Lookahead)这样的复杂情况 , 它会变得特别棘手 。 另外 , 正如前一篇文章所讨论的那样 , 理解GraphQLFederation和实现实体解析器(EntityResolver)也不是一件容易的事 。
我们与Netflix的开发者体验(Netflix’sDeveloperExperience , DevEx)团队合作 , 为开发人员提供文档、培训材料和教程 。 对于一般的GraphQL问题 , 我们依赖于开源社区 , 并建立了一个内部GraphQL社区来讨论诸如分页、错误处理、可空性和命名约定之类的热门话题 。
DGS框架和开发者工具
为了方便后端工程师构建GraphQLDGS , DevEx团队在GraphQLJava和SpringBoot的基础之上构建了一个“DGS框架”(“DGSFramework”) 。 该框架解决了运行在生产环境中的GraphQL服务的所有跨域问题 , 同时也使开发人员能更容易地编写GraphQL解析器 。 此外 , DevEx还构建了强大的工具 , 可用于将模式推送到模式注册SchemaRegistry中 , 并构建了一个自助服务UI(SelfServiceUI) , 可用于浏览各种DGS模式 。 点击查看他们的会议演讲 , 期待我们的同事将来能发表一篇相关的博文 。 DGS框架计划于2021年初开源 。
模式治理
Netflix的Studio数据极其丰富和复杂 。 在早期 , 我们预期活动的模式管理对模式演进和整体的健康是至关重要的 。 我们组织中已经有一位Studio数据架构师(StudioDataArchitect)了 , 他专注于跨Studio的数据建模和对齐 。 我们与他们合作 , 一起确定了最适用于StudioEngineering需求的Graph模式的最佳实践 。