Airbnb 的微服务架构质量工程之旅

标签: airbnb 微服务 架构 | 发表时间:2022-06-19 22:54 | 作者:新牛哥
出处:http://weekly.dockone.io

【编者的话】本文通过介绍 Airbnb 在将“纯微服务架构”改造为“Micro macroservices 架构”过程中,所采用的四个实践步骤:1)提供基础设施即代码以提高开发人员的生产力,2)明确所有权并通过工具和可观察性进行改进,3)定义由组织和方法支持的新架构,4)引入一个弃用工作组以加速迁移,详细阐述了质量工程(Quality Engineering)的增量迭代解决问题方法:1)定义问题,2)找到改进的解决方案,3)使用解决方案,4)提高解决方案采用率,5)处理解决方案的扩展挑战,为我们实践质量工程提供了一个很好的范例。



实现平衡是一个永无止境的开始。

当业务依赖软件质量和速度来生存时,这种平衡就更难维持了。

许多公司都面临着持续快速交付高质量软件的挑战,这些软件通过 质量工程限制生命周期。

Airbnb 在加速和扩展其价值主张的过程中面临着众多挑战,尤其是其信息系统的发展过程。

本文分享了 Airbnb 在质量工程方面的架构迭代之旅,并附有实用要点。参考文献可在文章末尾找到。

关注 QE 社区以获取来自社区的更多质量工程信息。

从单体应用到微服务,什么都没改变

Airbnb 和许多软件公司一样,也是由一些积极进取的工程师发起构建最小可行产品以进入他们的市场从而发展起来的。

该产品最初是单仓内的单体架构(在此处访问完整的 Airbnb 单仓旅程)。 Airbnb 在这种模式下从 2008 年开始发展,其功能由各小团队完成,小团队之间的依赖及其有限。



但在 2017 年,这个集中式架构达到了它的极限:
  • 软件变更速度降低
  • 平行演进面临限制因素
  • 组件所有权混乱


Airbnb 决定采用微服务。

现有的单体应用被拆分为前台和后台(分别是为了速度的 Hyperloop和为了稳定性的 Treehouse)。 微服务出现在各自仓库中,而专门的服务迁移团队负责组件的转换。



3 年后的 2020 年,该业务的收入将 达到 50 亿美元(直到 COVID 爆发)。团队和微服务持续增加。但是,原来的问题又回来了:功能需要由多个服务和不同团队同时开发。

在他们的架构口号“我们不能影响业务增长”的推动下,工程团队跳出原有方式,为这些反复出现的问题寻找可持续的解决方案。

Airbnb 架构演进的挑战

Airbnb 面临着架构解决方案的挑战,不但要解决现在的问题,同时要支持未来的扩张;这就是质量工程要解决的问题。

Airbnb 采用了增量和迭代过程:
  1. 定义问题
  2. 找到改进的解决方案
  3. 使用解决方案
  4. 提高解决方案采用率
  5. 处理解决方案的扩展挑战


这种方法能够分离每个问题的关注点,找到结构化的解决方案并在以后扩展它们。



Airbnb 在采用上述方法过程中实施了以下做法:
  1. 提供基础设施即代码以提高开发人员的生产力
  2. 明确所有权并通过工具和可观察性进行改进
  3. 定义由组织和方法支持的新架构
  4. 引入一个弃用工作组以加速迁移


让我们看看前述问题是如何解决的。

1. 提供基础设施即代码以提高开发人员的生产力

当业务变革能力依赖于软件时,缓慢和错误的软件开发直接影响公司的竞争力。

凭借在微服务架构方面的经验,Airbnb 投资了自动化和工具化。 但在一系列不断发展的技术中需要更快的迭代周期。



务实的解决方案是在单个仓库中投资基础设施即代码,从而逐步并行提升各个服务的采用率。

当运行更多服务时,就会出现理解这种复杂性的扩展挑战。

2. 明确所有权并通过工具和可观察性进行改进

有太多的微服务相互捆绑; 即使很小的变化也会导致相互依赖的变化和影响,掌握起来很复杂。



Airbnb 投资于提高生产力,重点支持三个领域的新架构:
  • 所有权
  • 可观察性
  • 工具


所有权

Airbnb 部署了“Scry Ownership”,它是技术组件所有权数据(如所有者、维护者、通信渠道)的应用管理者。



可观察性

Airbnb 设置了一系列可观察性仪表板,以系统地审查实施过程。 下面是一个仪表板示例,用于跟踪正在设置的所有权:



工具

数据空间仍然存在挑战。 定制的 Thrift 模式是有用的序列化器和数据描述符,但它们需要其他组件来检索产品中的数据。

Airbnb 利用 GraphQL 构建了统一的数据访问层,直接提供查询能力。



