← 揭开黑盒:理解系统的调查课堂

第三单元:你收到我的“收到了”了吗?

甲派人送来一封信:我们明天九点同时出发。

乙收到了,回信说:好,我会去。

甲终于放心,却想到另一个问题:乙怎么知道,这封回信已经到了自己手里?如果乙担心回信丢了,还会按时出发吗?

于是甲再送一封:我收到了你的确认。

这次换谁等待?

一封越来越难结束的信

这个故事通常叫“两军问题”。两支队伍需要协调行动,单独行动不可接受;双方诚实,信使却可能无法到达。我们可以把它想成一次出发约定,关键仍是双方各自只有局部信息。

先分清两件事。乙已经收到原信,甲后来也实际收到了回信,普通双向通信完全可能成功。但甲取得了一份确认,不等于乙也知道甲取得了这份确认。继续往上问,还会有“我知道你知道我知道”。

这种共同知道的要求,强于双方各自知道。消息都可能丢失时,有限交换无法为经典模型中的共同行动提供绝对保证。

这不是一条“大家永远无法交流”的结论。它是在提醒我们,自己希望系统保证的事情,可能比已经掌握的证据更强。

先站在一个人能看见的地方

本单元的信使实验位于课程下载包的 assets/message-lab/。启动命令与角色邀请说明见该目录 README;默认本机端口 8036。首次可使用预制 V1 信使体验,后面再从 V0 拆开建设。

两位参与者分别打开甲、乙邀请,只看自己的窗口。甲私下持有一个行动窗口编号,乙需要通过消息获知;公共规则不能预先把本轮答案告诉乙。窗口 3、6、9 是模拟标签,不是第几秒或第几封消息。

创建房间时先选“不可靠演练”。如果选择“无故障练习”,就已经改变了消息可能丢失的假设,不能拿它的成功推翻原问题。

协议可以事先共同讨论,具体收件结果却不能靠查看另一窗口获知。若一个人同时打开两侧,就把本轮标成演绎观察,别把全知后的决定算作局部协议的证据。

试着写下一个有限的行动规则

例如,甲收到乙的接受后,再确认一次并选择行动;乙收到对自己接受回执的确认后才行动,否则等待。两人可以先尝试这个规则,也可以提出自己的规则,但要在操作前说明。

发送几封消息,再各自固定行动或等待选择。模拟器不会只在双方同意时才放行;一方选择行动,仍会记录为那一方独立行动。否则,我们早已偷偷借来了一个共同审批者。

两人选择固定或公开期限到达后,才打开全局复盘。对照:消息实际去了哪里,各自当时知道什么,最后依据什么作出了决定。

本次都成功,不代表规则对所有丢失情况都安全。没有成功,也要分清是规则的边界、参与者没有遵守规则,还是别的原因。

最后一封信留下的问题

假设某套规则可以经过有限通信保证协调行动。观察一段使双方实际行动的最短成功消息交换,把最后一条送达改成丢失。

发送者在行动前没有得到新的送达证据,其局部经历没有因此改变。如果接收者因此改变决定,就可能出现不协调;如果仍然都行动,这条消息又不是最短成功交换所必需的。继续分析,最终要回到最初缺少共同计划信息的条件。

这个论证依赖原模型的条件,不能由有限几次网页演练替代。尤其不能让双方初始就无条件知道具体行动计划,再把“无需通信也一起出发”当作解法。

从边界出发,开始建设

现代系统每天仍在传递消息。它们把承诺拆成更清楚的部分:本机接受发送、对端取得完整消息、应用接受请求、某项处理完成。每一步都需要自己的依据。

我们将从一封普通文字开始,逐渐增加编码、消息边界、编号和关联回执。以后再建设重试、寻址、信任、流量与恢复。每加一层,都要问它解决了什么,又没有解决什么。

下一步到 V0:先把一封信送出去。这一次,我们要亲手建设那条路径。