
今年春天给一家电商客户救火算是把限流这件事彻底想明白了。他们的促销活动定在晚上八点八点零一分我手机就开始震——不是好消息是整条链路在报警。下单接口的 P99 延迟百分之九十九的请求都能在设定时间内返回这是衡量服务健康最常用的一个指标从平时的 300 毫秒一路飙到八秒订单服务把消息队列Message Queue用来削峰填谷的异步缓冲塞爆接着数据库连接池被拖垮最后连首页都开始转圈。我人还没到机房群里已经炸成一锅粥了。他们第一反应是加机器。我瞄了一眼监控就摇头机器加得再快也追不上雪崩往下倒的速度。真正的问题不是资源不够是整条链路上任何一个环节都没有装刹车。说到这我插一句闲话以前我自己也干过这种蠢事——服务一抖就疯狂加节点加到半夜发现全是白加因为根子根本不在算力上。后来学乖了先看依赖再谈扩容。我让他们的 Agent 帮我把整条链路的调用关系一次性拉出来一眼就看明白了订单服务对库存服务的调用是同步的库存一个超时订单服务就得干等着线程池很快占满然后像多米诺骨牌一样往下倒。这叫什么这叫级联故障Cascading Failure不是某一台机器挂了是整条链路陪葬。接下来我干了几件事都是给链路装上闸门的活。给每个关键接口都加了限流Rate Limiting说白了就是给水管装阀门流量再大进水管就那么大多余的请求要么排队要么干脆快速失败fail fast宁可干脆利落地拒绝也不让它把线程卡死。给下游调用加了熔断Circuit Breaker就像电路里的保险丝下游连续报错到一个阈值直接啪一声断开不再傻乎乎地把流量全送过去送死。最后给非核心功能做了降级Degradation首页推荐刷不出来就返回一个缓存版本总不能因为一个推荐接口把整站拖死。这里我想说一个特别反直觉的地方。很多人以为限流是把用户拒之门外其实不是。它做的是把雪崩换成排队——用户最多等一等或者收到一句人太多了稍后再试总好过整个系统白屏让你啥都买不了。你想想是让十万人排队划算还是让十万人集体转圈圈划算前者用户最多抱怨两句后者直接把你口碑都带崩了。Agent 在这趟活里帮我省了特别多功夫。以前我在生产环境调这些参数全靠经验和手感一个阈值一个阈值地试试错了还得回滚。现在让 Agent 先去压测环境模拟流量把限流阈值、熔断的失败率阈值、熔断后的恢复时间这些都算好再带着数据上生产我心里踏实多了。它甚至还能在我改完配置之后自动对比一下改动前后的告警曲线告诉我这次调整是不是真的有效。不过我得泼一盆冷水。限流熔断不是装上去就一劳永逸这玩意儿最难的恰恰是参数本身。限流阈值设得太高等于没设雪崩照样来设得太低又容易把正常用户误伤尤其是那种看起来很平、突然冒一个尖峰的流量。我见过最尴尬的一次限流阈值设保守了结果把自家内部的调用也一起限住了线上流量直接掉了一半。客户还以为是没人买其实是自己把自己给闸了那叫一个哭笑不得。那谁适合搞这套呢但凡一到活动就心慌的、调用链超过十个服务、动不动就一个人半夜守着监控的团队真的很需要。谁不适合流量本来就不大、单机就能扛住、链路也简单的先别急着上全套把日志和监控做扎实了再说别本末倒置。限流熔断是给你兜底的不是给你充门面的。还有个小插曲。我这次去救火客户运维大哥全程紧张兮兮问我要不要开个会统一指挥。我说不用先让系统自己把闸门管住我们再慢慢看日志。结果那天晚上除了开头那二十分钟后面平稳得反常他自己都懵了问我这就算搞定了我说对啊稳定性的目标从来不是不报警而是报警了你也能从容应对不用慌慌张张去救火。对了差点忘了说——那天最后我还让他们把 Agent 的巡检配置留在了现场以后每天自动过一遍这些闸门参数看有没有被改走样。这可是后面好几篇的伏笔。你说呢你们线上现在有几道闸门还是全靠人肉盯着出了事才想起来临时加下一篇我打算聊聊怎么让 Agent 自动帮你巡检这些限流熔断的配置——不是配一次就完事是让它持续盯着你的系统状态参数一旦漂移就自己报警。评论区聊聊你们的雪崩现场吧我很好奇大家都是怎么活过来的。