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

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

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

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

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

超级畅销书《深入理解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)讲明白了

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

点击阅读全文购买

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

  1. 周志明论架构之道:从SOA时代到微服务时代

    SOA 架构(Service-Oriented Architecture) 面向服务的架构是一次具体地.系统性地成功解决分布式服务主要问题的架构模式. 为了对大型的单体系统进行拆分,让每一个子系统都能 ...

  2. 2.凤凰架构:构建可靠的大型分布式系统 --- 访问远程服务

    第2章 访问远程服务远程服务将计算机的工作范围从单机扩展至网络,从本地延伸至远程,是构建分布式系统的首要基础.2.1 远程服务调用2.1.1 进程间通信举例,一个正常的本地调用需要完成以下几个工作:1 ...

  3. 5.凤凰架构:构建可靠的大型分布式系统 --- 架构安全性

    第5章 架构安全性计算机系统的安全,不仅仅是指"防御系统被黑客攻击"这样狭义的安全,还至少应包括以下问题的具体解决方案:1.认证(Authentication)系统如何正确分辨操作 ...

  4. 8.凤凰架构:构建可靠的大型分布式系统 --- 流量治理

    第8章 流量治理容错性设计是微服务的另一个核心原则.随着拆分出的服务越来越多,随之而来会面临以下2个问题:1.由于某一个服务崩溃,导致所有用到这个服务的其他服务都无法正常工作,一个点的错误经过层层传递 ...

  5. 豆瓣9.8分,周志明的《凤凰架构》,高屋建瓴,推荐(送书)

    导读:周志明老师的<深入理解Java虚拟机>想必大家都不陌生,这本书凭借着生动易懂的文风.系统实用的知识点.成为原创计算机图书经典中的经典.周老师凭借一己之力拉高了 Java 开发者内功水 ...

  6. 【第64期】豆瓣9.8分,周志明的《凤凰架构》

    导读:周志明老师的<深入理解Java虚拟机>想必大家都不陌生,这本书凭借着生动易懂的文风.系统实用的知识点.成为原创计算机图书经典中的经典.周老师凭借一己之力拉高了 Java 开发者内功水 ...

  7. 【读书笔记《凤凰架构》- 构架可靠的大型分布式系统.周志明】(一)

    1. 前言 整部书分为5部分,除了第一章讲分布式架构的历史,其他四章都偏技术. 书本的作者提也到,再看书前最好先理解本书的排版的逻辑(尽管每一章都被设计为可以单独阅读) 但除第1部分, 剩下的4个部分 ...

  8. 《周志明的软件架构课》学习笔记 Day1

    1.主动学习 每个开发者都需要学习「如何构建一个可靠的分布式系统」 工作这么多年,发现架构设计,还是需要从业务中来迭代,「作为一名架构师,在软件研发的过程中,最难的事儿,其实并不是如何解决具体某个缺陷 ...

  9. 周志明:深入java虚拟机_虚拟面板:在低延迟环境中使用Java

    周志明:深入java虚拟机 Java越来越多地用于低延迟工作,而以前的C和C ++早已成为Java的实际选择. InfoQ聚集了该领域的四位专家,讨论了驱动趋势的因素以及在这种情况下使用Java的一些 ...

最新文章

  1. thinkphp5框架一小时搭建一个php后端(1)
  2. 我被裁员了!让保安把身患绝症的我被强赶出公司,亲身经历的噩梦!
  3. 一天搞定CSS:背景background--03
  4. 1128:图像模糊处理
  5. JUC包中的分而治之策略-为提高性能而生 1
  6. 一步步创建第一个Docker App —— 4. 部署应用
  7. 爱奇艺纪录片《棒!少年》《从长安到罗马》入选广电总局“2020年优秀国产纪录片集锦”...
  8. STM8学习笔记---IAR工程重命名
  9. 一、虚拟机,CentOS安装教程,Linux文件系统结构,Linux文件命名规则
  10. 高德地图POI数据爬取
  11. 如何安装最新版质性分析软件NVIVO?
  12. 中望cad自定义快捷键命令_cad中望_中望cad常用快捷键及命令
  13. java云之家发送信息_开发文档:考勤信息api - 云之家·开放平台
  14. TrueCrypt 使用经验[2]:关于加密
  15. [《回家寄事》闲笔记事集]2010年1月18日
  16. 《铁血残明》的经典章节“猛虎桥”配图及动漫技术讨论
  17. 浅谈对Vue框架中MVVM的认识
  18. kotlin Anko的实际用法
  19. INS防封号技巧,这些注意事项如果你不知道容易被封号停用
  20. php生成云图,教程:用Python生成词云图

热门文章

  1. 统计学——线性回归公式推导
  2. c语言中以w方式进行文件操作时,文件操作
  3. 家长会计算机教师致辞,初中生物教师家长会发言稿
  4. 手机wps云文档无法连接服务器,手机wps云文档怎么用
  5. 【JAVADS ——排序】
  6. MATLAB台大郭彦甫老师课程笔记:第一课:基本操作与矩阵输入
  7. python编写古诗_用Python实现古诗词填字游戏(一)
  8. Linux服务器中Tomcat在执行./Shutdown.sh的时候报错
  9. 【UE4】TimeLine(蓝图)
  10. Android studio更改图片背景闪退问题