人们在谈及分布式系统的理论时,首先要明确其前置的通讯模型
(有的地方也称为时间模型
)的约定。比较常见的有同步网络模型
、异步网络模型
和部分同步网络模型
1。
同步网络模型
在同步网络模型
中:
- 进程间的消息通讯、传输延时有界。认为通讯耗时是有确定范围的;
- 每个进程的处理速度是确定的。我们可以确切知道进程中每步算法的耗时。
因此我们可以推导出:
- 每个进程间的时钟是同步的,因为前面的定义1、2,所以我们可以使用通讯来同步各个机器上的时钟,使得各个机器的时钟误差在\(\Delta T\)内。
- 如果一个请求超过的应答超过\(RTT + T_{请求处理耗时}\),则可以判定对端异常。
同步网络模型
使用起来最简单,是理想的网络模型,但是它就跟物理实验中的”光滑平面”一样,在实际环境中并不存在。
异步网络模型
在异步网络模型
中,我们引用FLP 不可能性
2中的定义:
- 进程间的消息通讯、传输延时没有上界;
- 每个进程的处理速度是不确定的;
- 每个机器上没有同步时钟(即不存在
原子钟
这种东西),时间流逝速度可能也不同。
因此我们可以推导出:
- 各个机器上的时钟没有可参考性,因为3每个机器不能自发保持时间的一致性,并且因为1、2,机器时间也无法同步时钟在一个有界的误差之内。所以依赖超时机制的算法并不可用。
- 因为1、2,当一个请求在本地时钟上超时后,我们无法判断这个请求是否是因为对端异常造成的。这是一个经典的
两军问题
3场景,故,我们无法对其他实例进行故障探测。
从定义中3,我们引出两个概念,但是这两个概念原本是集成电路4 5中的概念,但是我们在分布式系统中重新扩展一下:
clock drift(时钟漂移)
:相关节点上的时钟以不同的速率运行。在\(P_1\)节点上经过\(\Delta T_1\)的同时,\(P_2\)节点经过了\(\Delta T_2\),但是\(\Delta T_1 \neq \Delta T_2\)。clock skew(时钟偏移)
:相关节点都引用了同一个时间源(比如通过NTP服务),但是由于这个时间源将授时信号同步不同节点时的耗时不同(比如网络传输耗时),造成同一时刻不同节点间产生了时间差。这是一个比clock drift(时钟漂移)
更加严格的要求,因为如果一个系统内部的\(T_{Skew}\)存在上界\(T_{ShewMax}\),那一定能通过不断的校时、保持时钟同步,使得\(T_{Drift}\)保持在\(T_{ShewMax}\)以内。
异步网络模型
是一个最理想的”最差”网络模型,但是其复杂度又远超我们实际情形。
部分同步网络模型
我们现实中遇见的网络模型通常介于同步网络模型
和异步网络模型
两者之间。因为在我们所知的大部分系统,在大部分时间内:
- 进程间的消息通讯、传输延时是有上界的;只有在网络过载、网络分区故障时,才没有上界;
- 每个进程的处理速度是确定的;只有在发生
GC
、磁盘IO阻塞等异常情况时,每个进程的处理速度才不可确定。 - 每个机器上的时钟我们可以认为是基本同步的,比如我们可以使用
NTP
来同步机器时间,而且多数机器上有独立的时钟芯片,我们也可以粗略认为各个机器上时间流逝的速度是相同的。但是严格要求时序的系统除外。
结论
在FLP 不可能性
中已经明确给我们指明了分布式系统中的矛盾点,我们需要结合部分同步网络模型
与异步网络模型
的约束条件变化,以及我们的业务需求,去做出具体的取舍。比如在分布式编程中的故障探测就给出了故障探测
需要做出的取舍。