一、容错与降级概述

大家好,我是老张。在交易系统这个行当摸爬滚打了十几年,今天咱们聊聊容错与降级。这两个词,说白了就是系统出问题时,怎么让它还能继续干活,别直接躺平。

什么是容错

容错,字面意思就是「容忍错误」。系统里某个组件挂了,但整体功能不受影响,或者影响很小。我习惯把它理解成「系统自带的金钟罩」。

举个例子:你有个订单服务集群,三台机器同时运行。其中一台突然宕机了,另外两台还能继续处理订单。用户完全感知不到异常。这就是容错。

核心要点:容错不是避免错误,而是错误发生后系统依然可用。

我在项目中遇到过一种情况:数据库主库挂了,从库自动接管。但切换过程中有几百毫秒的延迟,部分请求超时了。嗯,这里要注意——容错不是万能的,它只能保证「最终可用」,不是「零中断」。

什么是降级

降级,说白了就是「丢车保帅」。系统压力太大,或者部分功能不可用时,主动放弃一些非核心功能,保证核心功能正常运行。

你想想看,双十一零点,订单量暴增。这时候如果还让用户查历史订单、看商品详情、做个性化推荐,系统肯定扛不住。怎么办?把非核心功能暂时关掉,只保留下单、支付这些核心链路。这就是降级。

个人经验:我曾经在某个大促项目中,把用户头像加载、评论展示、搜索推荐全部降级了。结果核心交易链路扛住了,系统稳稳的。事后复盘,大家一致认为降级策略救了我们一命。

为什么交易系统需要容错降级

交易系统有个特点:高可用、高并发、强一致性。这三个要求放在一起,本身就是个难题。

  • 高可用:系统7×24小时不能停,哪怕半夜三点也得能下单
  • 高并发:瞬间流量可能是平时的几百倍,比如秒杀、抢购
  • 强一致性:钱不能多扣,库存不能超卖,订单状态不能乱

这三个目标互相打架。你追求高可用,就得容忍部分数据不一致;你追求强一致性,性能就会下降。容错和降级,就是在这三者之间找平衡。

我记得有一次,某大厂因为缓存集群故障,导致所有请求都打到数据库。数据库瞬间被打爆,整个交易系统瘫痪了整整20分钟。损失了多少?几千万。如果当时有合理的降级策略,把缓存降级为本地缓存,或者直接限流,结果会完全不同。

避坑指南:我曾经见过一个团队,把所有服务都做了容错,但没做降级。结果某个非核心服务挂了,触发熔断,熔断又导致连锁反应,最后核心链路也崩了。记住:容错和降级要一起用,缺一不可。

核心设计原则

做容错降级设计,我总结了四个原则,都是血泪教训换来的:

原则 说明 我的经验
1. 隔离原则 不同服务、不同模块之间要隔离,一个挂了不影响其他 我曾经用线程池隔离,结果一个慢接口把线程池占满了,其他接口也进不来。后来改用信号量隔离,好多了
2. 快速失败原则 发现异常要尽快返回,别死等 超时设置一定要有。我见过一个接口默认超时30秒,结果用户等得直接关浏览器了
3. 有损服务原则 降级时允许部分功能不可用,但核心功能必须保住 说白了就是「砍掉锦上添花,保住雪中送炭」
4. 可回滚原则 降级策略要能快速恢复,不能降下去就起不来了 我习惯用配置中心控制降级开关,一键降级,一键恢复

这四个原则,我建议你记在心里。每次做设计时,拿这四个原则过一遍,能避免很多坑。

知识体系总览

下面这张图,是我自己画的容错降级知识体系。你看一眼,心里就有数了:

容错与降级 核心设计 容错 • 冗余部署 • 故障转移 • 重试机制 降级 • 功能降级 • 数据降级 • 服务降级 设计原则 • 隔离原则 • 快速失败 • 有损服务 应用场景 • 大促秒杀 • 服务熔断 • 限流保护

这张图把容错降级分成了四个维度:容错、降级、设计原则、应用场景。后面几章,我们会逐个深入讲解。今天先把概念理清楚,后面就好办了。

一个小建议:刚开始接触容错降级时,别想着一步到位。先从最简单的「超时重试」做起,慢慢加上「熔断」「限流」「降级」。我当年就是这么一步步过来的。


公众号:蓝海资料掘金营,微信deep3321