当前位置: 首页 > news >正文

周志明:《凤凰架构:构建可靠的大型分布式系统》

架构模式的每一次演进都是凤凰涅槃

系统架构的每一次迭代都是浴火重生

构成系统的每一个部件都是一只不死鸟


构成大规模系统的每一个部件都可以是不可靠的,会出错,会老朽,甚至是消亡,如何让不可靠部件构成的系统持续保持可靠性,本书将给你答案:

《凤凰架构:构建可靠的大型分布式系统》

超级畅销书《深入理解Java虚拟机》作者周志明最新力作,国内多位架构专家联袂推荐,从架构演进、架构设计思维、分布式技术、不可变基础设施、技术方法论5个维度全面探索如何构建可靠的大型分布式系统。

什么是“凤凰架构”

“Phoenix”(凤凰)这个词在东方的技术书中不常用,但在西方的软件工程读物中,尤其是在关于敏捷、DevOps话题的作品中时常出现。软件工程小说《凤凰项目》讲述了徘徊在死亡边缘的凤凰项目在精益方法下浴火重生的故事;Martin Fowler在诠释“持续交付”时,曾多次提到“Phoenix Server”(凤凰服务器,取其能够“涅槃重生”之意)与“Snowflake Server”(雪花服务器,取其“世界上没有相同的两片雪花”之意)的优劣比对。也许是东西方文化的差异,尽管有“失败是成功之母”这样的谚语,但我们东方人的骨子里更注重的还是一次把事做对、做好,尽量别出乱子;而西方人则要“更看得开”一些,把出错看作正常甚至是必需的发展过程,只要出了问题能够兜底使其重回正轨便好。

在软件工程里,任何产品的研发,如果持续时间很长,人总免不了疏忽、犯错,导致代码存在缺陷,电脑宕机崩溃,网络堵塞中断……如果一项工程需要大量的人员共同研发某个大规模的软件产品,并使其分布在网络中的大量的服务器节点中同时运行,随着项目规模增大、运作时间变长,其必然会受到墨菲定律的无情打击。

为了得到高质量的软件产品,我们是应该把精力更多地集中在提升其中每一个人员、过程、产出物的能力和质量上?还是应该把更多精力放在整体流程和架构上?

笔者对这个问题先给一个“和稀泥”式的回答:这两者都重要。前者重术,后者重道;前者更多与编码能力相关,后者更多与软件架构相关;前者主要由开发者个体的水平决定,后者主要由技术决策者的水平决定。

然而,笔者也必须强调此问题的另外一面:这两者的理解路径和抽象程度是不一样的。如何学习一项具体的语言、框架、工具,譬如Java、Spring、Vue.js等,是相对具象的,不论其蕴含的内容多少,复杂程度高低,它至少是能看得见、摸得着的。而如何学习某一种风格的架构方法,譬如单体、微服务、服务网格、无服务、云原生等,则是相对抽象的,谈论它们可能要面临“一千个人眼中有一千个哈姆雷特”的困境。谈这方面的话题,若要言之有物,就不能是单纯的经验陈述。回到这些架构根本的出发点和问题上,笔者认为,真正去使用这些不同风格的架构方法来实现某些需求,解决某些问题,然后在实践中观察它们的异同优劣,会是一种很好的也许是最好的讲述方式。笔者想说一下这些架构,而且想说得透彻明白,就需要代码与文字的配合,于是便有了这本书,以及与它配套的实践项目。

可靠的系统

让我们再来思考一个问题,构建一个大规模但依然可靠的软件系统,是否可行?

这个问题听起来的第一感觉也许会有点荒谬。如果这个事情从理论上来说就是根本不可能的,那我们这些软件开发人员在瞎忙活些什么?但你再仔细想想,前面才提到的“墨菲定律”和在“大规模”这个前提下必然会遇到各种“不靠谱”的人员、代码、硬件、网络等因素,从中能得出一个听起来颇为合理的推论:如果一项工作要经过多个“不靠谱”的过程相互协作完成,其中的误差应会不断累积叠加,导致最终结果必然不能收敛稳定。

这个问题也并非杞人忧天、庸人自扰式的瞎操心,计算机之父冯·诺依曼在20世纪40年代末期,曾经花费大约两年时间,研究这个问题并且得出了一个理论—自复制自动机(Self-Reproducing Automata)。这个理论以机器应该如何从基本的部件中构造出与自身相同的另一台机器引出,其目的并不是想单纯地模拟或者理解生物体的自我复制,也并不是想简单地制造自我复制的计算机,而是想回答一个理论问题:如何用一些“不可靠”部件构造出一个可靠的系统。

