从零开始学习JavaWeb-20


​一、分布式一致性的理论基础​

​1. CAP 定理与一致性模型​
  • ​CAP 定理核心​​:

    ​特性​ ​描述​ ​业务场景​
    ​一致性 (C)​ 所有节点数据实时同步 金融交易(支付状态强同步)
    ​可用性 (A)​ 每次请求均获响应(可能非最新数据) 电商商品浏览(允许短暂延迟)
    ​分区容错性 (P)​ 网络分裂时系统继续运作 跨机房部署(必须保障)

    ​实践启示​​:

    • ​CP 系统​​(如 ZooKeeper):牺牲可用性保障强一致性(如银行转账)。

    • ​AP 系统​​(如 Cassandra):牺牲一致性保障高可用(如实时推荐系统)。

  • ​一致性模型分类​​:

    • ​强一致性​ ​:写入后立即可读(线性一致性),通过 ​​Paxos/Raft​​ 实现(如 Etcd)。

    • ​最终一致性​​:无新写入后终态一致(如 DNS 系统),基于 Gossip 协议。


​二、主流分布式一致性算法​

​1. Paxos 协议:理论基石​

​角色与两阶段流程​​:

复制代码
sequenceDiagram
    Proposer->>Acceptor: Prepare(n)
    Acceptor-->>Proposer: Promise(ignore <n)
    Proposer->>Acceptor: Accept(n, v)
    Acceptor-->>Proposer: Accepted(n, v)

​核心机制​​:

  • ​提案编号全局唯一​​:避免冲突(时间戳 + 节点 ID)。

  • ​多数派原则(Quorum)​ ​:需半数以上节点同意(故障容忍公式:f < N/2)。

    ​工程缺陷​​:实现复杂,多轮通信开销大(Google Chubby 团队曾称"理解需 6 个月")。

​2. Raft 协议:工业级首选​

​角色状态机​​:

复制代码
graph LR
    Follower -->|选举超时| Candidate
    Candidate -->|获多数票| Leader
    Leader -->|故障| Follower

​核心流程​​:

  1. ​领导者选举​​:节点超时未收心跳 → 成为 Candidate → 获多数票成为 Leader。

  2. ​日志复制​​:

    • Leader 接收写请求生成 Log Entry。

    • 并行发送 AppendEntries RPC 至 Followers。

    • 多数节点持久化后提交日志。

      ​优势​​:逻辑清晰,易于实现(etcd、Consul 采用)。

​3. ZAB 协议:ZooKeeper 的引擎​

​与 Raft 关键差异​​:

​特性​ Raft ZAB
​任期命名​ Term Epoch
​心跳方向​ Leader → Follower Follower → Leader
​写操作流程​ 先广播后持久化 先本地持久化后广播

​崩溃恢复模式​​:选举最高 zxid 节点 → 数据同步 → 广播新 Leader。


​三、分布式锁的实现方案​

​1. 三大实现方式对比​
​方案​ ​核心原理​ ​适用场景​ ​性能​
​数据库锁​ 唯一索引约束(INSERT ... ON DUPLICATE 低并发简单场景
​Redis 锁​ SETNX key uuid EX 30 高并发,允许偶尔失效 ⭐⭐⭐⭐⭐
​ZooKeeper 锁​ 临时顺序节点 + Watcher 监听 强一致性需求(如金融) ⭐⭐⭐

​Redis 锁避坑​​:

  • ​锁续期​​:Redisson 看门狗机制自动续期(默认 30 秒检测)。

  • ​误释放​ ​:Lua 脚本校验 UUID 再释放(if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]))。


​四、分布式事务解决方案​

​1. Seata AT 模式​

​两阶段流程​​:

复制代码
graph TB
    TM[事务管理器] --> TC[事务协调器]
    TC --> RM1[资源管理器]
    TC --> RM2[资源管理器]
    RM1 --> DB1[生成 undo_log]
    RM2 --> DB2[生成 undo_log]

​核心机制​​:

  • ​全局锁​ ​:SELECT FOR UPDATE防止其他事务修改数据。

  • ​回滚日志​​:记录数据修改前后的快照(SQL 反向补偿)。

​2. TCC 模式​

​三阶段操作​​:

  1. ​Try​​:预留资源(如冻结库存)。

  2. ​Confirm​​:实际提交(扣减库存)。

  3. ​Cancel​​:失败回滚(解冻库存),需业务幂等设计。

    ​适用场景​​:高一致性要求(如机票超卖后的退款补偿)。


​五、工业级实战案例​

​1. 电商订单支付系统​

​高并发设计​​:

复制代码
graph TB
    用户 -->|下单| 订单服务
    订单服务 -->|发送 MQ| 库存服务
    库存服务 --> Redis[预减库存]
    库存服务 --> DB[持久化库存]
    订单服务 -->|TCC| 支付服务

​关键保障​​:

  • ​库存预扣​ ​:Redis 原子操作防超卖(DECR stock_count)。

  • ​最终一致性​​:支付成功消息异步更新订单状态(MQ 重试机制)。

​2. 配置中心高可用(Nacos)​

​架构要点​​:

  • ​数据分片​​:配置按 Group 分片存储。

  • ​多级缓存​​:客户端内存缓存 + 服务端 Redis 缓存。

  • ​长轮询​​:配置变更实时推送(30 秒超时)。


​六、算法选型与未来趋势​

​1. 一致性协议选型指南​
​特性​ Paxos Raft ZAB
​理解难度​ ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐
​性能​ 高(无 Leader 瓶颈) 中高(依赖 Leader)
​适用场景​ 理论验证 通用系统(etcd) 协调服务(ZooKeeper)

​选型建议​​:

  • 快速落地 → Raft(etcd/Consul)。

  • 强协调服务 → ZAB(ZooKeeper)。

​2. 前沿趋势​
  • ​性能突破​​:RDMA 网络加速共识通信(延迟降低 80%)。

  • ​安全增强​​:抗量子计算签名算法集成(如 Dilithium)。

  • ​无主协议兴起​​:EPaxos 优化跨地域部署。


​总结:分布式系统设计原则​

  1. ​故障是常态​​:默认节点会宕机、网络会分区(冗余副本 + 自动故障转移)。

  2. ​异步解耦​​:消息队列(Kafka)解耦耗时操作(如日志记录)。

  3. ​幂等性​​:所有操作支持重试(唯一请求 ID 防重复)。

  4. ​监控先行​​:分布式追踪(SkyWalking) + 日志聚合(ELK)。

​"分布式系统的本质是在不确定性中寻求确定性"​

​动手实践​​:

  1. 基于 Redisson 实现秒杀库存锁(对比 Redis 与 ZooKeeper 性能)。

  2. 模拟网络分区(iptables断网),观察 ZooKeeper 选举行为。

  3. 压测 Seata AT 模式与 TCC 模式的性能差异。