代码生成是提高开发人员生产力的最后一步。 随着技术的增加,Airbnb 为每一层的标准组件提供了模板。

通过设计指明数据类型和访问类型的代码注释,数据的访问甚至直接就被嵌入在了代码中。



当星号看起来对齐时,就会出现另一个速度问题。 这一次,中央数据聚合器组件成为了限制因素。

3. 定义由组织和方法支持的新架构

中央数据聚合器的构建和部署时间太慢,团队无法按时迭代。

即使提高了生产力,累积的结构复杂性仍然太高而无法在中央组件中处理。 需要一个新的组织。

熵是系统随着时间的推移变得更加复杂的自然趋势,需要支持和反作用力来平衡生态系统。

质量工程力量在架构、组织和 方法领域发挥作用。

支持增长的架构

太复杂了;团队必须对不同领域执行缓慢且成本高昂的影响分析,协调多个团队并纠正副作用错误。

让我们分析一下“ 纯微服务架构”级联问题树:
  • 复杂性过度分布在细粒度服务中
  • 这些细粒度的微服务缺乏稳定的协作点
  • 缺失的粘合剂最终分布在组件和团队之间
  • 即使是很小的变化也往往会导致混合影响。


核心问题是缺乏城市化,导致单体或微服务架构缺乏模块化和关注点分离。

Airbnb 采用了一种新的架构风格 Micro macroservices



在这样的架构中,每种类型的复杂性分布是一个清晰的层:
  • 统一 API是支持产品快速迭代的微服务
  • 中央数据聚合器是具有紧密耦合的稳定单体
  • 服务块外观 API抽象了提供实体块的微服务。


阅读本文,了解有关 速度和质量架构的价值的更多信息。

组织一致性支持新架构

旨在支持业务目标的组织可以改变游戏规则。 这种调整对于 Airbnb 的加速发展至关重要。

该组织与不断发展的架构保持一致,产品团队在统一 API 之上工作,数据聚合团队在中央数据层(即“胶水”),以及每个数据方面的域平台团队(预留、用户)。



方法强制通往新架构的铺平道路

架构审查、IT 委员会、工艺治理——这些都是用于根据当前环境和未来架构审查提出的解决方案的方法。

这种方法的价值在于作为一种反力量,在由其他目标驱动的项目环境之外,以平衡选择。

Airbnb 使用这些方法为 Micro macroservices 架构铺平了道路。



即使不包括在内,Airbnb 的*管理层**肯定对领导转型和发展新模式的文化以及发展*技能*产生了巨大影响,从而完成了 MAMOS 的范围。

有了这些变化,Airbnb 能够引领平行的迁移轨道。但是弃用 Monolith 仍然需要太多时间。

4. 引入弃用工作组加速迁移

单独更改我们的银行账户已经是一场噩梦。当需要数年时间与多个团队协调才能完成时,这项任务就更加复杂了。

Airbnb 就像许多其他拥有遗留系统和持续业务的组织一样:他们无法在建造新房子的同时炸毁他们居住的房子。

一个特定的组织单位致力于加速从单体架构中迁移出来,领导以下工作:
  • 移动应用程序弃用达12个月以上
  • 提升和跟踪整体债务以获得可见性
  • 日落低使用率的终端以加速删除
  • 迁移的长期所有权
  • 认识到折旧对估值有影响


这个团体有游说的反击力量,但对于实现迁移目标至关重要。反对单体应用不能是“每个人的责任”。

当这项任务完成时,将面临其他挑战。



Airbnb 的架构质量工程之旅

Airbnb 架构演变的这一观点为 Quality at Speed 软件提供了具体的质量工程要点。

首先,区分局部问题或扩展问题可以更好地识别潜在原因,从而更好地采用增量解决方案。

在精益方法中,Airbnb 的团队在遇到问题时解决问题,避免不必要的预优化等浪费。

从我的角度来看,一个可行的要点在于架构,MAMOS 的其他元素是这个结构块的对齐。

从单仓内的单体应用出发,然后根据业务发展对其进行划分,就像他们对两个存储库所做的那样。

然后,他们的故事举例说明了“ 纯微服务架构”的问题,并被具有延迟的反馈循环的 Micro macroservices 架构所取代。

您将使用哪种架构风格?

原文链接: Airbnb’s Microservices Architecture Journey To Quality Engineering(翻译:池剑锋)

相关 [airbnb 微服务 架构] 推荐:

Airbnb 的微服务架构质量工程之旅

- - DockOne.io
当业务依赖软件质量和速度来生存时,这种平衡就更难维持了. 许多公司都面临着持续快速交付高质量软件的挑战,这些软件通过 质量工程限制生命周期. Airbnb 在加速和扩展其价值主张的过程中面临着众多挑战,尤其是其信息系统的发展过程. 本文分享了 Airbnb 在质量工程方面的架构迭代之旅,并附有实用要点.

