集群流控:跨实例的流量管理
引言:当单机限流不够用时 假设你的订单服务部署了3个实例,每个实例配置了QPS限流1000: 实例1:QPS限流 1000 实例2:QPS限流 1000 实例3:QPS限流 1000 问题来了:整个订单服务的总QPS是多少? 答案:3000 QPS(每个实例1000)。 但如果你的需求是"整个订单服务的总QPS不超过2000"呢? 传统的单机限流无法实现!因为每个实例各自统计,无法感知其他实例的流量。 这就是集群流控(Cluster Flow Control)要解决的问题。 单机限流的局限性 问题1:无法精确控制总流量 场景:3个实例,期望总QPS 2000。 单机限流配置: FlowRule rule = new FlowRule(); rule.setResource("orderCreate"); rule.setCount(667); // 2000 / 3 ≈ 667 问题: 流量不均匀时,会导致总QPS超限 某个实例挂了,总QPS会降低 示例: 场景 实例1 QPS 实例2 QPS 实例3 QPS 总QPS 结果 流量均匀 666 666 666 1998 ✅ 正常 流量不均 667 667 1000 2334 ❌ 超限 实例3挂 667 667 0 1334 ⚠️ 浪费 问题2:无法应对突发流量 场景:3个实例,某一秒流量全部打到实例1。 时刻 实例1 实例2 实例3 总QPS 期望 T0 667 ❌ 0 0 667 2000 T1 667 ❌ 0 0 667 2000 实例1已经限流了,但实例2和实例3还有大量闲置容量。 ...