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

从 V1 继续:给下一层一个出现的理由

现在,我们有了两端收发、一份明确的消息格式、可以处理任意分块的接收器,以及能够关联原消息的阶段回执。

这已经是一个能运行的起点。它的不足也变得具体:消息丢了要靠人判断,重复可能留下两份,端点只有固定的甲乙,信任还依赖实验底座的角色约定。

让下一项机制回答一个真实问题

不要因为听过某个技术名词,就立即把它装进系统。先从一次失败或新的用途提出要求:

下一条建设线新问题准备增加的能力
可靠性 R原消息或回执丢失,重复来了怎么办超时、重试、去重与明确的处理语义
寻址 A从两个人扩展到多个接收者,经过谁地址、名称对应、中继与转发规则
信任 T来源是谁,内容能否被改,谁能看认证、完整性与保密,使用成熟机制

这些是下一阶段的建设目标,本轮尚未全部实现。三条线需要共享消息约定,汇合时还要检查:可靠性线接受的 ACK,是否来自认可的来源,是否经过正确路径返回,是否指向正确消息。

本轮的承诺写到哪里

V1 可以在本版格式、固定端点与有限资源条件下还原消息,并把收到的有效回执关联到本地原消息。它没有承诺任意故障下必然送达,没有实现通用自动重试、重启后去重或真实业务“恰好一次”。

底座的角色邀请限制了哪个窗口能读取哪份本地状态;这不能替代现实系统中的身份注册、密钥管理或安全传输。把 from 写成一个名字,仍然不能独立证明那个人是谁。

两军问题也没有被编号和回执推翻。我们选择了能说明范围的有限保证,再用不同机制逐层扩展。

版本交付与反例

保留 V0 和 V1 的对照:V0 怎样回复,V1 新增了什么,哪些疑问仍然存在。交付自己的编解码实现、互操作结果、一条正常往返、一条未得到确认的路径,以及对这两条路径的解释。

再选择一个下一版需求,写下它会新增哪些状态和成本。例如,重试需要什么时候开始、什么时候停止、怎样识别同一消息;队列会占用资源,重复处理可能带来副作用。

这份小需求应能成为下一轮可运行改动的起点,而不是“以后把所有可靠性都做好”的愿望。

仍然用同一个方法看系统

从一封信到一张网络,会出现更多层次。每一层都应有出场理由、可核对的证据和清楚的边界。

你不必一次知道所有协议。现在应当能沿着一封消息指出:它如何被表示、在哪一步等待、什么使它成为完整消息、回执又怎样成为一份有限证据。

如果未来系统说“已送达”,你已经知道可以继续问:哪一端收到了什么,谁给出的确认,这份确认允许我接下来做什么?