分布式系统的本质是什么
在众多计算机技术当中,分布式技术无疑是最璀璨的明珠之一。
在分布式系统出现之前,机构会尽其所能购买最大的单个大型机,因为在当时的定律是:计算机性能随着成本的平方而增加。
后来摩尔定律指出:集中式系统的运算能力每隔一段时间才能提升一倍。至于这里的一段时间究竟是18个月还是2年倒不用过于纠结,因为这意味着:如果系统在这段时间对所承载数据计算力的增长速度比不过计算机性能提升的速度,那么在未来的某一个时间点,集中式系统将无法承载所需的计算量。
同时在经济因素的影响下,人们发现用廉价机器的集合组成的分布式系统,除了可以获得超过 CPU 发展速度的性能外,花费更低,具有更好的性价比。
分布式系统的价值,是建立在分布式系统的"分治"和"冗余"之上的。
有的定义说:分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。
学习过软件架构的话,可能我们还听说过 SOA、ESB、微服务这些名词,分布式系统等价于这些吗?
所谓"分治",就是 分解 -> 治理 -> 归并,把问题拆解为独立的小问题,只要解决了这些小问题,问题也就解决了。但是不同分支上的子问题,不能相互依赖,需要各自独立 。因为一旦包含了依赖关系,子问题和父问题之间就失去了可以被"归并"的意义。在软件开发领域,对应的概念称为"耦合度"和"内聚度"。
SOA、ESB、微服务是服务化的模式,服务化就像企业当中将相同岗位的人员划分到同一个部门管理,以此来收敛特定的工作入口,再进行二次分配,以提高人员利用率和劳动成果的复用度。服务化的本质就是"分治"。这时,高内聚、低耦合的思想在拆分过程中起到了一个非常重要的作用,因为这可以尽可能地降低拆分后不同组件间进行协作的复杂度。所以重要的是"怎么拆",还有如何循序渐进地拆,而这个过程中你究竟是采用了何种服务化模式(比如 SOA、ESB、微服务等)并不是关键。
拆分为如下的工作模式就是高内聚、低耦合的,因为一个服务只与另一个服务产生了关联,并且仅有一次。
java
serviceA ---> ServiceB ---> ServiceC
服务化体现了"分治"的效果,这也是分布式系统的核心思想,因此从"分治"这个本质上来看,服务化的确是分布式系统,但分布式系统不仅仅停留在那些服务化的模式上。
在我们平时的编程中,会把相关的紧密相关的部分收敛到一个独立的逻辑体中,这个逻辑体可以是函数、类以及命名空间等等。所以,从这个角度来说"分治"的问题其实早就存在我们的工作中,就看我们是否有去关注它了。因此,这并不只是我们在进行服务化时才需要考虑的问题。
分治可以简化解题的难度,通过高内聚、低耦合的协作关系达到更好"性能与经济比",来承载更大的流量。
用了某某MQ、某某 RPC 框架就是分布式系统吗?
中间件的作用是什么?
中间件起到的是标准化的作用。中间件只是承载这些标准化想法的介质、工具,可以起到引导和约束的效果,以此起到大大降低系统复杂度和协作成本的作用,使开发者避免将精力过多地花费在某个子功能下众多差异不大的选项中。
所以,虽然分布式系统中会运用中间件,但分布式系统却不仅仅停留在用了什么中间件上。
那么,分布式系统到底是什么?
其实很多小项目同样可以理解为分布式系统,其中遇到的问题很多同样也存在于成熟的分布式系统中。
以常见的一个系统而言,需要配置数据库,使用 Redis 做缓存(即使不引入 Redis 下面的结论也成立)。
在关于如何保持 Redis 和数据库数据一致性上,要考虑多种情况,原因是什么?
因为 Redis 和数据库是不同的服务,由不同的进程运行。程序的本质是一套代码,而代码只是一段文字,除了提供文字所表述的信息之外,本身无法"动"起来,需要进程来执行文字表述的信息。
所以,小项目为什么也是分布式系统这个问题就很明白了。因为我们所编写的程序运行时所在的进程,和程序中使用到的数据库所在的进程,和中间件执行操作的进程,并不是同一个。也因此导致了,让这两个进程(系统)完成各自的部分,而后最终完成一件完整的事,变得不再像由单个个体独自完成这件事那么简单。
所以,我们可以这么理解,涉及多个进程协作才能提供一个完整功能的系统就是"分布式系统"。
分布式系统的冗余能带来什么价值?
"冗余"为系统带来了可以 7*24 小时不间断运作的希望。
我们可以将冗余的节点部署在一个独立的环境中。这个独立的环境,可能是处于同一个局域网内的不同主机,也可能是在不同的局域网,还可能是在不同的机房。当主体出现问题时,冗余节点可以迅速接替主体的工作,使系统不受影响。
这种单纯地为了备用而做的冗余,最大的弊端是,如果没有出现故障,那么冗余的这部分资源就白白浪费了,不能发挥任何作用。所以,我们才提出了诸如双主多活、读写分离之类的概念,以提高资源利用率。
不过也很显然,当故障影响范围大于冗余的容量时,系统依然会挂。所以,既然无法预知故障的发生情况,那么做冗余的时候需要平衡的另一端就是成本。相比更多的冗余,追求更好的性价比更合理一些。
小结
"横看成岭侧成峰,远近高低各不同"。分布式系统的本质就是多个进程协作共同提供完整功能的系统,其价值建立在"分治"和"冗余"上。
分治和冗余讲究的都是分散化,最终形成一个完整的系统还需要将它们"连接"起来。
天下没有免费的午餐,获得分布式系统价值的同时,这个"再连接"的过程就是我们相比集中式系统要做的额外工作。