这几天读《Java并发编程的艺术》,洗澡时突然对分布式有了更多的胡思乱想。

记忆

最早接触分布式是刚毕业工作时在公司的 Spring Cloud 项目上,作为一个负责拧螺丝的小喽啰,对于分布式的理解仅来源于 “我们要部署几个服务啊?” “今天 k8s 集群又遇到什么坑了吗” 等等一些大佬只言片语的交谈中。

从忙得喘不过气的工作中得到的碎片化信息里,我大致可以提炼出些许信息:分布式,技如其名,是将一个服务分成多个服务的技术;很多时候和“微服务”这个兄弟一起出现;Spring Cloud 是她的一个落地实现方案;特点是生命力强,挂几个服务没太大影响。

显然,这是个很启蒙式的认知,虽然大体上没差,但也仅是个很粗浅的认识。

合与分

分布式,核心思想是分,分而治之。

分与合,从古至今都是中华历史上的递归问题。《三国演义》正文第一句便是“话说天下大势,分久必合,合久必分。” 从历史上看,无论分或是合,最终结果都是增强了区域的治理能力与稳定性。中央政权衰落,无法继续治理国家时,往往会发展到割据政权,这便是分的哲学,例如春秋,三国;而当有一个强有力的中央政权时,由中央治理往往比分开治理要高效和统一,这便是合的哲学,例如秦朝,西汉。

发现了没有?这与当代的技术发展是高度相似的。现代网络服务为什么要分治,显然是单机服务的 IO 与算力有限,无法解决日益庞大的流量增加与计算需求,就是单机的“治理”能力跟不上了。想象一下,假如单机性能已经很够强了,吞吐量和数据处理能力都能达到EB级别,那么在现在的场景中,分布式显然不可能有这么大影响力,更何况分布式还有不少额外的调用开销,更重要的是还要向 CAP 问题妥协。

所以,没有所谓的哪种方式的服务就一定好,还是要结合现实意义来看。当然,“合”这种服务治理方式在如今的大规模场景下不太适用了,不是讨论的重点,重点还是“分”,即当下火热的分布式。尽管分布式应用也有着一些缺点,比如增加了服务间调用成本,存在 CAP 问题,管理起来更复杂等,但其仍是当下大规模服务场景中一个比较好的解决方案。

咋一听,分布式好像是个很高大上的东西,实际上也确实如此。她是以目前的科技水平来看,由小规模服务向大规模服务发展的必经之路。因为硬件水平的发展限制,人们更倾向于横向扩展技术,即,以机器数量增加,而非机器性能增强为前提开发新技术(当然研究如何提高机器的性能与榨干机器性能也在同步进行),这便是分布式产生的根本原因。

集群,微服务,分布式

这三个词同时曝光的概率非常高,而且这三个概念有一定的相似度。

个人理解:

集群是同一服务的多个实例,特征是 同一服务 & 多个实例。比如 mysql 集群,redis 集群,当然这个服务的概念是可以人为来划分的,比如可以将 mysql 和 redis 服务统称为数据库集群;

微服务是根据业务拆分得到的更小维度的服务,维度这个词可能不好理解,可以理解为粒度更细的业务逻辑,特征是根据业务拆分。 比如订单微服务,支付微服务;

分布式是一种可以将服务实例多点部署, 实例间存在通信的架构方式,特征是多点部署,实例间通信, 架构方式。比如xx网上商城的服务是分布式的。

因为集群和微服务通常是多实例多点部署且有服务间通信,所以习惯上也称她们为分布式应用,集群有人叫分布式集群,微服务也常叫分布式微服务(分布式有时成为了侧重表述多实例多点部署的一个定语),而且微服务一般也是以多个服务集群的方式部署的,所以三者互有关系。可以说,分布式涵盖了搭建集群与微服务的指导思想,集群与微服务是分布式应用的落地手段。

广义分布式

分布式是一种可以将服务实例多点部署的架构方式,这句话是基于个人工作中的应用场景理解得出的结论,也是比较表面的分布式解读方式。然而分布式本身的学术定义却远不止于此。看看百度百科给出的定义:

分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果。

可以看出此百科标题是分布式,内容却是分布式计算,他们将分布式解读为一种算法,其实也是对的。再进一步看,作者们对分布式的解读其实就是基于物理机的分治法了,与生产环境中的分布式应用契合,没毛病。

生活中的其它分布式

那么把分布式的精髓提炼一下,上面说了分布式也可定义为基于物理机的分治法,那么本质上还是分治思想,就是说分治是分布式的核心,所以稍微泛化一下,从分布式扩大到分治法,看看还有哪些地方用到了分布式或者分治思想。

  • 算法导论中的大整数乘法,递归分治法

  • 一个饭店对外提供服务,内部不是一个人在干活,而是厨师若干(厨师集群),服务员若干(服务员集群)和其它一些人在提供服务,这也可以理解为一种分布式(微)服务

  • 连锁商场在全国甚至世界都有开门店,这也是一种分布式服务,一家门店的服务是有限的,多家门店(多个服务),以公司或总部运营(可能存在中心化组件),提高了服务人数,也提高了容灾性(一家门店关了还有其它的)

  • 分布式云计算,当下热门的技术

  • 多核 CPU 中的数据处理方式,与分布式服务高度相似(这也是为什么我开头提到了《Java并发编程的艺术》)。

这里可以对比一下多核 CPU 的设计与分布式系统的设计了(仅与 Java 领域的分布式对比,其它的不了解),大有异曲同工之妙。

多核 CPU Java 分布式应用
任务可分配在某个核心上,由调度算法决定 请求可分配到某个服务上,由负载均衡决定
有个叫总线的东西 有个叫总线的东西
有多级缓存 通常都有多级缓存
多核心操作数据,要维护内存数据一致性 多服务操作数据,要维护 DB 数据一致性
核心之间相互独立 服务之间相互独立
核心之间可以通信 服务之间RPC通信
有总线锁与缓存锁(粒度不同) 有程序锁与 DB 锁(业务层不同)
有 LOCK# 指令 有 volatile

留心生活大小事,处处皆是分布式。