遗漏故障(Omission Failure)
遗漏故障比崩溃故障更隐蔽,也更难处理。
崩溃故障是「节点完全停止响应」,容易检测。遗漏故障是「节点在某些情况下不响应」——间歇性的、难以复现的。一个节点可能刚刚还在正常服务,突然就丢了一批请求,然后又恢复正常。
这才是生产环境最常见的故障模式之一。
遗漏故障的特征
遗漏故障的定义:
- 节点能接收请求,但部分请求无法得到响应
- 故障是间歇性的,不是一直存在
- 可能是发送方、接收方或两者的网络问题
- 难以复现,难以诊断
遗漏故障的成因
遗漏故障的子类型
发送遗漏(Send Omission)
节点发送了消息,但消息未进入网络:
接收遗漏(Receive Omission)
消息到达了节点,但节点未能处理或响应:
遗漏故障的检测
超时检测
这是检测遗漏故障最基本的方式:
TimeoutDetection.java
重试 + 幂等
遗漏故障最麻烦的是不知道请求是否被服务器处理了:
RetryWithIdempotency.java
遗漏故障与超时设置
超时设置是应对遗漏故障的关键。设置太短会产生很多误判,设置太长会拖慢故障检测速度。
超时计算公式
TimeoutCalculator.java
遗漏故障的特殊挑战
挑战一:不知道请求是否被处理
这是遗漏故障最大的挑战:
解决方案:幂等 + 重试次数限制 + 消息队列
挑战二:间歇性难以定位
遗漏故障可能是网络问题,可能是服务端问题,可能是客户端问题,定位困难。
解决方案:全链路追踪 + 细粒度监控
挑战三:触发重试风暴
大量客户端同时超时,同时重试,可能压垮服务端。
解决方案:
JitteredRetry.java
遗漏故障与崩溃故障的关系
遗漏故障往往是崩溃故障的前兆:
很多「服务器突然崩溃」的事故,根源是之前被忽视的遗漏故障逐渐积累,最终压垮了系统。
本章总结
核心要点:
- 遗漏故障是间歇性的:部分请求丢失,难以检测和复现
- 超时是检测遗漏故障的主要方式:但超时设置要合理
- 不知道请求是否被处理是最头疼的问题:幂等设计是核心解决方案
- 遗漏故障可能引发重试风暴:添加随机抖动避免
- 遗漏故障往往是崩溃故障的前兆:间歇性问题不处理会积累成大故障
理解了遗漏故障,接下来我们看最复杂的故障类型:拜占庭故障。