🌐 漫画分布式 - 驾驭复杂系统的艺术
📚 目录
🎪 记忆口诀
🏗️ CAP定理 - “一致可用分区容错三选二”
Consistency一致性,所有节点数据同
Availability可用性,系统持续能响应
Partition tolerance分区容错,网络故障仍运行
三者不可能兼得,最多只能选择二
🚀 BASE理论 - “基本可用软状态最终一致”
Basically Available基本可用,核心功能要保证
Soft State软状态,中间状态可存在
Eventually Consistent最终一致,经过时间会一致
CAP定理的妥协,分布式的现实选择
📦 分布式事务模式 - “两阶段三阶段TCC补偿”
2PC两阶段提交,协调者统一指挥
准备阶段询问意见,提交阶段统一行动
3PC三阶段提交,增加预提交减阻塞
TCC补偿模式,Try Confirm Cancel三步走
Saga长事务拆分,本地事务加补偿
🔧 一致性算法 - “Raft Paxos选主共识”
Raft算法易理解,Leader Follower Candidate
选举投票过半数,日志复制保一致
Paxos算法更复杂,Proposer Acceptor Learner
两阶段协商达共识,拜占庭将军问题解
📊 可视化图表
🏛️ 分布式系统架构全景图
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Web Client │ │Mobile Client│ │ Third Party │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└──────────────────┬────────────────────────────────────────┘
│
┌──────────────────▼────────────────────────────────────────┐
│ 网关层 & 负载均衡 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │API Gateway │ │Load Balancer│ │Service Mesh │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└──────────────────┬────────────────────────────────────────┘
│
┌──────────────────▼────────────────────────────────────────┐
│ 微服务层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ User Service│ │Order Service│ │Product Service│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │Payment Service│ │Inventory Service│ │Notification Service│
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└──────────────────┬────────────────────────────────────────┘
│
┌──────────────────▼────────────────────────────────────────┐
│ 中间件层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │Message Queue│ │Cache Cluster│ │Config Center│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │Service Discovery│ │Distributed Lock│ │Monitoring│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└──────────────────┬────────────────────────────────────────┘
│
┌──────────────────▼────────────────────────────────────────┐
│ 数据层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ MySQL │ │ MongoDB │ │ElasticSearch│ │
│ │ Cluster │ │ Cluster │ │ Cluster │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
🔄 CAP定理权衡图
Consistency
▲
│
│
CP系统 ────┼──── CA系统
(传统数据库) │ (单机系统)
│
│
──────────┼──────────►
│ Availability
│
│
AP系统
(NoSQL数据库)
│
▼
Partition Tolerance
🎯 分布式事务对比图
2PC (Two-Phase Commit):
准备阶段: Coordinator → All Participants (Vote Request)
提交阶段: Coordinator ← All Participants (Vote)
Coordinator → All Participants (Commit/Abort)
TCC (Try-Confirm-Cancel):
Try阶段: 预留资源,检查业务条件
Confirm阶段: 确认执行,释放资源
Cancel阶段: 取消执行,补偿回滚
Saga模式:
本地事务1 → 本地事务2 → 本地事务3 → ... → 本地事务N
↓ ↓ ↓ ↓
补偿1 ←── 补偿2 ←── 补偿3 ←── ... ←── 补偿N
🎭 形象比喻
🏢 "跨国公司"比喻
分布式系统就像一个跨国公司:
- 总部(主节点): 负责重要决策和全局协调
- 分公司(子节点): 分布在不同地区,负责具体业务
- 通信网络: 分公司间的通信可能延迟或中断
- 一致性: 各分公司的政策和数据要保持同步
- 可用性: 即使某个分公司出问题,业务仍要继续
- 分区容错: 网络故障时,分公司要能独立运作
🏥 "医疗联盟"比喻
分布式事务就像医疗联盟的手术:
- 2PC: 主治医师询问各科室准备情况,确认后统一开始手术
- TCC: 预约手术室(Try),确认手术(Confirm),取消手术(Cancel)
- Saga: 手术分多个步骤,出问题时要逐步回退补救
- BASE: 手术过程中允许临时不一致,最终达到治疗目标
🚦 "城市交通"比喻
一致性算法就像城市交通控制:
- Raft选举: 选出交通总调度员(Leader)
- 日志复制: 将交通指令同步到各个路口
- 心跳机制: 定期检查各路口状态
- 故障转移: 总调度员故障时,自动选出新的调度员
🔢 数字记忆
📊 分布式系统重要数字
- CAP定理: 3个特性最多选2个
- ACID特性: 4个事务特性(原子性、一致性、隔离性、持久性)
- BASE理论: 3个核心概念
- Raft算法: 需要过半数(N/2+1)投票
- 2PC阶段: 2个阶段(准备、提交)
- 3PC阶段: 3个阶段(准备、预提交、提交)
📈 一致性级别数据
一致性强度排序:
1. 强一致性 (Strong Consistency)
2. 顺序一致性 (Sequential Consistency)
3. 因果一致性 (Causal Consistency)
4. 最终一致性 (Eventual Consistency)
5. 弱一致性 (Weak Consistency)
网络延迟影响:
- 同城网络: 1-5ms
- 跨城网络: 10-50ms
- 跨国网络: 100-300ms
- 卫星网络: 500-700ms
🎯 可用性等级
可用性等级 (SLA):
- 99.9% = 8.76小时/年停机
- 99.99% = 52.56分钟/年停机
- 99.999% = 5.26分钟/年停机
- 99.9999% = 31.5秒/年停机
故障恢复时间 (RTO/RPO):
- RTO (Recovery Time Objective): 恢复时间目标
- RPO (Recovery Point Objective): 恢复点目标
- 金融级: RTO<30s, RPO<1s
- 企业级: RTO<5min, RPO<1min
💼 实战案例
🚀 电商平台分布式架构设计
场景描述
构建一个支持千万用户的电商平台,要求:
- 99.99%高可用性
- 支持秒杀等高并发场景
- 数据强一致性保证
- 系统横向扩展能力
架构设计与实现
1. 微服务拆分与服务发现
// 用户服务
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private DistributedLock distributedLock;
@PostMapping("/register")
public ResponseEntity<User> register(@RequestBody UserRegistrationDto dto) {
String lockKey = "user:register:" + dto.getEmail();
return distributedLock.executeWithLock(lockKey, 30, TimeUnit.SECONDS, () -> {
// 防止重复注册
if (userService.existsByEmail(dto.getEmail())) {
throw new BusinessException("邮箱已被注册");
}
User user = userService.createUser(dto);
// 发送异步事件
eventPublisher.publishEvent(new UserRegisteredEvent(user));
return ResponseEntity.ok(user);
});
}
}
// 分布式锁实现
@Component
public class RedisDistributedLock implements DistributedLock {
@Autowired
private StringRedisTemplate redisTemplate;
private static final String LOCK_SCRIPT =
"if redis.call('get', KEYS[1]) == ARGV[1] then " +
"return redis.call('del', KEYS[1]) " +
"else return 0 end";
@Override
public <T> T executeWithLock(String key, long timeout, TimeUnit unit,
Supplier<T> action) {
String lockValue = UUID.randomUUID().toString();
String lockKey = "lock:" + key;
try {
// 尝试获取锁
Boolean acquired = redisTemplate.opsForValue()
.setIfAbsent(lockKey, lockValue, timeout, unit);
if (!acquired) {
throw new LockAcquisitionException("无法获取锁: " + key);
}
// 执行业务逻辑
return action.get();
} finally {
// 释放锁 - 使用Lua脚本保证原子性
redisTemplate.execute(new DefaultRedisScript<>(LOCK_SCRIPT, Long.class),