当时自复制自动机的艺术表示(图片来自维基百科)

自复制自动机恰好就是一个最好的用“不可靠”部件构造可靠系统的例子。这里,“不可靠”部件可以理解为构成生命的大量细胞,甚至是分子。由于热力学扰动、生物复制差错等因素干扰,这些分子本身并不可靠。但是生命系统之所以可靠,恰是因为它可以使用“不可靠”部件来完成遗传迭代。这其中的关键点便是承认细胞等零部件可能会出错,某个具体的零部件可能会崩溃消亡,但在存续生命的微生态系统中其后代一定会出现,重新代替该零部件,实现它的作用,以维持系统的整体稳定。在这个微生态里,每一个部件都可以看作一只“不死鸟”(Phoenix),它会老迈,又能涅槃重生。

架构的演进

从大型机(Mainframe)、原始分布式(Distributed)、大型单体(Monolithic)、面向服务(Service-Oriented)、微服务(Microservice)、服务网格(Service Mesh)到无服务(Serverless)等,技术架构确实呈现出“从大到小”的发展趋势。近年来,自微服务兴起以后,涌现出各类文章去总结、赞美微服务带来的种种好处,诸如简化部署、逻辑拆分更清晰、便于技术异构、易于伸缩拓展以提供更高的性能等,这些当然都是重要优点和动力。可是,如果不拘泥于特定系统或特定某个问题,以更宏观的角度来看,前面所列的种种好处都只能算是“锦上添花”,是属于让系统“活得更好”的动因,肯定比不上系统如何“确保生存”的需求更关键、更贴近本质。在笔者看来,架构演变最重要的驱动力,或者说这种“从大到小”的变化趋势的最根本驱动力,始终都是为了方便某个服务能够顺利地“死去”与“重生”。个体服务的生死更迭,是关系到整个系统能否可靠存续的关键因素。

举个例子,某企业中应用的单体架构的Java系统,其更新、升级都必须要有固定的停机计划,必须在特定的时间窗口内才能按时开始,且必须按时结束。如果出现了非计划的宕机,那便是生产事故。但是软件的缺陷不会遵循定下的停机计划来“安排时间出错”。为了应对缺陷与变化,做到不停机地检修,Java曾经制定了OSGi和JVMTI Instrumentation等复杂的HotSwap方案,以实现“给奔跑中的汽车更换轮胎”这种匪夷所思却又无可奈何的需求。而在微服务架构的视角下,所谓系统检修,不过只是一次在线服务更新而已,先停掉1/3的机器,升级新的软件版本,再有条不紊地导流、测试、做金丝雀发布,一切都显得如此理所当然、平淡寻常。在无服务架构的视角下,我们甚至都不需要关心服务所运行的基础设施,连机器是哪台都不必知道,停机升级就更无须关注了。

流水不腐。有老朽,有消亡,有重生,有更迭,才是生态运行的合理规律。设想一下,如果你的系统中的每个部件都符合“Phoenix”的特性,哪怕其中某些部件采用了由“极不靠谱”的人员所开发的“极不靠谱”的程序,哪怕存在严重的内存泄漏问题,哪怕最多只能服务三分钟就会崩溃,只要在整体架构设计有恰当且自动化的错误熔断、服务淘汰和重建机制,从系统外部来观察,架构仍然有可能表现出稳定和健壮的服务能力。

凤凰架构

在企业软件开发的历史中,一项新技术发布时,常有伴以该技术开发的“宠物店”(PetStore)作为演示的传统(如J2EE PetStore、.NET PetShop、Spring PetClinic等)。在对不同架构风格的演示中,笔者本也希望能遵循此传统,却无奈从来没养过宠物,遂改行开了书店(Fenix’s Bookstore),里面出售了几本笔者的著作,算是夹带一点私货,同时也避免了使用素材时的版权隐患。

尽管相信没有人会误解,但笔者最后还是多强调一句,Oracle、Microsoft、Pivotal等公司设计“宠物店”的目的绝不是为了日后能在网上贩卖“宠物”,而是纯粹为了演示技术。所以也请勿以“实现这种学生毕业设计复杂度的需求,引入如此规模的架构或框架,纯属大炮打苍蝇,肯定是过度设计”的眼光来看待接下来的“Fenix’s Bookstore”项目。相反,如果可能的话,笔者会在有新的技术、框架发布时,持续更新,以恰当的形式添加到项目的不同版本中,其技术栈可能越来越复杂。笔者希望把这些新的、不断发展的知识,融入已有的知识框架之中,便于自己学习、理解、思考,同时能将这些技术连同自己的观点和看法分享给更多感兴趣的人。

