news 2026/5/11 23:18:52

02-限流熔断详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
02-限流熔断详解

限流熔断详解

一、知识概述

限流和熔断是系统自我保护的两大核心机制。限流防止系统过载,熔断防止级联故障。两者结合,构建系统的"免疫系统"。

核心目标:

  • 保护系统不被压垮
  • 防止故障扩散
  • 保证核心服务可用
  • 提供友好的降级体验

适用场景:

  • 流量突增(营销活动、热点事件)
  • 下游服务故障
  • 资源耗尽(CPU、内存、连接池)
  • 第三方服务不可用

二、知识点详细讲解

2.1 限流算法

2.1.1 固定窗口算法
原理:在固定时间窗口内限制请求数量 ┌─────────────────────────────────────┐ │ 时间窗口(1秒) │ │ │ │ ▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░ │ │ 10个请求(限制) │ │ │ │ T0 ──────────────── T1 │ └─────────────────────────────────────┘ 优点:实现简单,内存占用小 缺点:边界问题(窗口边界可能突发2倍流量)
/** * 固定窗口限流器 */publicclassFixedWindowRateLimiter{privatefinalintlimit;// 限制数量privatefinallongwindowSize;// 窗口大小(ms)privatefinalAtomicIntegercounter=newAtomicInteger(0);privatefinalAtomicLongwindowStart=newAtomicLong(System.currentTimeMillis());publicFixedWindowRateLimiter(intlimit,longwindowSizeMs){this.limit=limit;this.windowSize=windowSizeMs;}publicbooleantryAcquire(){longnow=System.currentTimeMillis();longcurrentWindowStart=windowStart.get();// 检查是否需要重置窗口if(now-currentWindowStart>=windowSize){// CAS更新窗口起始时间if(windowStart.compareAndSet(currentWindowStart,now)){counter.set(0);}}// 计数器增加returncounter.incrementAndGet()<=limit;}}
2.1.2 滑动窗口算法
原理:将窗口划分为多个小格,滑动计算 ┌─────────────────────────────────────┐ │ 滑动窗口(1秒 = 10格,每格100ms) │ │ │ │ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ 1 │ 2 │ 1 │ 3 │ 2 │ 1 │ 0 │ 0 │ 0 │ 0 │ │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ │ ↑ 当前位置 │ │ │ │ 总计: 1+2+1+3+2+1 = 10 (限制) │ └─────────────────────────────────────┘ 优点:解决了固定窗口的边界问题 缺点:内存占用较大
/** * 滑动窗口限流器 */publicclassSlidingWindowRateLimiter{privatefinalintlimit;// 总限制privatefinalintwindowSize;// 窗口大小(ms)privatefinalintsubWindowCount;// 子窗口数量privatefinalint[]counters;// 每个子窗口的计数privatefinallongsubWindowSize;// 子窗口大小privatelonglastTime;publicSlidingWindowRateLimiter(intlimit,intwindowSize,intsubWindowCount){this.limit=limit;this.windowSize=windowSize;this.subWindowCount=subWindowCount;this.subWindowSize=windowSize/subWindowCount;this.counters=newint[subWindowCount];this.lastTime=System.currentTimeMillis();}publicsynchronizedbooleantryAcquire(){longnow=System.currentTimeMillis();// 计算当前子窗口索引intcurrentIndex=(int)((now/subWindowSize)%subWindowCount);// 重置过期的子窗口longelapsed=now-lastTime;if(elapsed>0){intexpiredCount=(int)Math.min(elapsed/subWindowSize,subWindowCount);for(inti=0;i<expiredCount;i++){intindex=(currentIndex-i+subWindowCount)%subWindowCount;counters[index]=0;}lastTime=now;}// 计算当前总请求数inttotalCount=0;for(intcount:counters){totalCount+=count;}// 判断是否允许if(totalCount<limit){counters[currentIndex]++;returntrue;}returnfalse;}}
2.1.3 令牌桶算法
原理:以固定速率生成令牌,请求消耗令牌 ┌─────────────────────────────────────┐ │ 令牌桶 │ │ │ │ ┌─────────────────────┐ │ │ │ ▣ ▣ ▣ ▣ ▣ ▣ ▣ ▣ ░ ░ │ │ │ │ 桶中令牌(容量100) │ │ │ └─────────────────────┘ │ │ ↑ │ │ 固定速率补充 │ │ (如100个/秒) │ │ │ │ 请求 → 取令牌 → 有则通过 │ │ → 无则拒绝 │ └─────────────────────────────────────┘ 优点:允许一定程度的突发流量 适用:需要应对突发流量的场景
/** * 令牌桶限流器 */publicclassTokenBucketRateLimiter{privatefinallongcapacity;// 桶容量privatefinallongrate;// 令牌生成速率(个/秒)privatefinalAtomicLongtokens=newAtomicLong(0);privatefinalAtomicLonglastRefillTime=newAtomicLong(System.currentTimeMillis());publicTokenBucketRateLimiter(longcapacity,longrate){this.capacity=capacity;this.rate=rate;this.tokens.set(capacity);// 初始满桶}publicbooleantryAcquire(){returntryAcquire(1);}publicbooleantryAcquire(longpermits){// 补充令牌refillTokens();// 尝试获取令牌while(true){longcurrent=tokens.get();longtarget=current-permits;if(target<0){returnfalse;// 令牌不足}if(tokens.compareAndSet(current,target)){returntrue;}}}/** * 补充令牌 */privatevoidrefillTokens(){longnow=System.currentTimeMillis();longlastTime=lastRefillTime.get();if(now>lastTime){// 计算应该补充的令牌数longelapsed=now
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 0:32:19

别再只用针孔模型了!OpenCV中鱼眼相机标定与去畸变实战(附C++代码)

鱼眼相机标定实战&#xff1a;从畸变图像到精准视觉的OpenCV全流程指南 当你第一次看到鱼眼镜头拍摄的画面时&#xff0c;那种夸张的变形效果可能会让你感到既新奇又困惑。在自动驾驶车辆的环视系统、VR全景拍摄或是无人机航拍中&#xff0c;这种能够捕捉超宽视角的镜头无处不在…

作者头像 李华
网站建设 2026/4/15 0:27:47

AI语音克隆与合成:商用级方案搭建与版权风险规避

AI语音克隆与合成技术方案商用级AI语音克隆与合成技术通常基于深度学习模型&#xff0c;如Tacotron、WaveNet或VITS。这些模型能够从少量语音样本中学习说话人的声音特征&#xff0c;并生成自然流畅的合成语音。开源工具包如Coqui TTS或NVIDIA的NeMo提供了预训练模型和训练框架…

作者头像 李华
网站建设 2026/4/15 0:24:03

mysql如何优化重复索引_mysql冗余索引查找与处理

怎么快速发现表里有重复索引MySQL 本身不报错也不警告&#xff0c;但冗余索引会拖慢写入、浪费内存、让 EXPLAIN 分析更难读。真正有效的检查方式是查 information_schema&#xff0c;而不是靠肉眼扫 SHOW CREATE TABLE。用 SELECT 对比索引列组合&#xff1a;每个索引的 seq_i…

作者头像 李华
网站建设 2026/4/15 0:22:31

避坑指南:ESP8266连接心知天气API常见问题解析(含ArduinoJson6配置技巧)

ESP8266连接心知天气API的五大避坑指南与ArduinoJson6实战技巧 当你在ESP8266项目中集成心知天气API时&#xff0c;是否遇到过设备莫名其妙重启、JSON解析失败或者API调用受限的困扰&#xff1f;这些问题往往会让开发者陷入调试的泥潭。本文将分享我在多个智能气象站项目中积累…

作者头像 李华