前言
大家都知道,分布式系统提高了我们计算系统的计算能力,让更多的不可能变为了可能。但是它是如何做到这些,以及我们为什么要设计分布式系统,分布式系统的核心是什么,这些问题并不是很好的被大家所认知,所以本系列文章尝试用通俗易懂的语言,给想要了解分布式系统的各位一个简单明了的介绍。
开篇-为什么
计算机帮助人类完成计算任务,大都是一系列重复的、计算量大的任务。而早期计算机刚出现时,计算能力非常有限,导致人们也不得不选取一些比较简单的计算任务让计算机完成。随着时间的推移,计算机硬件的迭代更新速度发展非常迅猛,使得计算机可以完成更多的计算任务,尤其是当互联网的出现,让人们对计算机应用的需求急剧增加。
这个时候我们可以分析一下,计算机本质就是通过CPU和内存协调,快速运算完成指定的计算任务。当计算任务变大以后(大并发场景的出现),我们可以提高CPU和内存来应对。因此,我们出现了大型机,来保障在互联网时期的应用需求。但是大型机的成本很高,而且经过长时间的分析,每个互联网应用,并不是所有的功能都需要这么多资源来应对大并发,甚至有的功能上线后就没什么人用。这个时候为了应对不同功能的并发需求,我们就需要拆分应用了,我们得把一个完整的应用拆分成很多个服务,并且每个服务都是一个独立的应用。这样就可以给核心服务分配更多的资源以应对更大的并发,而非核心模块就可以适当的”冷藏“起来。
所以分布式系统就出现了,包括但不限于分布式服务,分布式数据库等等。总而言之,分布式系统本质是由一群相互协作的服务,为了解决一个共同问题而组成的系统,以至于对外部而言,分布式系统看上去就是一个单一的系统。(我们需要区分集群和分布式系统的概念,集群表示相同的应用复制多个,每个都做着同样的事情;分布式系统而是由一系列的不同的服务组成,每个服务做的事情是不一样的,并且只有组合后才是一个完整的系统)
初识分布式系统
分布式系统的表现形式是非常多样化的,可能很多同学已经做分布式系统应用很久了,但是参考大厂的模式又感觉自己不是做的分布式系统应用,所以这里,我们需要从不同的维度来描述分布式系统的表示形式,以便帮助我们更加了解分布式系统。
分布式系统的应用/组织形式:
-
分布式计算:分布式计算的应用,在大数据、机器学习、深度学习的领域应用是非常广泛的,尤其是在学习MapReduce的时候,第一个WordCount的示例就是一个典型的分布式计算应用。(WordCount就是计算文本中单词出现的次数,但是当文本数据太大时,单机无法承受时,就需要分散到多个机器中分别计算部分数据,最后在汇总)
-
分布式存储:分布式存储的应用,平时我们应该是接触的最多,比如数据库的主从架构,主节点负责写任务,从节点负责读任务,当主节点挂了后,从节点可以自动升级为主节点,保证数据库系统的可靠性
-
分布式缓存:分布式缓存的应用于分布式存储类似,只是数据都是存在所有机器的内存中的,可以参考Redis的集群模式
-
分布式服务/SOA/微服务/服务网格:分布式服务这类是我们平时接触的最多的,也是互联网公司应用最广的方式。我们可以分SOA、微服务、服务网格分别讨论:(如何拆分服务、划分服务边界、确定服务间界限上下文可以参考DDD的战略设计部分)
-
SOA(面向服务的架构):将应用拆分成不同的服务,服务之间通过消息中间件通信,常用的消息中间件有如Kafka、RabbitMQ,RocketMQ,ActiveMQ等等
-
Micro Service(微服务):将应用拆分成不同的服务,每个服务都是完全独立的,独立的团队维护,独立的业务需求,独立部署上线,与SOA最大的区别就是服务之间不依赖消息中间件通信,而是通过HTTP,或者RPC的方式通信,消除了SOA中的中心化问题
-
Service Mesh(服务网格):服务网格是微服务的一种进化,当微服务发展足够多时,服务之间的通信是非常复杂的,而且通信链路很难追踪,服务之间的认证授权也很麻烦,服务网格则通过将服务的通信模块通过代理的方式,下沉到sidecar中,这样服务实现者本身就可以更好的关注服务的业务需求,可以参考Isito的解决方案
-
分布式锁:保证多个服务之间交互的有序性,原理跟本地锁类似,都通获取全局变量获得锁,才可以继续操作,否则就必须等待锁,操作完成后就释放锁,让其他服务获取锁并继续其他操作,可以参考Redis的分布式锁实现思路
分布式系统的通信方式:
-
进程间通信:操作系统进程之间的通信、Socket通信等等
-
客户端-服务端通信:HTTP协议通信,RPC、RMI通信等等,微服务常用通信模式
-
间接通信:发布-订阅通信模式、消息队列通信模式等等,SOA常用通信模式
分布式系统的分层架构:
-
垂直分层:将应用垂直划分为应用层、中间件层、基础系统层。应用层主要处理业务需求;中间件层处理应用层产生的公共问题,比如消息中间件解决应用层服务之间的通信问题;基础系统层则是处理底层操作系统等基础软件问题
-
水平分层:在垂直分层的基础上,针对划分出来每层进一步进行水平划分,例如可以将应用层进一步划分为UI层,BFF层,领域层,数据层等等。将中间件层划分为消息中间件、通用域等等
结语
到目前为止,我们知道了,设计分布式系统就是为了应对大并发的场景,并且还可以通过给不同的服务协调不同的资源,以最小硬件资源抗住最大的计算任务(大并发)。同时,我们还了解分布式系统的架构、组织形式以及常用的通信模式,这些内容只是分布式系统相关的概念介绍,让大家能够了解分布式系统这个概念,接下来,我们将会进一步深入到分布式系统的一些理论、算法和实践中,希望能够帮助大家由浅入深的掌握分布式系统的相关知识。
欢迎大家在评论区讨论各种分布式系统相关的内容。