流控效果:快速失败、Warm Up、匀速排队
引言:限流后如何处理请求 前面我们学习了QPS限流和线程数限流,但都是简单的"超过阈值就拒绝"。实际场景中,我们可能需要更灵活的策略: 场景1:系统刚启动,能直接承受高流量吗? 系统冷启动: 缓存为空、连接池未预热、JIT未优化 → 直接放入100 QPS → 系统可能卡死 需要:预热(Warm Up) → 逐步增加流量,给系统预热时间 场景2:突发流量能否平滑处理? 消息队列消费: 瞬间收到1000条消息 → 快速失败:拒绝后面的消息 → 匀速排队:排队等待,平滑处理 Sentinel提供了三种流控效果,满足不同场景需求: 快速失败(默认):超过阈值直接拒绝 Warm Up(预热):逐步增加流量 匀速排队:排队等待,平滑处理 一、快速失败:默认的流控效果 1.1 原理 快速失败是最简单直接的流控效果: 阈值:100 QPS 第1-100个请求:通过 ✅ 第101个请求:拒绝 ❌(立即返回) 第102个请求:拒绝 ❌ ... 下一秒:计数器重置,重新开始 特点: ✅ 简单直接 ✅ 响应快(不等待) ✅ 保护系统(超过阈值立即拒绝) 1.2 配置方式 FlowRule rule = new FlowRule(); rule.setResource("myResource"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setCount(100); // 流控效果:快速失败(默认,可省略) rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT); FlowRuleManager.loadRules(Collections.singletonList(rule)); 1.3 适用场景 场景1:普通API接口 @GetMapping("/api/user/{id}") @SentinelResource(value = "user_query", blockHandler = "handleBlock") public Result getUser(@PathVariable Long id) { User user = userService.getById(id); return Result.success(user); } public Result handleBlock(Long id, BlockException ex) { return Result.fail("系统繁忙,请稍后重试"); } 场景2:秒杀活动 ...