20.5 三种算法对比 (消息量 / 公平性 / 可用性)
一句话
三种互斥算法是三个固定的取舍:集中式用中心换消息(2 条),Ricart-Agrawala 用消息换去中心(2(N−1) 条),令牌环用延迟换公平(O(N) 跳);没有最优,只有 “你的瓶颈是消息、延迟还是容错”。
一张表看完
| 维度 | 集中式(协调者 + 租约) | Ricart-Agrawala(全票) | 令牌环 |
|---|---|---|---|
| 每次进入消息数 | 2 + 1(释放) | 2(N−1) | 1(令牌传递) |
| 进入延迟 | 1 RTT | 1 RTT(等最慢回复) | 平均 N/2 跳 |
| 公平性 | 可做 FIFO,取决于实现 | 天然按时间戳 FIFO | 严格轮转 |
| 容错 | 中心挂 = 不可用;有副本需共识 | 任一节点挂 = 卡住 | 任一环断 = 停摆 |
| 单点 | 有(可高可用化) | 无 | 无 |
| 实现复杂度 | 低 | 中 | 中高(环维护) |
| 规模 | 大(中心可扩展) | 小(N < 10) | 中(依赖延迟) |
| 生产可用性 | 高(租约 + fencing) | 低 | 低 |
选型判据
| 你的情况 | 选择 |
|---|---|
| 通用场景、要求可用性 | 集中式 + 租约 + fencing(生产默认) |
| 节点少、要严格轮流、无中心 | 令牌环 |
| 学术/嵌入式、可接受零容错 | Ricart-Agrawala |
| 跨地域、网络分区频繁 | 集中式(区域中心)+ 分区内自治,不要全票算法 |
数字直觉
- N=5:集中式 3 条 vs RA 8 条 vs 环平均 2.5 跳。
- N=100:集中式 3 条 vs RA 198 条 vs 环平均 50 跳。
消息量是 O(1)、O(N)、O(1) 但延迟 O(N)——三个不同的增长曲线,决定了适用规模。
三种算法的细节分别在 20.2 集中式互斥 (协调者)、20.3 分布式互斥 (Ricart-Agrawala / 全票通过)、20.4 令牌环互斥。
代码:一次互斥的 “预算表”
集中式: acquire 1 RTT + release 1 RTT ≈ 2 RTT,消息 3 条
RA: 广播 N-1 + 收 N-1 ≈ 1 RTT(等最慢),消息 2(N-1)
令牌环: 等令牌平均 N/2 跳 + 传递 1 跳 ≈ (N/2+1) 跳,消息 1 条
选型判据(把 N 代进去算):
N < 10 且要求严格公平 → 令牌环
任意 N,要求可用性 → 集中式 + 租约 + fencing
封闭环境、可接受零容错 → RA
反模式
| 反模式 | 后果 |
|---|---|
| 不看规模直接选 RA | N 大了消息爆炸 |
| 用令牌环做高频互斥 | 延迟 O(N),吞吐上不去 |
| 集中式不做高可用 | 锁服务挂 = 全站停写 |
| 任何方案都不做 fencing | 暂停进程的迟到写破坏互斥 |
| 只比较消息数就选算法 | 忽略延迟与容错,规模上来后返工 | | 忽视 “算法外的工程” | 成员变更/失联处理才是事故来源 |
三条铁律
🔑 消息量与延迟的增长曲线决定适用规模,不是 “哪个更先进”。
🔑 生产默认集中式;它的单点可以用共识与租约解决,其他两者的容错更难补。
🔑 无论哪种算法,资源侧都要有 fencing。
自检
Q1 为什么生产上更偏爱集中式,尽管它有单点?
▸ 答案:因为单点可以被工程手段消解(多副本 + 共识 + 租约 + 客户端重试),而 RA 与令牌环的 “全票/环” 特性在故障时直接失去活性,且成员变更本身需要共识。集中式的复杂度是 “可运维的复杂度”。
Q2 令牌环 “消息最少” 为什么反而不常用?
▸ 答案:因为延迟随 N 线性增长,而且环维护(加入/离开/令牌丢失)的复杂度很高,任何一处故障都可能导致全局停摆。消息少的好处被 “延迟 + 运维” 抵消。
Q3 如果一定要在 N=50 的集群做互斥,选哪个?
▸ 答案:集中式(带租约与 fencing):RA 要 98 条消息、令牌环平均 25 跳;集中式 1 RTT 且可水平扩展(按锁名分片到多个协调者)。只有在 “完全不能有中心” 的约束下才考虑其他两者。
Q4 三种算法的公平性差异体现在哪?
▸ 答案:RA 按时间戳 FIFO(先请求先进入);令牌环严格轮转(每节点一次机会);集中式取决于队列实现(可 FIFO,也可优先级)。公平性影响的是 “最坏等待时间”,在高竞争场景下比平均延迟更重要。
Q5 为什么说 “算法选对了但没配 fencing 依然会错”?
▸ 答案:因为所有算法都假设 “持有者会按时释放”。现实中进程会暂停(GC、缺页、调度),恢复后仍以为自己持有锁。fencing token 让资源侧能拒绝 “过期的持有者”,这是算法层面的互斥无法覆盖的工程漏洞。
Q7 为什么表中 RA 是 “1 RTT” 而令牌环是 “N/2 跳”?
▸ 答案:因为 RA 的请求/回复并行广播,延迟由最慢的一个回复决定(1 RTT);令牌环的令牌必须串行逐跳传递,等待时间随环上节点数线性增长。两者消息量与延迟的增长曲线完全不同,这就是 “按规模选” 的数学依据。
关联
- 前置:20.1 互斥问题与临界资源 (安全性 / 活性)
- 并列:20.2 集中式互斥 (协调者)、20.3 分布式互斥 (Ricart-Agrawala / 全票通过)、20.4 令牌环互斥
- 下游:48.3 分布式锁、21.12 共识算法对比