“经典 Chandy–Lamport 算法运行在有限消息传递系统上。每条有向通道可靠、FIFO,发送的消息最终且恰好一次到达。这里按经典模型取无界缓冲,发送不因通道容量阻塞;有界缓冲实现须另证…”
形式陈述
本条固定有限进程集合
它记录所有局部状态与在途消息,是分析者构造全局状态机理路状态机State machine · Transition system用状态集合、初始状态和转移关系描述系统可能执行轨迹的模型。时使用的对象。发送事件改变发送者状态并把带身份的消息记录加入信道;交付事件从信道取出一个当前可交付记录并更新接收者;本地步骤只改变一个进程。一次 send 完成不表示对方已经执行 receive,二者之间可以隔任意多系统步骤。
一次执行由本地、发送、交付和故障事件交错而成。若需把自发送也建模为有独立缓冲或故障行为的信道,或区分同一端点对之间的多条信道,就应采用允许自环或平行弧的扩展通信图,而不再沿用本条的简单图约定。可容许执行必须另行规定:正确进程是否持续取步骤;发给正确接收者的消息是否最终交付;信道是否会丢失、复制、乱序或篡改;发送者身份是否认证;容量是否有界。可靠、FIFO 与 authenticated 是不同维度。所谓“恰好一次处理”通常也不是信道的免费性质:重传在最终成功条件下提供至少一次,消息 ID、持久去重与业务效果的原子提交才可把应用效果限制到一次。即使如此,接收方已处理而响应丢失时,发送方仍可能暂时不知道最终结果。
直觉
进程只能根据自己的局部状态与已交付消息行动。数学上的全局配置存在于证明中,协议没有读取它的指令;“所有人现在知道什么”必须通过一串消息逐步建立。
在途消息把通信拆成两个事件,也制造了认识论缺口。接收者尚未见到消息,可能因为发送者没发、信道很慢、消息丢失或发送者已崩溃。协议能排除哪些解释,完全取决于信道、时间与故障假设。
例子与边界
三个进程
再设 credit(10) 后回复丢失。(client,id,result),便可重发原响应而不重做效果。该协议在 crash-recovery 下不仅要求去重表比确认更早持久化,还要求去重记录与业务效果原子提交:先记去重后入账,崩溃可能使重试被忽略而钱没到账;先入账后记去重,崩溃又可能让重试再次入账。二者放进同一本地事务,才关闭这两个相反窗口。
共享内存系统理路共享内存系统Shared-memory system进程通过读写共享对象交互的并发模型。没有显式信道状态,进程通过读写对象交互。ABD 寄存器理路ABD 寄存器ABD register · Attiya–Bar-Noy–Dolev register用单调版本、多数确认与读后写回实现原子寄存器,并以写前查询和二元标签扩展到多写者。用请求、响应、单调版本与多数写回模拟原子寄存器;用共享队列模拟收件箱又依赖队列原子性。偷偷加入所有节点可读的数据库或共享磁盘会改变模型,可能绕开原有故障结论。
推论与应用
可靠广播理路可靠广播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 协议。
有损信道系统理路有损信道系统Lossy channel system用有限控制加无界 FIFO 字串建模有损通信,以子词顺序证明兼容性,并划清丢失、可靠性与概率保证。精确区分无界 FIFO 通信中的错误语义:消息可任意删除,但不可复制、插入或重排。子词良拟序与丢失造成的迁移单调性使控制状态覆盖可判定;这不保证消息最终送达,也不把可靠信道的可判定性问题一并解决。
受限可靠流状态机理路受限可靠流状态机Restricted reliable stream · Cumulative acknowledgement protocol在固定有限字节串上定义发送、丢失、乱序、重复、确认与重传事件,证明前缀安全并明确公平交付和退出条件。展示如何在可丢失、重复与乱序的数据包上维持连续字节前缀,并把公平重传单列为活性前提。它的固定长度、无绕回等限制不属于本页一般消息模型,也不是完整TCP实现。真实TCP字节流理路TCP字节流、序号与累计确认TCP byte stream · Cumulative ACK · TCP sequence number逐字节计算序号、累计ACK与重复重组,处理32位绕回和短读,区分对端TCP接收与应用执行。没有应用消息边界,须经分帧才接到消息接口;其累计ACK仍不证明业务执行。
RPC结果判定理路RPC结果判定与重试的不确定性RPC outcome uncertainty · Unknown outcome · Retry semantics为一个逻辑请求维护待定、成功、明确失败与结果未知状态,用不可区分轨迹解释响应丢失、重连和deadline后仍可能执行。进一步把成功、明确失败与结果未知组织为客户端观察状态。本文credit(10)及去重记录与效果原子提交的两个崩溃窗口仍保留在这里;新页只处理请求结果证据与重试边界,不重复建立一个完整去重协议。
完整的跨重试协议统一见复制会话、请求序号与结果去重理路复制会话、请求序号与结果去重Replicated client session · Request deduplication · Session sequence number用显式注册会话、严格请求序号和同前缀结果表处理重试,复算响应丢失、乱序、结果回收及会话过期边界。:它从本页两个原子提交窗口继续,规定显式注册、序号gap、旧结果回收、会话过期拒绝与同前缀恢复。本页保留信道与局部原子性例子,CS07保留客户端观察分类;结果表和会话生命周期的算法归该服务页,不把一次OK扩展为其他在途尝试不会生效的证明。
参考资料
- 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。