IT 论文精读 · PAPER 73

FLP 不可能性(Impossibility of Distributed Consensus with One Faulty Process)

Fischer, Lynch & Paterson · PODS 1983 / JACM 1985

EN →

这篇论文干了什么?

1985 年,三位理论学者 Fischer、Lynch、Paterson 证明了一件让整个分布式领域安静了一下的事:在互联网这样的网络里,只要有一台机器可能宕机,就不存在任何一套规则,能保证所有机器最后一定都选出同一个答案。要害在「保证」二字。今天的 Paxos、Raft 和区块链共识,都是在绕开这个结论活着。

先说清楚要办的事

想象五台机器要就一件事表态,比如「这笔转账算成功还是失败」。它们只能互发消息商量,规矩三条:① 最后大家必须选同一个答案;② 两种答案都得有可能被选出来(否则把「永远选失败」写死也算达成一致,那是耍赖);③ 没坏的机器最后都得真的选出来,不能永远举棋不定。只要消息可能慢得没有上限,而且哪怕只有一台机器可能中途宕机,这三条就凑不齐。

难在哪:你分不清「死了」还是「慢」

要害只有一句:在没有时间上限的网络里,一台不吭声的机器,和一台已经发了话、消息还在路上的机器,看起来一模一样。

现实里我们靠超时判断——等十秒没回就当它死了,可这背后有个前提:「正常不会超过十秒」。这里恰恰没有这个前提。于是只剩两条路:一直等(可能永远等下去,违反 ③);或者当它死了往下走——万一它只是慢,醒来时手里已有另一个答案,① 就破了。

论文怎么证明「真的做不到」

这不是「还没人想出来」,而是证明了谁都想不出来。思路很漂亮:先给系统的每个瞬间状态贴标签。有的大局已定——不管后面怎么走,结果必然是「成功」,或必然是「失败」;还有一种两边都有可能,姑且叫「悬着」。

论文接着证两件事:开局就必然存在一个「悬着」的状态;而且只要系统还悬着,总能挑一条消息把送达往后挪一挪,让它走完这一步之后仍然悬着。把这招无限用下去,系统就永远在「悬着」里打转。

这个刁难一点不赖皮:它不扣押任何消息,也不弄坏任何一台机器,只是排了个特别别扭的送信顺序。算法之所以露出这个洞,仅仅因为它必须事先准备好容忍一台机器宕机——这份准备本身就是那条缝。

那工程上怎么办

三条凑不齐,就得主动放掉一条,放哪条很有讲究。Paxos、Raft 这类真在用的算法死守前两条:绝不给出两个互相矛盾的答案;让掉的是 ③ 里的「保证」——不承诺多久之内一定出结果。网络正常时几乎总能飞快定下来,一团糟时宁可卡住也不出错。另一条路是掷骰子:拿不定主意时随机选,「永远卡住」的概率就趋近于零。

也说句诚实的:这个结论说的是最坏情况下可能永远拖着,不是「实践中办不到」——真实网络不会永远配合那种刁钻的顺序,这正是 Paxos 们照样好用的原因。

一句话记住

在消息可能任意慢的网络里,「宕机」和「很慢」长得一模一样;于是只要允许一台机器出事,就没有算法能同时保证「不出两个答案」和「一定出得了答案」。能用的共识算法都在这两者间做了取舍——保住不出错,让掉「一定多快出结果」。

想看双价配置、菱形交换引理与四条绕行路线? → 切到精读版