Skip to content

Sentinel 是怎么实现集群限流的? ​

  • 标签:Spring Cloud、微服务、后端、服务容灾、Sentinel

🏛 业务架构师 ​

Sentinel 集群限流的核心思想:选一个 Token Server 集中发放令牌,各客户端节点向它申请,全局额度统一管控——解决单机限流在多实例下"额度翻倍"的问题(单机 100 QPS × 10 实例 = 1000 QPS,远超全局目标 300)。

架构模式(两种):

  1. 独立 Token Server 部署:专门的集群(可集群化 HA),所有应用节点作为 client 连接它取令牌——跨多个服务做全局流控时用;
  2. 内嵌模式(嵌入式):选某个应用实例当选主充当 Token Server(自动选举、故障转移)——部署简单,单服务的集群流控首选,省一套集群运维。

工作机制:本地节点批量申请令牌(减少网络往返),Token Server 维护全局队列按令牌桶匀速发放;server 不可达时自动退化回单机限流——这个 fail-back 设计很关键,限流组件自身故障不能变成业务故障。

业务架构师视角的取舍判断:

  1. 先问需不需要集群限流:流量入口在网关统一限流(Gateway + Redis)往往更简单——"全局额度控制"放入口做,服务内 Sentinel 单机限流兜底,两层配合多数场景够用;
  2. 集群限流的真实需求场景:对下游有全局配额承诺时(调用第三方接口额度 1000 QPS、数据库整体水位)——这时候必须全局统一计数;
  3. 代价清单:Token Server 的部署与高可用、批量申请的粒度(批量太大损失精度、太小网络开销大)——精度与复杂度是反向的,按业务容忍度选。

一句话:单机限流保命,集群限流保承诺,别为不需要的精度多养一套集群。

🏗 系统架构师 ​

问题背景:单机限流按「总阈值 ÷ 实例数」分配会失真——负载不均时有的实例先死;且保护共享资源需要全局视角(DB 总容量 5000 QPS 不等于每实例各限 1000,还有别的服务在打)。

机制:Token Server 集中发牌——集群选一个节点做 token server(或独立部署),各节点请求前向它申请令牌(支持批量预取摊薄 RPC),server 维护全局计数判断放行。

部署形态:

  • 嵌入模式:token server 嵌在某个应用实例(省资源,但该实例故障要 failover,不适合大集群);
  • 独立模式:专门部署 token server 集群(推荐大流量场景,支持 namespace 配额管理)。

架构权衡(必讲):

  1. 精确性换可用性:每请求多一次 token 交互(内网 1ms 级,批量预取摊薄);token server 故障时默认 fail-open 退化为单机限流——保可用舍精确,这个取舍必须显式认可;
  2. 替代方案:网关统一限流(管总量不管内部)、Redis 加 Lua(实现简单,但多一跳网络且 Redis 扛压力);
  3. 我的实践:分层——网关总量限流加单机兜底;集群精确限流只用于保护 DB、第三方配额这类必须全局视角的场景。

💻 全栈开发专家 ​

背景:单机限流 100 QPS × 10 台 = 1000 的算法在流量不均时不成立(LB 偏差、机器性能差异)——精确总量控制需要全局视角,这就是集群限流。

架构:Token Server(令牌服务端)+ Token Client(应用实例内嵌客户端)。流程:请求到达 → 实例里的 Token Client 向 Token Server 申请令牌(带命名空间、规则 ID、token 数)→ Server 按全局规则(如全局限 1000 QPS)统一配额发放 → 拿到令牌放行,拿不到 block。

两种部署形态:

  1. 嵌入式:Token Server 跑在某个应用实例里,省部署;该实例挂了集群限流失效
  2. 独立部署:专用 Token Server 集群(生产推荐),namespace 隔离、多应用共用

生产必做的兜底:Token Server 失联时降级为本地限流(配置 failback 策略与超时)——否则限流组件自己成了单点,这是我评估集群限流时永远先问的行为。

适用判断:总配额型需求(给租户全局 500 QPS、保护共享 DB)才值得集群流控的复杂度;普通服务保护,单机限流 + 自动扩缩容已经够用。