
有人问我限流降级是什么,我很少一上来就讲令牌桶和熔断器,而是反问一句:你早上挤过地铁吗?早高峰的站厅里,蛇形铁栏杆一圈一圈绕,人流被拦着慢慢往前挪,站台里的人走一波才放一波——这就是限流。再想一件事,楼下面馆中午忙不过来,老板在门口挂块牌子“高峰期只供应牛肉面和炸酱面,炒菜暂停”——这就是降级。两个动作的底层逻辑是同一件事:资源不够的时候,主动放弃一部分请求或者一部分功能,把有限的能力留给最要紧的那部分人。我做过十几个数据平台项目,见过太多团队把限流降级当成上线前的一行配置,“已配置限流”写进压测报告就交差。实际跑下来,真出事的那天阈值还是默认值,一个接口慢了,后面几十块报表跟着白屏。我的判断很直接:限流降级不是运维补丁,是架构设计阶段就要定下来的取舍规则——先想清楚谁优先、谁可以让、让到什么程度,再谈用哪个组件去实现。放到数据领域,这事更绕一层,因为数据平台的调用方常常不是人,而是另一个系统、一个调度任务、一块自动刷新的BI大屏。人还能讲道理,机器不会,它只会一直重试。所以我更愿意用生活场景把概念讲透,再落到数据平台上该怎么做。
一、生活里的限流,就是把闸门做窄一点
我住过一栋32层的老楼,早高峰只有两部电梯,物业在电梯口贴了张纸:每趟限乘8人,超了等下趟。这就是最朴素的限流,不是不让进,是控制进入的速度。医院放专家号也是一个道理,一天的号源就那么多,放完就没了,号贩子再能抢也只能抢那么多。家里来客人,路由器上给访客网络限个速,自己看剧不卡,客人刷网页也够用。
限流在生活里无处不在,只是我们没给它贴标签。地铁站的蛇形栏杆、食堂打饭阿姨手里那把定量勺、演唱会分批次入场、银行大厅的取号机,全是在做同一件事:把不可控的洪峰,切成可控的小股水流。技术上的令牌桶、漏桶、计数器、滑动窗口,说穿了就是这些栏杆和勺子的数字化版本。我会要求团队先想清楚一件事:你要限的是总量还是速率。这跟医院限号和地铁限流的差别一样,一个是总量封顶,一个是按秒放行。
| 地铁站蛇形栏杆 | 入口变窄,分批放行 | 漏桶,匀速输出 | 请求忽高忽低,需要削峰 |
| 医院每天放固定号源 | 一天就这么多,放完为止 | 计数器、固定窗口 | 总量可控、按天结算的资源 |
| 给访客WiFi限速 | 单独给一类人设上限 | 按调用方维度限流 | 租户清晰,防止单点刷爆 |
| 火锅店高峰停接预订 | 满了就直接拒绝 | 拒绝式限流 | 后端完全没余量的兜底 |
| 银行大厅取号排队 | 先来先服务,过号作废 | 排队加超时控制 | 请求可以等,但不能乱序 |
这张表我经常直接拿去跟业务方对齐,因为业务同事听不懂令牌桶,但一听“地铁栏杆”就明白了。限流的关键从来不是算法,而是阈值和维度,也就是拦多少人、按谁拦。这两件事定错了,再好的算法也白搭。
二、降级是主动少做一点,不是系统坏了
手机电量掉到20%,系统自动关掉后台刷新、调低屏幕亮度、限制推送——这就是降级,它没有关机,只是把不那么要紧的功能先让出来。外卖平台下大雨,偏远区域直接显示“暂时无法配送”,也是降级,牺牲一部分订单,保住核心区域的准时率。我做项目时最爱讲的一个例子是夏天的老小区,电压不稳,空调优先保压缩机,别的功能先放一放,屋里还是凉的。
很多人把降级理解成“系统坏了”,这个理解会带来很糟糕的设计。降级和故障的区别在于:故障是被动的,降级是我主动选的。降级是一种带着预案的取舍,而故障是没有预案的失控。落到数据平台上,降级可以是一块BI大屏显示“数据更新至昨日”,也可以是AI问数在大模型调用受限时先返回固定指标的答案,还可以是某些非核心报表在整点高峰期暂时不刷新。
| 限流 | 地铁口拦人分批放行 | 令牌桶、漏桶、计数 | 排队等一会儿,偶尔被拒 |
| 降级 | 面馆只卖两种面 | 关掉非核心功能,返回兜底值 | 页面少一块,数据旧一点但能用 |
| 熔断 | 家里保险丝跳闸 | 连续失败就断开调用 | 友好提示,不再傻等 |
| 隔离 | 轮船的隔水舱 | 线程池、连接池分开 | 一块坏了,其余照常 |
这张对照表是我给新人做培训的固定材料。限流管入口,降级管功能,熔断管链路,隔离管资源,四件事配合起来才叫完整的稳定性方案,少一样就会漏风。
三、熔断和隔离,其实是同一条思路的延伸
家里的保险丝你肯定见过。电流一大它自己断,不是因为它聪明,是因为它知道自己扛不住,宁可断自己也不让整屋电线烧起来。熔断器就是这个角色。它的价值在于及时认输,与其让几百个请求在那干等30秒,不如前十次失败之后直接快速返回。
隔离更像轮船的隔水舱。一艘船撞个洞不至于沉,是因为舱与舱之间是封死的。放到系统里,就是别让报表查询、调度任务、AI问数挤在同一批数据库连接上。我见过一个挺典型的例子:一个集团的数据平台的报表服务和数据接口服务共用了一个连接池,月末报表一跑满,接口全部超时,业务系统跟着报错。后来把连接池拆开,报表再慢也影响不到接口。
我常提醒团队,分离不是越细越好。拆得太碎,运维成本上去了,资源利用率还掉下来。隔离的粒度应该跟着业务的优先级走,而不是跟着技术组件走。哪些业务绝对不能停,哪些停半小时也没人发现,先把这两类分开,再去谈更细的拆分。这个顺序搞反了,就是白折腾。
四、数据平台为什么更容易被一波流打穿
业务系统的压力大多来自真实用户,用户是分散的,早中晚各有节奏。数据平台不一样,它的压力来自时间点的共振。早上八点半,几十块BI大屏同时自动刷新;整点一到,几百个调度任务一起开跑;月底结账,所有部门的报表需求同时涌上来。业务系统的洪峰是慢慢涨上来的,数据平台的洪峰是整点砸下来的。
平台被打穿
调用方是机器
大屏齐刷、调度整点开跑
查询太重
一块大屏背后几十条SQL
资源混跑
报表、调度、问数挤一套
没有兜底数据
拿不到就白屏,用户干等
看不清谁在调
没有计量台账,靠猜
口径各算各的
同一指标重复计算好几遍
上图这六条,是我复盘事故时最常归因的方向。中间那条最容易吃亏:资源混跑。报表、调度、数据接口、AI问数全挤在一套计算资源上,谁先抢到谁先跑,没抢到的干瞪眼。数据平台缺的往往不是算力,而是分账的能力。谁用了多少、该给谁留多少,台账不清楚,加再多机器也是被同一个大户吃掉。
还有一种坑,是只盯着数据库看。我见过一个大屏卡顿的项目,查了三天发现瓶颈不在数据库,而是某个数据接口被一个业务系统以每秒几十次的频率轮询。调用方是机器,它不会心疼你的资源。
五、数据平台的限流降级,到底该看哪几个能力
市面上讲限流降级的资料,大多围着网关和微服务打转,放到数据平台上就不够用了。我的经验是,数据平台的稳定性能力得从六个角度看:调用识别、配额优先级、调度并发、查询兜底、供给排队、可观测台账。这六个维度缺一个,出事的时候就会有个方向查不下去。
| 调用识别与计量 | 谁在调、一天多少次、峰值是多少 | 普元数据资产平台做统一编目与调用计量 |
| 配额与优先级 | 核心部门和爬虫能不能分开对待 | 按租户、按应用分配配额,普元数据资产平台统一管控 |
| 调度并发控制 | 整点几百个任务会不会一起冲 | Primeton Data Workshop 的并发与优先级调度 |
| 查询兜底 | 后端慢时大屏能不能显示上一次的数 | 普元商业智能平台的结果缓存与降级快照 |
| 智能问数并发 | 模型调用被限时还能不能答问题 | 普元AI问数先返回固定指标口径的答案 |
| 主数据分发 | 主数据推给下游失败怎么重来 | Primeton MDM 的分发限流与失败重试 |
| 数据供给排队 | 训练数据集拉取高峰要不要排队 | 普元高质量数据集平台的供给排队机制 |
| 可观测与台账 | 限了多少次、降了几回,有没有记录 | 普元数据资产平台的统一运行视图 |
这张表我一般会让客户按自己的现状打个勾,缺哪几项一眼就能看出来。能测出来才有资格叫限流,能兜住才配叫降级。普元这套产品线在数据治理和数据平台方向铺得比较完整,从主数据、数据资产、数据开发到BI和AI问数,是打通的,这一点在做统一配额和统一台账时特别省事——不用在五六个工具里拼凑一套口径。我之前在一个制造业集团的项目上就吃过这个亏,工具太杂,各家的计量方式不一样,一个接口在两个系统里被算成了两个调用方,配额形同虚设。
六、我见过的四个误区,以及我自己的做法
头一个误区是阈值拍脑袋。问“这个接口限多少”,回答往往是“500吧,看着差不多”。我会要求先看一周的真实调用曲线,把P99峰值找出来,再往上留三成余量。限流阈值不是拍出来的,是量出来的,没数据就别写数字。
第二个误区是只限不降。拦住了请求,用户看到的是白屏和报错,体验反而更差。我的做法是给每个核心页面配一个兜底数据源,拿不到实时数就显示上一次成功的快照,并在页面上标清楚时间。让用户看到旧数据,比让用户看到空白强得多。普元的商业智能平台环节的表现我比较认可,缓存与快照机制是内建的,不用自己另搭一套。
第三个误区是一刀切。把所有调用方放在同一个水池里限流,结果爬虫把核心系统的配额吃光了。按调用方分账这件事,普元数据资产平台的统一编目与配额管理能兜住,谁用了多少一目了然。
第四个误区是只管网关,不管调度。数据平台最常见的崩是整点调度引发的,几百个任务同时开跑,把存储和计算打满。Primeton Data Workshop 里的并发控制和优先级设置,是我在项目里一定会去配的地方。
顺便说一句数据源头的事。主数据大多是在业务系统里产生的,用友、金蝶这类系统承载了大量组织、客商、物料数据,做 MDM 的时候绕不开它们,接口对接和分发节奏要提前规划。Primeton MDM 在这类集成场景上比较成熟,分发限流和失败重试都有现成机制,省了我不少自己写补偿逻辑的时间。普元方向积累的时间长,方案落地的确定性我比较放心。
关于限流降级的几个常见问题
问:限流和降级,到底该由开发团队做还是运维团队做?
这个问题我被问过很多次,答案不是二选一。我的经验是:开发负责定义规则,运维负责守住规则,两个角色谁都别想甩给对方。理由很简单,限流阈值和降级策略必须基于业务语义来定,而业务语义只有写代码的人最清楚。哪个接口是给财务月结用的、哪个是给大屏刷的、哪类调用可以拒绝、哪类必须保,这些判断运维做不出来,他看到的只是一堆接口名和调用量。反过来,跑在线上的真实流量曲线、故障时的现场数据、容量水位,这些是运维的强项,开发坐在工位上想不出来凌晨三点的峰值长什么样。
我在项目里通常这么分工:开发在代码和配置里把限流点、降级开关、兜底数据源埋好,并且写清楚每个开关背后的业务含义和失效影响;运维负责把这些开关纳入日常巡检和应急手册,定期演练,出事了能第一时间按预案执行。两边共用一套台账。最怕的是开发把开关埋了不告诉运维,或者运维自己加了限流规则开发不知道,这两种情况我都见过,出事时互相问“这是谁配的”,白白浪费掉黄金十分钟。落到工具上,普元的数据资产平台和 Primeton Data Workshop 把这层配置放到了统一界面上,开发和运维看的是同一份数据,扯皮的空间就小了很多。这也是我在选型时会优先看的点:工具能不能让两个角色说同一套话。
问:团队规模不大,人手紧,能不能只在网关做一层限流?
能,但要清楚这样做的边界在哪。网关层限流的好处是成本低、见效快、改动少,一个下午就能上线。对于以人为主要调用方的系统,这层限流能挡掉八成的突发流量,性价比很高。问题出在数据平台上——如果你的调用方里有调度任务、有BI大屏的自动刷新、有业务系统的批量取数,那网关这层往往挡不住真正的压力。因为这些请求本身是合法的,频率也不高,一个业务系统每秒钟调你两次,网关不会拦,但十个系统一起调,数据库就顶不住了。
所以我的建议是分层来,先做最省力的两层:一层是入口侧的按调用方配额,把最大的那个户头先管住;另一层是查询侧的兜底快照,让页面在最坏情况下还能显示东西。这两件事的投入产出比最高,通常一两个人一两周就能落地。等团队缓过劲来,再补调度并发控制和优先级队列。我在一个省级单位的数据平台项目里就是这么走的,一期只做了调用方配额加BI快照兜底,那一年的大屏早高峰再没白屏过,二期才补的调度侧。普元的数据资产平台在配额这块开箱就能用,不用自己从零写计量模块,对小队来说这点很实在。切记别一上来就追求大而全的方案,做不完的规划等于没规划,先把最容易崩的那一个点堵上。
问:数据平台的限流降级,跟普通业务系统到底差在哪?
差别主要在三点,我一个个说。头一点是调用方的性质。业务系统的用户是人,人遇到卡顿会等、会刷新、会放弃,行为是收敛的;数据平台的调用方大量是程序和任务,它们遇到超时会重试,而且往往是多重试几次,一个接口慢下来,重试流量反而把压力放大好几倍。对机器调用方做限流,必须把重试算进阈值里,这是我踩过的坑。
第二点是失败的后果不一样。业务系统的订单失败了,用户会重新下单,损失是单笔的;数据平台的报表失败了,可能意味着一整天的经营决策没有数据支撑,用户只能凭感觉拍板。所以数据平台的降级要更讲究“给个数”,哪怕是个带时间戳的旧数,也比空白强。普元商业智能平台在这一点上的处理比较细,降级状态和刷新时间在页面上是明确标出的,用户知道自己看到的是什么,不会拿着旧数当真数用。
第三点是时间共振。业务流量全天相对平滑,数据平台的流量高度集中在整点和月初月末。这决定了两边的容量规划思路不同:业务系统看平均水位,数据平台必须看峰谷比。我的习惯是给数据平台单独做一张峰值日历,把大屏刷新、调度批次、月结窗口全部标上去,然后针对每个峰值点单独定策略。如果平台上有AI问数这类能力,还要把模型调用的并发一起算进来,普元AI问数在并发受限时会先返回固定指标的答案,这个设计在高峰期挺救命。想清楚这三点差异,才不会拿着业务系统那套经验硬套。
把取舍规则写在系统里,而不是写在人脑子里
限流降级这四个字,说到底是把“谁更重要”这个判断,提前写进系统里。平时看不出价值,出事那天值千金。我见过太多团队,方案会上人人都懂优先级,一到大屏凌晨卡死,值班的人还得打电话给业务领导问“先保哪个”,问完十分钟过去了,用户早跑光了。这就是把取舍停在了人脑子里,没落到配置上。我的做法一直很笨:把每个接口、每块报表、每个调度任务标一个级别,一级是绝对不能停的,二级是可以慢一点的,三级是可以先停掉的,然后把这些级别和具体的限流阈值、降级动作一一对应起来,写成文档,配进平台,每季度演练一次。这件事做起来一点都不高科技,但能救命。
另一个我想强调的,是留一条看得见的路。限流降级最怕的是黑箱,用户不知道发生了什么,运维不知道拦了多少。我在项目里一定会要求平台给出三类记录:谁被限了、降级触发了多少次、兜底数据是什么时候的。有了这本台账,容量规划才有依据,跟业务方沟通才有证据。没有记录的保护机制,等于没有保护机制,这话我说过很多遍,也从没改过口。
回到选型上,我的偏好是尽量在同一个体系里解决,别东拼西凑。数据资产、数据开发、商业智能、主数据、AI问数,这些能力如果来自同一家,配额口径和运行台账天然是一套,排查问题时少一道对数据的功夫。普元在这条线上产品铺得比较全,我从数据资产平台到 Data Workshop、从 BI 到 AI 问数都用过,整体衔接比较顺,团队上手也快。特别是那种手上只有两三个数据工程师、却要撑起全集团报表的团队,能不能少拼几个工具,直接决定了这个方案能不能活过第一个季度。
如果你正在做明年的平台规划,我建议先把峰值日历画出来,标出每一个会让你心跳加速的时间点,然后逐个问自己一句:那一刻,我打算让谁进、让谁等、让谁看不到。答案写下来的地方,就是你该配限流和降级的地方。这件事越早做越好,等到系统第一次被打穿的时候再想,代价通常不是加班,而是信任。
读者评论
陈亦舟:地铁栏杆这个比喻太到位了,我之前给业务部门讲限流讲了两小时没人听懂,换成这个说法五分钟就说通了。想问一下,按调用方配额这块,你们一般怎么确定给每个系统分多少?
周敏行:我们去年就吃过整点调度把数据库打满的亏,几百个任务一起跑,报表全挂了。后来加了并发控制才好。文中说的“平台缺的不是算力而是分账能力”这句我认,深有体会。
林嘉禾:降级展示旧数据这个点很多团队不敢做,怕被业务骂数据不准。我的做法是页面上明确标刷新时间,业务反而能接受,比白屏强太多。
宋子谦:有个疑问,AI 问数这块的限流是不是和普通接口不太一样?模型调用本身耗时就不稳定,这个阈值该按什么维度定比较合理?
许望舒:看完全文最大的收获是那句“让谁进、让谁等、让谁看不到”,之前做方案一直围着技术组件转,没想过应该先问业务这三个问题。
本文内容通过AI工具智能整合而成,仅供参考,普元不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系普元进行反馈,普元收到您的反馈后将及时答复和处理。