谈微服务架构

- - 人月神话的BLOG
其实在前面很多文章谈到SOA,特别是系统内的SOA和组件化的时候已经很多内容和微服务架构思想是相同的,对于微服务架构,既然出现了这个新名称,那就再谈下微服务架构本身的一些特点和特性. 从这个图可以看到微服务架构的第一个重点,即业务系统本身的组件化和服务化,原来开发一个业务系统本身虽然分了组件和模块,但是本质还是紧耦合的,这关键的一个判断标准就是如果要将原有的业务系统按照模块分开部署到不同的进程里面并完成一个完整业务系统是不可能实现的.

微服务与架构师

- - 乱象,印迹
因为工作的关系,最近面试了很多软件架构师,遗憾的是真正能录用的很少. 很多候选人有多年的工作经验,常见的框架也玩得很溜. 然而最擅长的是“用既定的技术方案去解决特定的问题”,如果遇到的问题没有严格对应的现成框架,就比较吃力. 这样的技能水平或许适合某些行业,但很遗憾不符合我们的要求. 软件架构师到底应该做什么,又为什么这么难做好,这都是近来的热门问题,我也一直在和朋友们讨论.

面向服务与微服务架构

- - CSDN博客推荐文章
最近阅读了 Martin Fowler 和 James Lewis 合著的一篇文章  Microservices, 文中主要描述和探讨了最近流行起来的一种服务架构模式——微服务,和我最近几年工作的实践比较相关感觉深受启发. 本文吸收了部分原文观点,结合自身实践经验来探讨下服务架构模式的演化. 面向服务架构 SOA 思想概念的提出已不是什么新鲜事,大概在10年前就有不少相关书籍介绍过.

微服务架构实践感悟

- - mindwind
从去年初开始接触微服务架构的一些理念,然后到今年开始实施系统第四个大版本的架构升级决定采用这套架构理念. 最近关于微服务架构的讨论还是多起来,因为国外一些著名互联网公司(如:Amazon、Netflix 等)从实践中摸索出了一套新的大型系统架构方法论,并取得了成功,树立了很好的示范,然后这套方法论渐渐就被一些技术理论派 人士命名为微服务架构(Microservices).

微服务架构成功之路

- - CSDN博客推荐文章
本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/07/success-of-microservices. 近年来,在软件开发领域关于微服务的讨论呈现出火爆的局面,有人倾向于在系统设计与开发中采用微服务方式实现软件系统的松耦合、跨部门开发;同时,反对之声也很强烈,持反对观点的人表示微服务增加了系统维护、部署的难度,导致一些功能模块或代码无法复用,同时微服务允许使用不同的语言和框架来开发各个系统模块,这又会增加系统集成与测试的难度,而且随着系统规模的日渐增长,微服务在一定程度上也会导致系统变得越来越复杂.

微服务架构-模块迁移

- - 人月神话的BLOG
对于遗留的单体应用,要进行微服务架构的改造往往比一个全新应用基于微服务架构实现更加困难. 对于单体应用的微服务架构改造,最常见的方式仍然是将低耦合的模块逐步迁出. 下面以一个采购系统中招投标模块迁出为例进一步思考单体应用的微服务架构改造步骤. 在整个模型中我们将模型进行简化,当迁出一个功能模块进行微服务化的时候,首先要考虑的就是对该模块进行集成架构分析,考虑该模块和外围的集成情况,其次才是考虑该模块内部的私有数据.

SOA和微服务架构沟通(2.8)

- - 人月神话的BLOG
今天在广州交流SOA和微服务架构,特对关键内容做简单记录. 对于SOA和微服务架构的区别,在知乎一个回答里面我已经进行了详细的说明,即微服务架构强调的第一个重点就是 业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用. 这些小应用之间通过服务完成交互和集成.

微服务下的数据架构

- - IT瘾-dev
微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微服务,而本文将从以下几个角度来和大家分享在微服务架构下进行数据设计需要关注的地方,旨在帮助大家在构建微服务架构时,提供一个从数据方面的视角:. 按照 Martin Fowler 的定义,微服务是一个软件架构模式,通过开发一系列的小型服务的方式来实现一个应用.

微服务架构之事件驱动架构 - 简书

- -
为了解决传统的单体应用(Monolithic Application)在可扩展性、可靠性、适应性、高部署成本等方面的问题,许多公司(比如Amazon、eBay和NetFlix等)开始使用微服务架构(Microservice Architecture)构建自己的应用. 微服务(Microservices) 是一种软件架构风格 (Software Architecture Style),它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模组化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic) 的 API 集相互通讯.