微服务架构的演进和解决的问题
许多软件公司都是从构建最小可行产品(Minimum Viable Product,MVP)进入市场并发展起来的;产品最初是单仓内的单体架构(Monolith),其功能由各小团队完成,小团队之间的依赖极其有限。
Airbnb也是如此,但在 2017 年,这个集中式架构达到了它的极限:
1. 软件变更速度降低;
2. 各团队分头并行演进面临限制;
3. 组件所有权混乱;
于是Airbnb 决定采用微服务架构(MicroServices),原本的单体应用被拆分为前台和后台(前后端分离),微服务可能出现在两边,再由专业的服务迁移团队(Dedicated service migration team)来专门负责组件的调整。(但如果与许多国内厂商相比,事实上Airbnb在这方面已经领先很多步了。)
三年时间里,伴随着业务的快速增长,Airbnb的微服务和对应的团队持续增加;也正因此,原来的问题又再次出现了:功能需要由多个服务和不同团队同步进行开发。
对微服务进行拆分以后,服务依赖的复杂度变得很高,服务治理也越发困难,一线的开发人员也很难理解服务之间的关系。(这点其实在中国的许多互联网公司里也普遍存在)
所以第三步,Airbnb将微服务合并成了宏服务(Marco Services),宏服务内部使用thrift通信,对外则通过暴露GraphQL接口实现对接,进一步治理了企业的平台架构。
Airbnb的微服务架构演进从Airbnb的架构治理之路上可以看出,随着对架构治理的进步,企业会逐步碰到以下问题:
依靠核心角色进行架构治理带来的低效与脆弱性:当核心数字化业务从MVP生长为完整且复杂的产品后,业务上、团队上、技术上都会开始丰富并产生分化,不同模块需要独立进行演进,而不是共同配合一起来发布版本;所以团队表现出来的这些架构上的问题:软件变更速度降低、各团队分头并行演进面临限制、组件所有权混乱,都是因为不同模块的业务感受到自身发展受到集体拖累,而表达出来的、独立演进的诉求; 但究其根本,是研发团队需要过多得去理解不在其责任范围内的代码,而带来效率上的下降,是小团队工作、协作方式延续导致的结果;当团队规模很小时,核心架构师们可以快速对接并了解产品的架构全貌;而当团队规模扩大、核心人员离职等情况发生后,团队间再继续依靠频繁沟通、对齐的方式来解决问题,就会变得低效且重复;这时更需要通过明确团队职责和协作方法,用流程和机制来代替“人对人”之间的管理与合作。 微服务架构能够有效地解决团队责任田的问题,虽然这对于技术人员的专业性要求很高,而且必不可免的少不了专门的团队来辅助执行(也就是说有额外成本),但在建设过程中确实能降低各模块团队所需要面对的复杂性,最终微服务实现的其实就是将核心角色脑子中的知识,通过架构传递给团队。
难以理解的依赖地图,图片来源:Airbnb博客依赖微服务进行架构治理带来的复杂度:随着微服务拆分的越来越多,对微服务本身的理解复杂度就又上升了;且不论是因为人员能力不足、还是沟通不足够充分,总之常态的结果就是必然导致微服务架构的这些问题:由于微服务的颗粒度较细而产生的理解复杂度、这些细颗粒度的微服务缺乏稳定的协作节点(导致修改、协作成本高)、缺乏协调能力导致协作成本由团队承担、即使是很小的变化也往往会导致连锁的影响; 问题的核心就在于,团队虽然通过微服务架构降低了与其它团队协作的成本,但这种缺乏管理的微服务生产方式,又会导致团队间缺乏必要的合作,最终致使承载在架构上的知识和上下文变得支离破碎,这时就需要对微服务进行管理(比如用分层、分领域等方式使微服务能更方便地被检索和理解)。 Airbnb探索出来的“三层架构”解决方案,就是用统一语言的API(Unified APIs)支持产品快速迭代,再通过耦合很强的单体“中央数据处理层”(Central data aggregator)来统筹API之间的关系,最后用抽象出来的API集合作为领域对偏底层的微服务进行合并。
简单来说,架构治理就是一个复杂的知识传递过程,本质上解决的是厘清“谁负责哪块代码,并如何让别人知道他负责这部分的代码,以及如何使用和协作这块代码”的问题;这样在团队进行代码开发时,可以用最低的成本理解并按设计思路去使用他人(微服务的负责人)提供的服务。
而除了过程中总结的方法论本身外,Airbnb也少不了用工具、组织架构辅助、配合方法论的执行。
比如Airbnb 部署了“Scry Ownership”,它是技术组件所有权数据(如所有者、维护者、通信渠道)的应用管理者。也就是说,通过这个工具,当你碰到不理解的微服务的时候,也能找得到人去询问并进行更深层次的合作。
“Scry Ownership”,图片来源:Airbnb博客又比如Airbnb的“三层架构”解决方案,也是分别对应专门的产品团队(Product Team)、数据集成团队(Data aggregation team)和领域平台团队(Domain platform teams),来负责不同层级具体的开发;换句话说,Airbnb让组织架构配合技术架构进行了调整和匹配。
研发团队对应着具体职责