分布式应用系统架构设计与实践

978-7-115-57230-1
作者: 谢文辉
译者:
编辑: 刘雅思

图书目录:

详情

随着互联网技术的发展,分布式应用系统对具备高性能、高可用性、可扩展性和可维护性的架构的依赖度越来越高。本书以理论与实践相结合的方式,对分布式应用系统的架构设计进行系统、全面的阐述。本书分为3个部分,第一部分是分布式系统架构概述,介绍一些分布式系统架构下常见的基础概念和架构设计的目标;第二部分是核心理论及技术,介绍分布式应用系统下常见的技术中间件机制和使用场景,着重介绍分布式应用系统在高性能、高可用性、可扩展性和可维护性等方面常见的优化技术;第三部分是架构实践案例,梳理几种常见的大型分布式应用系统的架构,并结合具体问题进行分析,使读者能够真正理解设计分布式应用系统架构所面临的问题及解决问题的思路。 本书主要面向初/中/高级程序员和架构师,但书中的部分内容也适合产品经理、项目经理阅读。此外,本书内容由浅入深且案例丰富,也适合作为培训教材。

图书摘要

版权信息

书名:分布式应用系统架构设计与实践

ISBN:978-7-115-57230-1

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


著    谢文辉

责任编辑 刘雅思

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


随着互联网技术的发展,分布式应用系统对具备高性能、高可用性、可扩展性和可维护性的架构的依赖度越来越高。本书以理论与实践相结合的方式,对分布式应用系统的架构设计进行系统、全面的阐述。本书分为3个部分,第一部分是分布式系统架构概述,介绍一些分布式系统架构下常见的基础概念和架构设计的目标;第二部分是核心理论及技术,介绍分布式应用系统下常见的技术中间件机制和使用场景,着重介绍分布式应用系统在高性能、高可用性、可扩展性和可维护性等方面常见的优化技术;第三部分是架构实践案例,梳理几种常见的大型分布式应用系统的架构,并结合具体问题进行分析,使读者能够真正理解设计分布式应用系统架构所面临的问题及解决问题的思路。

本书主要面向初/中/高级程序员和架构师,但书中的部分内容也适合产品经理、项目经理阅读。此外,本书内容由浅入深且案例丰富,也适合作为培训教材。


我在2010年进入互联网开发领域,当时公司的项目正处于向互联网转型的阶段,系统迭代开发完成后要考虑上线、发公告、停服务、代码手动更新、单台发布验证,以及所有服务器验证等步骤。在此期间,只要遇到问题,就要手动回滚,每次发布都要忙到凌晨。因此,我对这一经历记忆犹新。

随着项目和工作进入不同的阶段,我才慢慢了解了整个基于DevOps的快速、高效的发布流程。除此之外,我还有幸接触了更多互联网架构设计的整体流程。在此期间,我参与了一些日均活跃用户数达千万级的应用系统的架构改造和双活多机房的完整解决方案的设计,我还从无到有主导了一个多机房构建过程。虽然我在工作中遇到过无数的问题,但我认为这也是我作为技术人员的一种幸运。后来我开始考虑是否可以把以往的项目经验积累下来,分享给更多可能遇到同样问题的人,让更多的人少走弯路,同时也作为对自己的一种鞭策,让自己做更多有效的沉淀。因此,我在一些主流的技术博客和公众号上定期做技术分享,经过一段时间的分享,一次机缘巧合让我直接改变了做技术分享的路径,转而决定把自己的知识积累写成书,以期影响和帮助更多的人。整个写作过程并不如我预想的那样顺利,尽管之前我也写过一些文档和专题,但是写书毕竟是第一次,我的内心还是非常忐忑的。所幸经过不断坚持,我慢慢地厘清了思路,使本书的写作最终得以完成。

本书从介绍分布式系统架构的基础概念开始,进而介绍分布式系统架构的核心理论和常见优化技术,最后通过分析我接触过的一些项目以及遇到的常见问题来分享有效的解决方案。