也算是缘分,网名“IcyFenix”是二十多年前笔者从中学时代开始使用的,它源自暴雪公司的即时战略游戏《星际争霸》的Protoss英雄Fenix。如名字预示的那样,他曾经是Zealot,牺牲后以Dragoon的形式重生,带领Protoss与刀锋女王Kerrigan继续抗争。尽管中学时期我已经笃定自己未来肯定会从事信息技术相关的工作,但显然不可能预计到二十年后我会写下这些文字。

所以,既然我们要开始一段关于“Phoenix”的代码与故事,那便叫它“凤凰架构”,如何?

主要内容

这是一本从架构视角讲解如何构建大型分布式系统的著作,是超级畅销书《深入理解Java虚拟机》的作者周志明多年架构和研发经验的总结,得到了多位行业资深架构专家的联袂推荐。全书共16章,分为演进中的架构、架构师的视角、分布式的基石、不可变基础设施和技术方法论五部分。

第一部分 演进中的架构(第1章)

着重介绍了软件开发历史中多种主流架构风格出现的契机、解决的问题以及带来的新缺陷。

第二部分 架构师的视角(第2~5章)

总结了一名架构师应该在架构设计时思考哪些问题,有哪些主流的解决方案和行业标准做法,各种方案有什么优缺点,不同的解决方法会带来什么不同的影响,等等。

第三部分 分布式的基石(第6~10章)

重点讨论了“不同架构风格是应该在技术规范上统一,还是由应用系统自行解决”这个问题,给出了解决思路、方法和常见工具。

第四部分 不可变基础设施(第11~15章)

重点讲解了基础设施不变性的目的、原理与实现途径,包括虚拟化容器、容器间网络、持久化存储、资源与调度、服务网格等内容。

第五部分 技术方法论(第16章)

面向技术决策者集中讨论了与分布式、微服务、架构等相关的理论话题,将解决问题的能力归纳、总结、升华为方法论。

全书以实践为导向,一个案例贯穿全书,同时给出了基于Spring Boot、Spring Cloud、Kubernetes、Istio、AWS Lambda 五种架构风格的样例工程。


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 7月书讯(下)| 读书开启下半年

书讯 | 7月书讯(上)| 读书开启下半年

资讯 | 《数据安全法》表决通过!最新解读来了

书单 | 8本书助你零基础转行数据分析岗

干货 | 当机器学习遇上隐私保护,聊聊联邦学习和分布式机器学习

收藏 | 终于有人把卷积神经网络(CNN)讲明白了

上新 | 【新书速递】打通数据科学三要素——数据科学实战性手册

点击阅读全文购买

相关文章:

  • 【第62期】学会数据分析,抢占职场风口机遇
  • 腾讯数据科学家详解用户选择行为分析核心模型
  • 【新书速递】人人可懂的深度学习
  • 开发人工智能为什么要用Python?
  • 【新书速递】首本零代码书籍问世
  • MySQL 十大常用字符串函数
  • 手把手教你用Python求最大值和最小值
  • TIOBE 7 月编程语言排行榜:C、Java 和 Python 争夺第一
  • 【新书速递】嵌入式Linux驱动领域开发的实战指南
  • 2021半年盘点,这些经典更新了!
  • ​2021半年盘点,不想你错过的重磅新书
  • 【第63期】机器人时代已来!推荐几本机器人学硬核好书
  • Netflix正在搞的混沌工程到底是什么?终于有人讲明白了
  • 一文了解滴滴与蚂蚁金服开源共建的SQLFlow
  • 详解数据资产的8大重要特征
  • 【刷算法】从上往下打印二叉树
  • Java IO学习笔记一
  • Map集合、散列表、红黑树介绍
  • python大佬养成计划----difflib模块
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vultr 教程目录
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 官方解决所有 npm 全局安装权限问题
  • 配置 PM2 实现代码自动发布
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 一份游戏开发学习路线
  • 阿里云移动端播放器高级功能介绍
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • # Panda3d 碰撞检测系统介绍
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (libusb) usb口自动刷新
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (九十四)函数和二维数组
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (十八)三元表达式和列表解析
  • (十六)串口UART
  • (算法)N皇后问题
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)VC++中ondraw在什么时候调用的
  • (转)用.Net的File控件上传文件的解决方案
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net 流——流的类型体系简单介绍
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .net中的Queue和Stack
  • @ComponentScan比较
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网