分布式系统

分布式系统的第一性原理

分布式系统的本质问题

分布式系统的本质问题只有一个:

状态、顺序的一致性问题

即:

在这样的环境中,系统如何:

为什么必须引入分布式

分布式系统的存在,源于:用户日益增长的高可用、低延迟、海量数据需求单机算力、存储、网络上限之间的矛盾

这一矛盾驱动的必然选择

不可靠世界:分布式系统的基本假设

分布式系统的所有复杂性,来源于一个前提:

我们生活在一个不可靠的世界中。

这一不可靠性体现在三个不可消除的维度。

网络不可靠:通信不确定性

节点之间只能通过消息协作,但网络具备以下特性:

因此:

分布式系统中不存在“确定的通信”,只存在“推测”。根本原因是发送方只能通过响应推断对方的状态

超时:主要的判断机制

超时并不代表失败,而是系统做出的一个假设

节点不可靠:部分失效成为常态

分布式系统中,失效不是”全有或全无”,而是:

部分节点在部分时间失效(Partial Failure)

常见失效模型:

工程实践中通常假设:

非拜占庭故障模型,以换取系统复杂度的可控性。

时间不可靠:不存在全局时间

计算机中的时间具备以下特征:

因此:

时间顺序无法作为分布式系统的可靠依据。

两类时间认知

分布式系统必须优先使用逻辑顺序而非物理时间。

我们能做的唯一事情:假设与多数

在不可靠世界中,分布式系统能依赖的能力极其有限。

多数原则(Quorum)

当一个状态被多数节点认可时,我们将其视为”当前真相”。

这是共识算法、选主机制、一致性存储的共同基础。

假设驱动的系统设计

分布式系统并不”知道事实”,而是:

分布式系统是一个持续修正假设的系统。

一致性模型:对状态一致性的不同承诺

一致性并非非黑即白,而是一条连续谱。

一致性不是目标,而是代价函数

一致性越强:

常见一致性模型谱系

一致性模型本质承诺代价典型场景
线性化单一时间线幻觉可用性锁、选主
顺序一致全局操作顺序延迟日志系统
因果一致因果关系保序复杂度协作系统
最终一致状态最终收敛冲突处理大规模存储

线性化的本质

线性化的核心目标是:

让系统看起来像只有一个副本。

其实现方式本质是:

顺序与逻辑时间

因果关系是唯一可靠的顺序来源

逻辑时钟

逻辑时钟解决的不是”什么时候发生”,而是:

谁先于谁发生。

共识:分布式系统的中枢能力

共识的角色

共识解决的是:系统对同一状态是否达成一致判断。

其工程形式通常是:

全序广播

全序广播的目标是:

这是构建一致状态机的基础能力。

工程能力模型:从工具到能力

架构能力对抗问题常见手段
扩展性规模增长分片、无共享
可用性节点失败副本、选主
稳定性瞬时冲击限流、降级
一致性状态分歧共识、版本

分布式系统的工程哲学

反直觉事实

设计取舍

分布式系统不是"选择正确方案",而是明确你愿意付出的代价

适用边界

核心原则:代价先验

分布式架构的本质是代价交换,而非能力增强。引入分布式之前,必须明确你愿意为之付出的代价。

驱动因素:为什么必须分布式

只有以下力量能驱动分布式架构的引入——缺少任何一个,分布式就是过度设计:

驱动力本质
规模压力单机算力/存储/带宽无法承载业务量
可用性要求单点故障不可接受,业务中断代价极高
独立演进业务领域边界清晰,需并行开发与发布
地域分布用户或数据有物理位置约束

主要代价

分布式系统引入的代价是不可消除的根本性成本

不适用场景的原则判断

以下场景天然不适合分布式,应优先选择单体:

  1. **业务规模未超出单机上限** — 分布式解决的是规模问题,规模未达瓶颈时分布式徒增复杂性
  2. **强一致性事务频繁** — 分布式事务的代价极高,频繁跨服务强一致性场景下分布式是反模式
  3. **团队能力或基础设施不足** — 分布式需要配套的 CI/CD、监控、服务治理能力;能力不足时分布式反而降低可靠性
  4. **业务边界模糊** — 服务拆分依赖清晰的领域边界;边界模糊时的分布式拆分只会制造"分布式单体"

反模式与误区

核心认知:不确定性不可消除

分布式系统所有反模式都源于一个事实:错误必然发生

系统的应对方式决定了架构质量,而非避免错误的程度。

三个根本性误解

误解真相
可以消除不确定性只能管理,无法消除
一致性是可选特性一致性是代价函数,越强代价越大
存在"正确"算法所有算法都是权衡,无银弹

常见反模式

反模式核心问题典型后果
分布式单体服务间高耦合改一处动全身
级联故障故障扩散雪崩
过度信任超时超时≠失败重复操作、幂等破坏
一致性模型错配场景与一致性不匹配支付丢数据 / Feed响应慢
循环依赖调用环局部故障→全链路瘫
无界重试故障流量无管控下游过载

关联内容(自动生成)