前言
前不久在和一个朋友聊天,引出了一个话题「什么是分布式?」想来大家对「分布式」可能会有一些的疑惑,本文尽可能以一种通俗的方式尝试解答:什么是分布式?
实例引入
(1)LNMP这个架构是分布式吗?答案:是
如下图

这个是传统的Lnmp架构(暂不考虑php-fpm中是否有RPC),先把一次请求横向做了切分,先给了Nginx,然后转发到php-fpm,最后调用MySQL,然后在回溯到Nginx。我们可以把每一步做成多台机器提供服务,Nginx可以部署多台,php-fpm也可以部署多台,同样MySQL也一样,这样一来每个服务都以集群的形式提供服务了。 如果有疑惑可以看一下《后端进阶:分布式和集群的1分钟教程》。剖开来看,Nginx负责接收http请求头和发送http响应结果,php-fpm负责处理业务逻辑,MySQL负责数据存储。再进一步分析,上述跨进程调用的本质就是进程间的通信, Nginx进程调用php-fpm进程,php-fpm进程调用MySQL服务进程。说到这读者是不是若有所思了呢?别急着回答咱们开篇的问题。再来看另外一个实例。
注:进程间的通信方式有哪些呢?常见的有TCP、Unix Socket文件,当然也有管道、信号量、消息队列。
(2)以下所描述的架构是不是分布式呢?
有一个服务,刚开始把所有的业务逻辑写在一起,在同一进程里面进行处理,如下图

一次请求,依次调用了A函数、B函数、C函数三个函数,那么我们为了避免业务臃肿,对业务做了拆分,把B函数、C函数单独作为一个服务。如下图:

这种升级之后的架构是分布式吗?答案:是。
我们尝试分析一下,架构升级之前处理请求的时候,是在同一个进程里处理的,现在我们把B、C函数拆分出去之后,调用就变成了RPC,这个时候原本单进程的服务,就变成了多进程。也就是说,原本的服务进程,要和B、C服务进程进行通信。更进一步说,原本的单进程服务,我们转化成了基于网络的多进程服务。
读到这里,是不是明白了分布式的本质了呢?
总结
分布式是什么?分布式是基于网络建立的软件服务系统。
既然通过网络建立起来的,那么进程间的通信是不是一定就需要用到网络呢?答案:不一定。上文说道,进程之间通信的时候,其中有一种方式是Unix socket,这种是基于sock文件进行通信的(本质是通过共享文件数据进行通信的),不需要通过网络,但是要求进行通信的进程要在同一个主机上。
写在最后
判断是不是分布式有一个简单的方法,判断服务是否有进程间的RPC?有,就是分布式。没有就不是。(或者判断是否有多个不同的进程参与提供服务,是,则是分布式;不是,则不是分布式。)
真好看👇~