下面我简要介绍一下每章的核心内容。

本书能够顺利出版,首先要感谢人民邮电出版社杨海玲编辑的大力支持,在我整个写作过程中,她投入了大量的时间和精力。另外,我还要特别感谢我的父母和妻子,在过去的一年中,他们对我无微不至的关心和对家庭事务的处理,让我有空余时间完成本书的写作。最后,我要将此书献给我即将出生的二宝以及马上要上一年级的大宝,希望他们未来能够永远怀着孩子的好奇心来看待和探索这个世界。

由于我的水平有限,书中难免会有疏漏,读者在阅读过程中若发现不足之处,敬请指正,我的联系方式如下:

微信:13631287740

邮箱:flykingmz@gmail.com

公众号:互联网架构师之路(微信号:hlw_architector)

谢文辉

2021年5月


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误信息进行审核,确认并接受您的建议后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书技术审校等工作,可以发邮件给本书的责任编辑(liuyasi@ptpress.com.cn)。

如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端和网络技术等。

异步社区

微信服务号


布式系统的运用非常广泛,它的标准定义是:由一组通过网络进行通信,为了共同完成任务而协作的计算机节点组成的系统。因为分布式系统的关键在于多节点和协作共同完成任务,所以分布式系统的出现就是为了解决资源(如计算、存储等)紧缺的问题,也就是说,利用更多的资源处理更多的任务。

分布式系统包含分布式应用系统和分布式中间件系统。分布式应用系统主要指基于分布式设计的业务系统,如秒杀系统就是一个典型的分布式应用系统。而分布式中间件系统主要指基于分布式设计的消息系统、缓存系统、存储系统等。这一部分将介绍分布式系统的一些基础知识,包括分布式系统架构涉及的基础概念和架构设计需要达到的目标,并详细介绍分布式系统架构的演进过程。


到底什么是架构?对于这个概念,不同人可能有不同的定义,甚至存在一些争议。我们先来看一下一些标准机构对这个概念的定义。

看了以上对架构的定义之后,读者有什么感觉?是不是感觉过于抽象?那么,如何用一种更直观的方式来阐述架构呢?首先,我们用架构的几个概念来明确一下它的界限和范围。

架构的所有概念都是在系统设计过程中不断抽象和衍生出来的,因此,在介绍架构的几个概念之前,需要再花一点儿时间介绍一下架构的产生过程。下面以一个电商购物系统的架构优化为例来进行阐述。

最开始的时候系统还没有构建起来,也基本没有用户,此时系统以提供基本使用功能为主,例如,业务逻辑处理和数据存储都部署在一台服务器上,用户请求的处理和数据存储全部在这台服务器上完成。

随着业务的发展,产品经理规划了更多的功能模块,此时如果依然使用一台服务器来完成业务逻辑处理和数据存储,那么系统的处理能力就会受到限制,需要考虑将业务逻辑处理和数据存储进行分离,即业务逻辑处理单独使用业务逻辑服务器,数据存储单独用另外的服务器。因为业务逻辑处理和数据存储分离了,所以它们之间就多了一些额外的数据传输,而数据传输就是为了连接业务逻辑处理和数据存储这两个模块。

再往下发展,由于产品功能受到特定用户群体的认可,因此用户数量开始增加,这导致单台业务逻辑服务器处理不过来,此时系统就需要再引入反向代理服务器,以使后端的业务逻辑服务器可以更方便地扩展,从而提升后端业务逻辑服务器的处理能力。同时,用户规模的扩大会使数据存储的存取性能受到挑战,此时就需要对数据存储进行读写分离,以独立的读服务器和写服务器来提升系统的数据存储性能。

由于产品受到了特定用户群体的喜爱,因此产品经理就依据用户反馈规划出更多的产品功能,如商品导航、活动、积分等一系列的功能,以提高用户黏性和促进业务增长。此时,为了避免不同模块之间的访问干扰,不同的业务逻辑服务就需要拆分,同时数据也需要基于不同的业务类型进行拆分存储。

