【读书活动感悟分享】《SRE Google运维解密》第二十二章-处理连锁故障_文章

【读书活动感悟分享】《SRE Google运维解密》第二十二章-处理连锁故障

李国强
发表于 2025-11-04 15:55:10




一、核心思想:系统的目标不是“永不失败”,而是“可控退化”

这章最核心的启发是:

系统过载不是异常,而是必然。关键是系统如何优雅地拒绝或延迟请求。

在传统运维思维中,我们常常想着“要防止系统过载”;

但SRE的思维是:“系统必然会过载,如何让它在过载时仍然有序”。

心得:

系统的目标从来不是“永不失败”,而是“在失败时仍能保持可控与优雅”。 这章以极高的工程深度探讨了当系统进入高负载甚至过载状态时,如何通过工程手段防止“连锁反应式崩溃”。它让我重新思考了“可靠性”这个词的真正含义。

把“过载”视作系统的自然状态,而不是事故;

互联网开发与传统IT系统的区别就是互联网应用承载的压力是增长,有时甚至是非线性的几何级增长。系统开发初期基于成本和时间,不可能兼容高压力,但是随着业务增长,负载必然会逐渐提高。 对特来电的来说,整体订单从百万到千万到亿到几十亿,日均百万的请求,订单系统也不是一开始就能承载如此大的数据量。同时现代的分布式系统的依赖更多的中间件与模块以及基础设施,依赖越多,哪怕一个组件出问题概率是万分之一,那么整体出现问题的概率也是非常高。可靠性不是不出问题,而是避免出现问题导致整个系统的崩溃。

系统应当具备“自我保护”与“优雅退化”机制;

人为干预(例如紧急限流)不如系统自动响应。

⚙ 二、技术策略的反思与启发

这章列举了多种应对连锁过载的工程手段,每一个都值得在实际系统里反思。

⃣ 请求级的保护:拒绝部分流量,而不是全部拖慢

SRE强调:过载时最坏的不是请求被拒绝,而是所有请求都超时。

比如Nginx/Envoy/负载均衡器中,通过“优先级丢弃”机制让系统保持核心服务可用。

心得:

“请求失败是可以接受的,全系统锁死是不可接受的。

从两方面来说:

1 这就是需要系统设计需要划分出核心和非核心的服务链路,链路需要在设计上做到隔离或者对依赖降级。

2 在自动化的应对失灵或者比较欠缺,对于SRE就需要预先制定策略,哪些中间数据是可舍弃的——比如为了避免MQ服务的队列积压,某些非核心队列可以情空,哪些服务可以临时停止服务以减少对数据库或者其他服务的压力(比如某些补偿处理或者数据核对处理的可以临时暂停)。

⃣ 上游限流(Client-side throttling)

Google提倡在调用方限流,而不是只依赖被调用方的防御机制。

比如:

每个客户端对被调用服务的并发数、QPS做限制;

调用失败时采用指数退避重试(Exponential Backoff)。

心得:

“限流责任应当分布式,而非集中式。系统的可靠性取决于调用者的克制。”

特来电限流目前通过统一配置的SG,MAC和HSF的限流。实现调用方和被调用方的限流。这是我们做的比较好的一方面。

⃣ 拒绝与降级的策略要智能化

书中提到的例子:

“部分请求优先”(例如健康检查请求、支付确认高优先级);

“负载感知队列”;

“提前拒绝”,防止排队导致雪崩。

心得:

在设计降级策略时,不仅要考虑“拒绝谁”,还要考虑“保谁”。

1 还是跟上面说的一样,核心链路的问题,这个除了出运维梗要系统设计之初进行考虑

2 给SRE运维留下抓手,比如可以抛弃的处理,非核心链路可以通过数据清理,通过配置项目启动/暂停来避免引发高负载。

⃣ 超时与重试机制是双刃剑

书中特别强调了重试风暴(retry storm):

当下游变慢时,上游的重试会进一步放大负载,形成“连锁过载”;

解决办法是:带抖动的退避重试、全局重试预算(Retry Budget)。

心得:

“过载往往不是因为请求太多,而是因为重试太多。”

这里我觉得是需要重点关注,互联网分布式应用由于的不确定大大增加,超时或者异常时重拾的不可缺少的实现方式,但是在下游服务紧张时,大量的服务重试会进一步恶化。比如当前服务过载后,在处理完压力后就会恢复正常,但是由于调用方不断重试,反而造成服务请求尽量积压,造成问题带来的时间损失进一步的增长,一般情况我们需要一个重拾策略是固定次数的。而不是基于整个调用方或者调用进程的整体估计,这个地方是需要学习的

🧠 三、从SRE角度的工程哲学

系统稳定性不能依赖单点限流器或防火墙。

要让每个组件都具备一定的“免疫系统”,这是系统弹性的核心。

容量规划永远无法完全避免过载。

因为真实世界中总会有“黑天鹅”流量,比如突发新闻、病毒传播等。

关键是:在超出设计容量时,系统依然能部分生存。

链路依赖要尽可能短、可监控。

连锁过载往往来自“依赖链过长 + 无隔离”。

所以Google主张每层服务都有独立的负载保护机制和超时控制。

🧰 四、结合实际运维经验的反思(SRE视角)

比如在我们常见的微服务架构中:

场景 问题 SRE视角解决方案

某个下游慢查询导致全链路阻塞 调用方不断等待超时,线程池被占满 设置超时 + 快速失败 + 降级返回

上游系统重试太频繁 导致QPS放大10倍,雪崩 实施重试预算、退避策略

无区分限流 高优先级流量也被拒绝 建立多级优先队列、资源隔离

所有请求都排队 延迟累积导致超时风暴 采用排队上限与提前拒绝机制

心得:

“稳定性不是靠资源冗余堆出来的,而是靠负载控制机制设计出来的。”

💬 五、个人总结一句话

处理连锁过载的关键,是让系统懂得“何时说不”。

系统的可靠性,不仅体现在它能承受多少流量,更体现在——

当承受不住时,它是否还能保持“优雅与理智”。




93 0

上一篇:11
评论


意见反馈