一、三个步骤完成华丽转身——任意软件变为“分布式”
分布式——一个高大上的名词,是计算机软件设计中人民群众喜闻乐见的“逼格满满”、“不明觉厉”的几个名词之一。但很可惜,这玩意儿一点也不复杂,甚至有些“简单”。不信?你只要遵循下述步骤即可将任何一个软件拆分为“分布式”的:
1. 将你的整个软件视为一个系统(不管它有多复杂)
2. 将整个系统分割为一系列的 Process(进程),每个 Process 完成一定的功能
3. 将这些 Process 分散到不同的机器上。分散后,选择若干种(没错一种可能不够)通信协议把他们连接起来
蹬蹬蹬蹬~大功告成。哈哈别打我,这真的是很严肃的通用型三步骤大杀器,对付任何软件,是任何软件都可以的。接下来我当然要解释清楚为什么。
二、跳出误区——分布式不等于并行计算
人们常常把分布式系统自然而然的和并行计算联系起来。然而这并不正确。实际上,分布式系统并不一定是并行的,举个简单的例子就能理解——
某软件,功能如下:
1. 提示用户输入两个数 A 和 B
2. 在内部,对 A 和 B 执行某数学运算,获得 C
3. 输出 C
很简单吧?这三个步骤是无法并行的。它们需要被依次执行。但是这个软件依然可以被改为分布式的,方法就是用前面提到的方法,把步骤 2 的计算过程独立为一个 Process 移动到另外一台计算机上完成。
如果我们从整个系统流程的观点来看,并没有什么并行。整个过程都是顺序执行的。只不过执行时出现了“跨设备”的现象而已。可见,分布式本身就只如其字面意思所指,指的仅仅是从结构角度的分散而已。
当然啊,现实世界中,我们更多的时候钟情于分布式,还是因为它与并行之间可以相互配合。例如实现既是分布同时也是并行的系统。
好了,理解这一点之后就不难解释为什么我会说前文提到的三步骤是万用大法了。接下来我们继续讨论分布式本身。
三、拆分+连接是分布式系统的本质
所谓分布式,无非就是”将一个系统拆分成多个子系统并散布到不同设备“的过程而已。
本质上而言,实现一个分布式系统,最核心的部分无非有两点:
1. 如何拆分——可以有很多方式,核心依据一是业务需求,二是成本限制。这是实践中构建分布式系统时最主要的设计依据。
2. 如何连接——光把系统拆开成 Process 还不够,关键是拆开后的 Process 之间还要能通信,因此涉及通信协议设计的问题,需要考虑的因素很多,好消息是这部分其实成熟方案很多
四、为什么你要使用分布式?
分布式系统并非灵丹妙药,解决问题的关键还是看你对问题本身的了解。通常我们需要使用分布式的常见理由是:
· 为了性能扩展——系统负载高,单台机器无法承载,希望通过使用多台机器来提高系统的负载能力
· 为了增强可靠性——软件不是完美的,网络不是完美的,甚至机器本身也不可能是完美的,随时可能会出错,为了避免故障,需要将业务分散开保留一定的冗余度
在以提供 Service 为主的服务端软件开发过程中常常遇到这些问题。
五、一些分布式方案能解决你的问题,另一些却不能,要学会的其实是选择
笼统的讨论分布式没有太大的意义,就如我刚才所谈的,实际上分布式很容易实现。真正难的地方在于如何选择正确的分布方案。
例如,当你想要建立一个分布式的数据管理系统的时候,你就必须得面对“一致性”问题。如果你对数据一致性要求很高,你就不得不容忍一些缺陷例如规模伸缩困难;而如果你放弃它,你可以轻松伸缩规模,但你必须解决好由此带来的一系列数据不一致导致的问题。(CAP 问题)
于是你会意识到,有许多种分布方案,为了正确解决你的问题,你需要对每一个方案都进行了解,并评估,选择不同的方案有时候区别不大,有时候却会深刻的影响整个系统中其他部分的工作方式,甚至影响用户界面中用户操作时的流程。这是我们学习分布式系统的重点所在。
六、分布式学习入门——基础知识要点
如我前面所讲,分布式入门不难。主要包含如下知识点:
· Process(进程)。在分布式系统中,进程是基本单元
· 通信协议。Process 间需要相互配合才能完成工作,因此通信协议是最基本要解决的问题。这部分其实挺复杂,牵涉面光,不过核心还是抓住两方面,一是存在哪些需求,二是各个协议如何满足这些需求
· 命名法。两个 Process 要通信,必须相互知道对方的名字,名字可以是数字,也可以是结构化的字符串。例如众所周知域名系统就是一种命名方案,但是方案还有很多,各有特点
· 协作。上面都在谈 Process 之间的通信,可是为什么要通信?因为要协作。协作是个复杂的主题,其中最基本最基本的一个问题就是同步问题。而聊同步问题必然要聊“锁”……知识点就这么展开了
上面几点是最基础的知识。了解了这些其实就算入门了。可是如何进阶呢?那么必然要开始学习下面的问题:
· 一致性。数据存储时,最基本的问题。其实也是实际设计系统时常常需要反复考虑的问题
· 容错。冗余是容错的基础,但并不是全部,分布式本身为实现容错提供了一些便利,这也是实际设计系统时常常需要考虑的问题
好了,如果这些你都学的差不多了,那咱们“纸上谈兵”也就告一段落了。接下来进入实战演练。
七、实战演练?其实你已经开发过分布式系统了
你有没有开发过简单的增删改查软件?这类软件通常都需要搭配一个独立的数据库管理系统共同完成功能。实际上,只要你开发过这么简单的软件,那么你就已经开发过分布式系统了。
“什么,基于数据库管理系统开发出来的软件就可以算分布式呀?我做了很多这类软件,怎么我从来没听过这种说法?
真的,我没开玩笑。还记得我们前面提到的吗,什么是分布式?不就是一个大系统拆分成多个小系统分散到不同的设备上吗。回想一下,当你写一个简单的增删改查软件时,只要用到数据库管理系统,是不是具有如下特点:
· 整个系统中,你写的代码跑在 A 进程里,而数据库管理系统则跑在另外一个进程 B 里
· A 进程与 B 进程通过某种通信协议连接
· 既可以使 A 进程与 B 进程运行在同一台机器上,也可以将它们分开运行于不同的机器上,并且系统依然可以照常运行
你看,这不就是分布式系统的特点吗?