知识卡片
网络故障下请求丢失节点故障与响应丢失无法区分
内容
互联网和数据中心内部网络大多是异步分组网络:一个节点能向另一个节点发消息,但网络 不保证消息何时到达、甚至是否到达。如果你发了请求却迟迟等不到响应,可能的原因有 一长串:请求本身丢了、请求还在排队稍后才会送达、远程节点已经彻底挂了、远程节点 只是暂时卡住(比如遇到长时间GC暂停)稍后会恢复响应、远程节点已经处理完请求但响应 在回传路上丢了、或者响应被延迟稍后才会到——发送方唯一确切知道的信息只是”我还没 收到响应”,而这些截然不同的原因在异步网络里表现得一模一样,根本无法区分。发送方 甚至连”请求到底有没有真正发出去”都无法确认,唯一能验证的手段是让接收方发一个响应 回来,但这个响应本身又可能丢失或延迟——陷入了同样的不确定性循环。应对这个问题的 常规做法是超时:等一段时间后放弃、认定响应不会来了;但即便触发了超时,你依然不 知道远程节点到底有没有收到并处理过那个请求——它可能仍在某处排队,即使发送方已经 放弃了这次请求,它还是可能被真正送达并执行。这个不可区分性是整个分布式系统容错 设计要面对的根本性认知限制:任何依赖网络往返来判断远程状态的机制,天生就带着这层 不确定性,无法被消除、只能被工程上妥善处理(比如通过幂等设计让”重复执行”变得安全)。
参考来源
- 位置:《数据密集型应用系统设计》第八章《分布式系统的麻烦》"不可靠的网络"(源文件:
_epub-src/ch8_split_000.html)
- 结论依据:原文列出请求丢失、节点故障、响应丢失、响应延迟等多种可能导致"没收到
响应"的原因,说明发送方唯一拥有的信息是尚未收到响应本身,这些情况在异步网络中
难以区分,并说明超时后依然不知道远程节点是否真正处理了请求,直接支撑本卡片结论。
- 原始内容:如果您发送请求并期待响应,则很多事情可能会出错……这些问题在异步网络
中难以区分:您所拥有的唯一信息是,您尚未收到响应……但是,当发生超时时,你仍然
不知道远程节点是否收到了请求。