随着活动、积分等运营业务的发布,用户产生了裂变,这时用户的并发访问量不断上升,单独的数据存储服务已经无法满足用户体验的要求,就需要考虑引入缓存、流量分发和负载均衡等可以有效提升系统性能的组件。

上述过程大概描述了优化一个系统架构的几个阶段。那么,架构的设计优化需要满足什么条件呢?

(1)业务对于系统有更高的要求。

(2)模块的处理能力有限,需要有效地将系统进行切分。

(3)系统切分后,需要引入协调调度机制,以提升模块的协作性能。

第一点,伴随业务的不断发展、业务功能的多样化、用户规模的不断扩大,业务对系统提出了更高的要求,例如系统的性能、可用性、可扩展性以及可维护性,这是架构产生的一个先决条件。也就是说,产生架构的第一要素是现在或者未来可见的业务对系统有更高的要求,架构不是一种空想的设计。

第二点,模块的处理能力有限,需要有效地对系统进行切分。由于业务对系统的要求提升,而单独一个模块的处理能力又有限,因此就需要对系统进行更多的切分。例如,单台服务器的处理能力有限,就需要将业务逻辑处理和数据存储分离。单台数据存储服务器的处理能力有限,就需要对数据存储进行读写分离。

第三点,系统切分后,需要引入协调调度机制,以提升模块的协作性能。例如,为了提升业务逻辑处理能力,需要引入反向代理服务器。

总结来说,架构是一个系统的优化过程,而分布式系统的架构则是为了实现系统的高性能、高可用、可扩展、可维护等目标所做的一系列优化过程。

这里仍然以上面的电商购物系统来阐述。

一个完整的电商购物系统包括用户注册/登录系统、用户成长系统、评价系统、购买系统等。因此,可以这样来定义,电商购物系统是一个整体的系统,而用户注册/登录系统等就属于电商购物系统的子系统。从用户视角出发,子系统可以看作独立闭环的一个功能。

模块和组件是进入系统以后区分出来的概念。例如,电商购物系统里的购买功能可以区分出支付、导航、下单等功能,这些功能可以定义为模块,而模块之间需要的数据分发和数据存储服务(如 Kafka、Redis)可以看作不同的组件。因此,概括起来说,模块是进入系统后从业务层面来划分的概念,而组件是从技术层面来划分的概念。

组件在上面已经阐述了,那么框架又是什么呢?框架是对实现某个技术组件服务规范的一种定义。例如,Web系统的MVC规范可以认为是一套框架定义,消息队列的数据传输规范也可以认为是一套框架定义。而组件可以认为是对框架的一种具体实现,例如Kafka是实现消息队列框架的一个组件。

要衡量一个架构设计的优劣程度,就需要一些指标,如系统的性能、可用性、可扩展性以及可维护性。

下面就针对这些指标,详细阐述架构设计要达到的具体目标。

在架构设计的过程中,性能往往是非常重要的,它可以有效提升用户的操作体验,有助于实现对服务资源的高效利用。图1-1展示的是一种常见的高性能架构。

图1-1 高性能架构

当然,不是每个系统都具有这样的架构,具体细节可能会有不同,但高性能架构一般都有如图1-1中所示的几个特点。

常见的高性能架构一般采用Nginx作为接入网关,并且水平扩展,通过Nginx连接更多的接入服务,以使系统实现水平扩展。一般来说,接入服务可以划分为3种模式。

逻辑服务访问数据存储,实现对数据存储介质中数据的访问操作。如果并发访问请求量过大时仍采取直接访问数据存储介质的话,会导致数据处理瓶颈。为了解决数据处理瓶颈问题,一般有以下两种方案。

可用性关注的是服务在出现故障之后是否可以快速、高效地恢复。常见的系统单点故障问题就是可用性的典型示例。

图1-2展示的是一个典型的高可用架构(以两个机房为例)。

