连载中 17/20

自适应保护:让系统自己拿主意

2026-07-15 · 4290 阅读 · 0 评论 · 0 赞

静态阈值的宿命

回看限流篇配的每一个阈值:QPS 5000、并发 200、线程 20——全是人拍的。拍小了,业务正常增长就误杀;拍大了,形同虚设;每次扩容、每次下游改造,都得重新拍一遍。容量的本质是 f(机器数、依赖 RT、数据量、缓存命中率),每个因子都在变,静态数字注定追不上。自适应保护的思路换了方向:不再猜测容量,直接测量容量

BBR:用测量代替猜测

灵感来自 TCP 的 BBR 拥塞控制:不预测网络能扛多少,而是持续测量——测出瓶颈带宽与往返时延,在途数据量超过「带宽 × 时延」就收手。Google 把它搬进了 gRPC 的自适应限流,Sentinel 的系统自适应规则同源:用最近观测到的容量,约束当前的负载

两个关键测量值:maxQps——最近窗口观测到的最大 QPS;minRt——最近窗口里最小的平均 RT(RT 最小时系统最轻松,那是最真实的单请求容量)。两者相乘,就是系统能稳住的最大并发。

系统自适应限流

// Sentinel 系统自适应规则的 BBR 思路
long maxQps   = 观测窗口内最大 QPS;       // 测出来的
long minRt    = 观测窗口内最小平均 RT;     // 测出来的
long capacity = maxQps * minRt / 1000;    // 稳住所需的最大并发

if (当前并发处理中的请求数 > capacity) {
    reject();   // 排队的先处理完,新请求少进
}

与固定阈值的区别在于:容量数字是「刚测的」——机器扩容后 maxQps 自动变大,下游变慢后 minRt 自动变小(能稳住的并发变少),阈值跟着现实走,不再需要人追着改。

自适应的三层

自适应思想在稳定性体系里到处都是:系统级——Sentinel 系统规则按 load、CPU、并发自动限流;熔断级——半开探测成功率高就延长观察、失败率高就缩短休眠,参数自己调自己;资源级——K8s HPA 按 CPU 或自定义指标自动扩缩容,容量不够就加机器,是最粗也最有效的自适应。弹性扩容解决「不够用」,自适应限流解决「来了也接不住」,两者互补。

自适应不是银弹

三个局限要心里有数:冷启动误判——服务刚起流量小,测出的 maxQps 偏低,需要预热期(还记得限流篇的 WarmUp 吗);突发滞后——测量天然滞后于现实,瞬时洪峰先打到系统,自适应阈值才反应过来,所以限流、熔断的静态防线仍然要留;黑天鹅不管——自适应消化正常波动,缓存雪崩、主从切换这种天塌下来,还是要预案与降级。

分工一句话:静态阈值挡已知洪峰,自适应机制消化正常波动,预案兜底未知灾难

单点的保护机制装齐了,理论闭环了——但没人真正知道它们扛不扛得住真实洪水。容量上限是多少?哪层先垮?预案真的生效吗?压力得真打进来才知道。下篇聊全链路压测:洪水来之前,先演一遍。

503

10 年全栈工程师 · 503咖啡馆主理人

#自适应保护#BBR#系统自适应限流#弹性扩容#动态阈值#预热

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 5 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