一杯咖啡的时间,聊聊技术与成长
限流算法对比与选型:一张表定案
固定窗口、滑动窗口、漏桶、令牌桶,单机与分布式两组旋钮——限流篇的算法备齐了,本篇一张总表定选型,再用 503 咖啡馆的完整方案演示「混合使用才是常态」,顺带清算四个常见误区。
多级限流:三层防线的额度分配
网关、应用、数据库各一道闸,但阈值不是随手拍——外层要略宽于内层,拒绝的对象各有分工:网关挡恶意,应用管配额,数据库做保险丝。额度分配错一层,整条防线就互相打架。
网关层限流:Nginx 与 Spring Cloud Gateway
闸门装在入口最划算:流量还没进业务就被拦下,省下的是整条链路的资源。Nginx 的漏桶匀速放行,Spring Cloud Gateway 的 Redis 令牌桶按维度发牌——但网关看不见业务上下文,粗与细要分层配合。
分布式限流:Redis 加 Lua 的原子计数
计数器集中到 Redis,「读-判断-写」的竞态跟着一起搬了过去——老坑新填,还得 Lua。本篇把固定窗口、令牌桶、滑动窗口三个算法的 Redis 版一次讲透,顺带解决时间源统一与 Redis 故障时的放行策略。
单机限流落地:注解、AOP 与那些工程细节
算法备齐只是第一步,接进业务代码才有战斗力。手写 if 侵入太重,注解加切面才是工程正解:一个 @RateLimit 走天下,SpEL 动态拼 key,限流触发转友好提示,触发率指标上监控——四件套缺一不可。
漏桶与令牌桶:匀速与突发的两种哲学
滑动窗口数的是历史,漏桶与令牌桶管的是节奏。漏桶把流量剁成绝对匀速的水滴,令牌桶匀速发牌、允许攒额度打突发——一个做整形,一个做控制,Nginx 与 Guava 各站一队。
滑动窗口:把突刺磨平
固定窗口的 2 倍临界突刺,病根在「格子是死的」——窗口边界成了流量的免检通道。滑动窗口让统计区间跟着时间走,或者把格子切细统计最近 N 格,突刺被平滑掉,代价是内存与计算的加价。
限流第一课:固定窗口计数器
「下单接口每秒最多放 200 个」,这句话翻译成代码就是固定窗口计数器:按秒切格子,格子里数数,满了就拒。三行核心逻辑撑起第一道闸门,简单到不容易出错——但它有个藏在窗口边界里的坑。
爆单那天:雪崩是怎么发生的
周年庆半价日,10 点整活动上线,一分钟内 503 咖啡馆的系统从响应如飞到全站 502。慢查询打满连接池、线程排队堆积、不相关的服务连坐陪葬、重启再倒下——雪崩从来不是一瞬间的意外,是一条完整的灾难链。