好的实现不会依赖用户反复刷新碰运气,而会让每个阶段有明确输入、输出、超时和终态。 熔断统计必须针对同质调用,失败率和慢调用率在最小样本后才有意义。open 时快速失败,half-open 只放少量探测并防止所有实例同步探测。
分布式正确性来自幂等键、租约、单调版本和可对账事实,而不是假设请求只到一次。超时代表结果未知,调用方不能未经确认就把它解释成失败。
先定义系统契约
这项能力横跨客户端、网络与服务端,局部最优很容易制造全局故障。工程决策需要同时约束两端行为、持久化事实和运维预算。
- 连接池并发限制先隔离资源,调用截止时间限制单次损耗,熔断器根据窗口打开;降级响应明确哪些功能仍安全可用。
- 先定义正常、降级、取消和失败四类终态,再让界面、存储与指标消费同一状态。
- 资源释放是协议的一部分:定时器、句柄、队列和临时数据都要在终态中可重复清理。
“熔断器不是万能开关:实时链路中的超时、隔离与半开探测”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
哪些情况会破坏契约
生产问题往往发生在两个正确动作同时到达时。需要逐条检查迟到消息、重复执行、资源耗尽和版本交叉,而不是只补当前堆栈显示的那一行。
- 把用户 4xx 算作依赖失败会错误熔断;所有区域共享一个 breaker 又会让局部故障关闭全球服务。
- 旧响应在新任务建立后迟到,如果没有版本隔离,会把健康状态覆盖成失败或再次启动已取消工作。
- 降级路径从未压测,主路径故障时所有流量同时进入更慢、更昂贵的后备方案。
如何逐条验证契约
测试不能以“最后成功了”结束。还要测量经历了多少次副作用、等待多久、是否泄露内容,以及失败后再次执行能否从干净基线开始。
- 注入慢响应、连接拒绝、部分 5xx 与业务 4xx,观察并发上限、状态转换、半开探测和恢复后尾延迟。
- 连续执行一百次开始、失败、重试和取消,检查句柄、监听器、队列及临时数据回到基线。
- 分别覆盖直连、中转、弱网、后台标签页和移动端,报告不能只给平均值或一次成功截图。
当实现能够安全降级、重复执行不产生额外副作用、故障指标早于投诉出现时,这项能力才算具备长期维护价值。