在构建分布式系统时,我们往往梦想着构建一个既完美一致、又永远可用、还能容忍任何网络故障的系统。然而,物理定律和数学理论告诉我们:不存在完美的银弹。本篇将深入探讨分布式系统的理论基石------CAP 定理,以及从 ACID 到 BASE 的思维跃迁。
1. CAP 定理深度解析:为什么只能三选二?
2000 年,Eric Brewer 提出了著名的 CAP 定理。它指出,对于一个分布式计算系统,不可能同时满足以下三点:
- 一致性 (Consistency):所有节点在同一时间具有相同的数据。即"写操作"完成后,所有的"读操作"都能读到最新的值。
- 可用性 (Availability):每次请求都能获取到非错的响应,但是不保证获取的数据为最新数据。
- 分区容错性 (Partition Tolerance):系统中任意信息的丢失或失败不会影响系统的继续运作。即便网络发生分区(节点间无法通信),系统仍能工作。

图 1.1:CAP 三者关系与常见系统分类
核心矛盾:P 是不可选项
在分布式系统中,网络分区(Network Partition)是必然会发生的(网线被剪断、路由器故障、延迟过高)。因此,分区容错性 (P) 是必须保证的。
既然 P 是前提,我们真正的选择权只在于:
- CP (一致性优先):发生网络分区时,为了保证数据一致,系统拒绝部分请求(牺牲可用性)。例如:Zookeeper 在 Leader 选举期间无法提供服务。
- AP (可用性优先):发生网络分区时,为了保证服务可用,系统返回旧版本的数据(牺牲一致性)。例如:Eureka 的自我保护机制。
2. 从 ACID 到 BASE:思维模式的转变
在单机关系型数据库时代,我们遵循 ACID 原则;但在分布式高并发场景下,BASE 理论应运而生。
ACID (传统强一致)
- Atomicity (原子性): 事务要么全做,要么全不做。
- Consistency (一致性): 事务前后数据保持逻辑一致。
- Isolation (隔离性): 并发事务互不干扰。
- Durability (持久性): 提交后数据永不丢失。
BASE (互联网高可用)
- Basically Available (基本可用): 允许损失部分功能(如降级),但在核心功能上保证可用。
- Soft state (软状态): 允许数据存在中间状态。
- Eventual consistency (最终一致性): 所有副本经过一段时间后,最终会达到一致。

图 2.1:一致性模型的光谱
3. 实战切入:不同业务场景的选型策略
场景一:强一致性 (CP) ------ 银行转账
业务痛点:A 转账给 B 100 元,A 的余额减少和 B 的余额增加必须是一个原子操作。绝对不能出现 A 扣了钱,B 没收到的情况。
技术选型:关系型数据库 (MySQL/PostgreSQL) + 分布式事务 (XA/TCC/Seata)。

图 3.1:两阶段提交 (2PC) 保证强一致性
场景二:高可用性 (AP) ------ 商品详情与评论
业务痛点:双十一大促,海量用户刷新商品页面。如果因为某个节点同步延迟导致用户暂时看到旧的评论数,或者库存显示稍微滞后,是可以接受的。但如果系统直接报错"无法服务",用户会流失。
技术选型:NoSQL (Cassandra / DynamoDB / Redis Cluster)。

图 3.2:AP 架构下的异步复制与最终一致
4. 最终一致性实践:用户注册与欢迎邮件
这是 CAP 取舍最经典的落地场景。我们不希望仅仅因为邮件服务器繁忙,就导致用户注册失败。
策略 : 1. 核心链路 (写数据库)保证强一致性。 2. 辅助链路(发邮件、送积分)通过消息队列解耦,实现最终一致性。

图 4.1:基于消息队列的最终一致性架构
5. 总结与思考
作为架构师,在面对 CAP 三角时,不应盲目追求 CP 或 AP,而应进行权衡 (Trade-off):
- 资金、账单、医疗数据:首选 CP,甚至牺牲性能也要保证数据准确。
- 点赞数、浏览量、非核心配置:首选 AP,用户体验第一,数据在几秒后一致是可以接受的。
- 大多数互联网业务 :采用 BASE 策略。核心交易链路强一致,下游业务(积分、通知、大数据统计)最终一致。