Fault Tolerance: 容错

Fault tolerance(容错)指的是:系统在部分组件出现故障时,仍能继续提供服务(哪怕是降级的服务),而不是直接整体瘫痪。它的出发点是承认「故障一定会发生」——硬件会坏、网络会断、进程会崩——所以与其指望不出错,不如让系统在出错时还能扛住。 容错与 fail-fast 的关系 这两个概念常被放在一起,但取向不同,而且并不矛盾: fail-fast(快速失败):一检测到不该出现的状态就立即、显眼地失败,把错误暴露在离源头最近的地方。 fault tolerance(容错):出错时尽量不让整个系统垮掉,通过冗余、隔离、降级等手段继续提供服务。 实际系统往往两者同时用、用在不同层面:单个组件内部对非法状态 fail-fast(尽早抛错、不带病运行),而系统整体对组件级故障容错(一个实例挂了还有别的顶上)。换句话说,「让局部快速失败」恰恰是「让整体可容错」的前提——故障被快速隔离出来,才不会扩散成全局问题。 常见的容错手段 容错不是单一技术,而是一组配合使用的做法: 冗余 / 副本(redundancy / replication):关键组件多部署几份,单点坏了还有备份。是容错的基础。 失效转移(failover):主组件故障时自动切到备用组件,对外尽量无感。 优雅降级(graceful degradation):非核心功能出问题时,关掉或简化它,保住核心链路,而不是整体报错。 重试与超时(retry / timeout):对偶发、可恢复的失败(网络抖动等)做有限重试,并用超时避免无限等待。 熔断与隔离(circuit breaker / bulkhead):下游故障时快速失败、暂时切断调用,防止故障沿调用链扩散、拖垮上游;用隔离把故障限制在局部。 拜占庭容错(BFT):更强的一类容错,能在部分节点发送错误甚至恶意信息时仍达成一致,多见于分布式共识、区块链。 微服务语境下的「服务容错」(熔断、隔离、限流、降级、超时)可参考 微服务 一文;Actor 模型的「任其崩溃(let it crash)」则是另一种思路——不在每处做防御式校验,而是让监督者在崩溃后重建。 容错 ≠ 高可用,但服务于它 容错是手段,高可用(high availability)是目标之一。通过容错让单点故障不影响整体服务,正是为了达成更高的可用性(更短的中断、更小的影响范围)。衡量容错切换效果常用的 RTO / RPO,见 failover。 边界:容错不是无限兜底 容错有成本:冗余要多花机器,复制要付出一致性 / 性能代价(参见 CAP 里 C 与 A 的取舍)。不是所有系统都需要、也不是所有故障都值得容错。 别把错误吞掉:容错是「继续提供服务」,不是「假装没出错」。被容错处理掉的故障仍要记录、告警、可观测,否则就成了「静默失败」——问题被盖住、没人知道,反而更糟。 区分该容忍的和该暴露的:对可预期、可恢复的外部故障(网络、下游不可用)做容错;对「程序员的错误 / 不该发生的内部状态」则应 fail-fast,越早暴露越好。 一句话:fault tolerance 关心「出错时系统还能不能用」,靠的是冗余、隔离、降级这些手段把故障的影响范围压下去;它和 fail-fast「尽早暴露错误」在不同层面配合,共同支撑系统的可用性。

Created 30306-06-30 · Updated 30306-06-30 · 1 min · 63 words · -

Failover / Failfast / Failback / Failsafe: 四个故障处理术语

这四个词长得像、也容易混,但讲的是「系统出故障时怎么应对」的不同侧面。下面把它们放在一起做个简单区分。 Failover:失效转移 / 故障转移 当正在工作的主组件出现异常时,把它的职责切换到备用组件,让对外服务尽量不受影响。要点是有主有备,主故障时备能顶上、并被提升为新的主。 典型例子是数据库主从:正在使用的主库挂了,就把备库切为主库继续提供服务。理想情况下用户完全感知不到这次切换。衡量切换效果常用两个指标: RTO(Recovery Time Objective):从故障到服务恢复需要多长时间。这段时间里服务通常是不可用的,用户感知到的是中断而不只是变慢,所以越接近 0 越好。 RPO(Recovery Point Objective):能恢复到故障前哪一刻,也就是最多会丢多少数据。它不是一个固定的量级,取决于数据保护方式:同步复制可做到 RPO ≈ 0(不丢数据,但成本高);异步复制一般是秒级到分钟级;定期快照 / 备份则是分钟级到小时级(每天备一次,最坏丢近一天)。换句话说,秒级和小时级都可能,取决于你用哪种复制 / 备份策略以及业务能容忍丢多少。 Failfast:快速失败 一旦检测到不该出现的状态,就立即、显眼地失败,把错误暴露在离源头最近的地方,而不是带着错误继续运行、之后在别处以奇怪的方式崩掉。它和 fault-tolerant(容错)是相对的取向。 一个常见例子是 Java 集合的 fail-fast 迭代器:当一个线程在遍历集合时,集合内容被其他线程改动,遍历线程会立刻抛出 ConcurrentModificationException,而不是返回不可预期的结果。 fail-fast 作为一条通用的软件工程原则(不止集合迭代器),单独展开在 Fail-Fast 快速失败 一文。 Failback:失效自动恢复 failover 之后的「回切」。当原来的主组件修复、重新可用后,把网络资源和服务从备用系统切回原主系统的过程。常见于需要临时维护主机、把流量先转到备用系统、维护完再切回的场景。 Failsafe:失效安全 即使发生故障,也尽量不造成伤害、或把伤害降到最低。一个形象的例子是红绿灯的冲突监测模块:当检测到错误或冲突的信号时,让整个路口进入闪烁警示模式,而不是把所有方向都显示为绿灯。 一句话区分 failover:主挂了,备顶上,继续服务。 failback:主修好了,再切回去。 failfast:出错就立刻停下报错,别硬撑。 failsafe:出错也要保证安全、把伤害降到最小。 failover / failback 关注的是「服务不中断」(可用性、容错),failfast / failsafe 关注的是「出错时的行为」——一个偏向尽早暴露,一个偏向兜底保护。 参考 失效转移、快速失败等概念(CSDN) https://blog.csdn.net/u013699827/article/details/73251649 维护记录 时间 修改内容 原因 2026-06-30 从 inbox/ 移到 pattern/;改写为自有表述、重排四个术语并加「一句话区分」;分类由 inbox 改为 development,标签更新为 fault-tolerance/high-availability/Pattern/remix/AI-assisted;新增到 fail-fast 的内链 原在未分类 inbox、内容为转载片段,整理归类并提升可读性 2026-06-30 RTO 说明改为强调「服务中断」而非延迟;RPO 补充其量级取决于复制 / 备份策略(同步 ≈0、异步秒/分钟级、备份分钟/小时级),不是固定小时级 澄清 RTO/RPO 含义,纠正「RPO 固定某量级」的误解

Created 6066-07-06 · Updated 30306-06-30 · 1 min · 83 words · -