QPS第三级削峰—限流+降级




local locks = require "resty.lock" local function acquire() local lock =locks:new("locks") local elapsed, err =lock:lock("limit_key") --互斥锁 保证原子特性 local limit_counter =ngx.shared.limit_counter --计数器 local key = "ip:" ..os.time() local limit = 5 --限流大小 local current =limit_counter:get(key) if current ~= nil and current + 1> limit then --如果超出限流大小 lock:unlock() return 0 end if current == nil then limit_counter:set(key, 1, 1) --第一次需要设置过期时间,设置key的值为1, 过期时间为1秒 else limit_counter:incr(key, 1) --第二次开始加1即可 end lock:unlock() return 1 end ngx.print(acquire())
import java.util.concurrent.atomic.AtomicInteger; /** * 原生Java实现计数器 * 场景:一分钟内只允许通过100个请求 * @author test11 */ public class Counter { //统计开始时间 private long start = System.currentTimeMillis(); //一分钟内 private long inteval = 60 * 1000; //计数器初始化,考虑到多线程场景,用原子类进行计算 private AtomicInteger calCounter = new AtomicInteger(0); //一分钟内允许的最大流量数 private int limit = 100; private boolean isLimit(){ //获取当前时间 long now = System.currentTimeMillis(); //当前时间在一分钟间隔内并且计数器小于最大的限制流量数 if(now > start + inteval && calCounter.intValue()<limit){ calCounter.getAndAdd(1); return calCounter.intValue()<=limit; }else{ //不满足要求的则重置计数器 start = now; calCounter = new AtomicInteger(1); return true; } } }
令牌桶实现:RateLimiter更多API接口详见Guava官方文档
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency>
/** * 稳定模式(SmoothBursty:令牌生成速度恒定) * @param args */ public static void main(String[] args) { // RateLimiter.create(2)每秒产生的令牌数 RateLimiter limiter = RateLimiter.create(2); // limiter.acquire() 阻塞的方式获取令牌 System.out.println(limiter.acquire());; System.out.println(limiter.acquire());; }
/** * 渐进模式(SmoothWarmingUp:令牌生成速度缓慢提升直到维持在一个稳定值) * @param args */ public static void main(String[] args) { // 平滑限流,从冷启动速率(满的)到平均消费速率的时间间隔 RateLimiter limiter = RateLimiter.create(2,1000l, TimeUnit.MILLISECONDS); System.out.println(limiter.acquire());; System.out.println(limiter.acquire());; }
反爬措施三:对于判定爬虫的请求,可以引流到预置的静态页或缓存页
降级规则:距离用户越近,造成的损失越小,避免滚雪球效应,尽量在入口处或者链路的前面发现问题,降级处理
SLA:服务等级定义 SLA(Service Level Agreement)是判定压测是否异常的重要依据。压测过程中,通过监控核心服务状态的 SLA 指标数据,您可以更直观地了解压测业务的状态。SLA则是服务商与您达成的正常运行时间保证。
SLA一般以一年中能达到几个9来判定系统的高可用程度,在流量聚集的高并发系统中,一两秒可能就是百万级别的损失,因此,无论系统达到几个9的保证,都会有不可用的时间段,因此需要提供降级服务来保证系统的整体可用性,不至于让用户觉得系统崩溃
2个9 = (1-99%)X24 X 365 = 87.6 小时 = 3.65天
3个9 = (1-99.9%)X24 X 365 = 8.76 小时
4个9 = (1-99.99%)X24 X 365 = 0.876 小时 = 52.56分钟
5个9 = (1-99.999%)X24 X 365 = 0.0876 小时 = 5.256分钟
6个9 = (1-99.9999%)X24 X 365 = 0.00876 小时 = 0.5256分钟 = 31秒
降级措施:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY