“经典 Chandy–Lamport 算法运行在有限消息传递系统上。每条有向通道可靠、FIFO,发送的消息最终且恰好一次到达;快照期间进程不崩溃,所有需记录的进程都可从发起者沿通信图到达。记录…”
形式陈述 ​
设进程集合为
它记录所有局部状态与在途消息,是分析者构造全局状态机公理库状态机State machine · Transition system用状态集合、初始状态和转移关系描述系统可能执行轨迹的模型。时使用的对象。发送事件改变发送者状态并把带身份的消息记录加入信道;交付事件从信道取出一个当前可交付记录并更新接收者;本地步骤只改变一个进程。一次 send 完成不表示对方已经执行 receive,二者之间可以隔任意多系统步骤。
一次执行由本地、发送、交付和故障事件交错而成。可容许执行必须另行规定:正确进程是否持续取步骤;发给正确接收者的消息是否最终交付;信道是否会丢失、复制、乱序或篡改;发送者身份是否认证;容量是否有界。可靠、FIFO 与 authenticated 是不同维度。所谓“恰好一次处理”通常也不是信道的免费性质:重传提供至少一次,消息 ID 与接收方持久去重才可把应用效果限制到一次。
直觉
进程只能根据自己的局部状态与已交付消息行动。数学上的全局配置存在于证明中,协议没有读取它的指令;“所有人现在知道什么”必须通过一串消息逐步建立。
在途消息把通信拆成两个事件,也制造了认识论缺口。接收者尚未见到消息,可能因为发送者没发、信道很慢、消息丢失或发送者已崩溃。协议能排除哪些解释,完全取决于信道、时间与故障假设。
例子与边界
三个进程
再设 credit(10) 后回复丢失。(client,id,result),便可重发原响应而不重做效果。该协议在 crash-recovery 下还要求去重表比确认更早持久化,否则重启会忘记已经执行。
共享内存系统公理库共享内存系统Shared-memory system进程通过读写共享对象交互的并发模型。没有显式信道状态,进程通过读写对象交互。用消息服务器模拟寄存器需要请求、响应、版本与 quorum;用共享队列模拟收件箱又依赖队列原子性。偷偷加入所有节点可读的数据库或共享磁盘会改变模型,可能绕开原有故障结论。
推论与应用
可靠广播公理库可靠广播Reliable broadcast保证有效性、一致性和完整性的广播抽象。在点对点通信上增加共同交付性质,共识公理库分布式共识Distributed consensus · Consensus problem多个进程在可能故障和通信延迟下对一个值达成一致的任务。再要求对决定值达成一致,状态机复制把一系列决定变为共同命令日志。每层都继承底层信道假设;上层名称不会自动修复永久丢包或伪造发送者。
异步系统公理库异步系统Asynchronous distributed system消息延迟和进程相对速度没有已知有限上界的系统模型。不提供消息延迟上界,部分同步则只在未知稳定时刻后提供界。相同的可靠信道在两种时间模型中都有最终交付,却只有后者能让超时最终成为可靠的活性工具。
Chandy–Lamport 快照公理库Chandy–Lamport 分布式快照Chandy-Lamport snapshot · Distributed snapshot algorithm在可靠 FIFO 通道上用 marker 并行记录一致进程状态与在途消息的分布式快照算法。展示这些通道维度会怎样进入算法证明:经典 marker 规则要求可靠 FIFO 最终交付、快照涉及进程不崩溃,并用通道顺序区分快照前后的应用消息。非 FIFO 或故障版本需要其他算法;消息传递模型本身不内嵌 marker 协议。
参考资料
- Nancy A. Lynch, Distributed Algorithms, Morgan Kaufmann, 1996,Chs. 2–7。
- Hagit Attiya and Jennifer Welch, Distributed Computing: Fundamentals, Simulations, and Advanced Topics, 2nd ed., Wiley, 2004,Chs. 2–3。