图1-2 高可用架构

从图1-2可以看出,要实现高可用性(high availability,HA),就需要在以下各层设置服务冗余或者业务故障自动发现机制。

可扩展性关注的是系统依据访问请求的大小可以实现资源的自动扩容。例如,电商在做一些活动时请求量会很大,此时就需要实现资源的扩容,而活动结束后又需要考虑释放多余的资源。这些操作都需要方便快捷地完成,这就要求系统在设计架构的时候重点考虑可扩展性。

图1-3展示的是一个常见的可扩展架构。

图1-3 可扩展架构

服务接入网关会将请求分发到后端接入,服务接入网关一般采取Linux虚拟服务器(Linux virtual server,LVS)和Nginx的配合来实现。由于系统需要可扩展,那么对于任何服务器的上线和下线,系统的处理状态应该是一致的,因此这里需要实现接入层处理的无状态化。无状态化指的是任何一台业务逻辑服务器在任何时候处理的逻辑都是保持一致的,不需要为不同用户存储特殊的状态信息。例如,对用户访问的会话(session)信息进行分布式存储,而不是每台服务器自行存储,有状态的信息就得到统一处理,而业务逻辑服务器只需实现业务功能。因此,任何一台服务器的上下线都不会影响系统的处理。

接入层实现可扩展之后就到了服务层。服务层中有所有的业务逻辑处理过程,要实现可扩展需要引入服务发现组件,这一点和在1.2.2节中讲到的高可用性是一致的,这里不赘述。

最后,数据存储要实现可扩展,一般采取数据路由存储,例如基于哈希的分片映射、基于数据范围的分区映射等都属于数据路由分发策略。这样,即使有较大的数据量,也可以实现数据的有效扩容。但是,这里还需要额外注意数据重新路由的迁移效率问题,例如用户A的数据经过分片到达了数据存储1,但是在扩容后数据路由存储到数据存储N,这时就需要考虑如何快速将用户A的数据迁移到数据存储N的问题,在这里先不进行详细阐述,第6章中会详细介绍。

可维护性主要是指系统的监控、故障修复、线上运维的便利性以及问题发现的及时性等。一个系统上线之后,会由于各种原因出现线上故障,这就需要快速定位故障的位置以及找出出现故障的原因,以便快速修复故障,而对于一些不适于人工介入的情况还需要做到系统的自我修复。这时就需要对系统的可维护性进行综合考量。

图1-4展示的是一个常见的可维护架构。

图1-4 可维护架构

首先需要对所有业务系统进行系统运行状态和日志的采集(即数据采集),再通过流式处理组件(如Kafka或者Flink)进行数据处理和传输,对采集到的所有数据可以分类处理,例如数据调用及追踪、日志挖掘及分析、接口及组件的监控分析,最后把获取并分析后的数据进行可视化并展示出来,同时如果出现异常可自定义实现告警或者故障切换等操作。数据存储用来保存所有运维监控状态的原始采集数据以及分析的结果数据。这样,一个具备基本功能的可维护系统就建立起来了。

本章主要介绍了架构的基础概念,先从架构的产生原因着手,然后引入了架构中的几个常见概念,最后对架构设计要达到的几个核心目标进行了阐述,并介绍了可实现这些目标的常见方案。本章的目标是让读者对系统架构有基本的认识,后续章节将会对几个设计的核心目标的具体实现方案进行详细的分析和说明。


相关图书

云原生测试实战
云原生测试实战
Kubernetes快速入门(第2版)
Kubernetes快速入门(第2版)
Kubernetes零基础实战
Kubernetes零基础实战
深入浅出Windows API程序设计:核心编程篇
深入浅出Windows API程序设计:核心编程篇
深入浅出Windows API程序设计:编程基础篇
深入浅出Windows API程序设计:编程基础篇
云原生技术中台:从分布式到云平台设计
云原生技术中台:从分布式到云平台设计

相关文章

相关课程