🚦 Nginx vs 网关限流算法对比

🔥 Nginx 限流 (漏桶算法)

漏桶算法演示
R1
R2
R3
R4
固定速率输出

🔧 限流方式

  • 控制速率:使用漏桶算法过滤突发流量
  • 控制并发:限制单个IP连接数
  • 总连接限制:控制并发连接总数
  • 平滑处理:请求以固定速率处理

⚡ Spring Cloud Gateway (令牌桶算法)

令牌桶算法演示
R1
R2
R3
R4
根据令牌数量处理

🔧 限流方式

  • RequestRateLimiter:局部过滤器限流
  • IP限流:根据客户端IP进行限制
  • 路径限流:按不同路径设置限流
  • 突发处理:允许突发流量消费令牌
对比维度 Nginx (漏桶算法) Gateway (令牌桶算法)
算法特点 恒定速率输出,平滑流量 允许突发流量,灵活性高
突发处理 缓冲突发流量,匀速处理 可以快速消费令牌处理突发
配置方式 limit_req_zone, limit_conn_zone RequestRateLimiter配置
限流维度 IP、连接数、请求速率 IP、路径、自定义Key
适用场景 需要平稳流量的场景 需要处理突发流量的场景
性能影响 轻量级,性能优秀 需要Redis存储,有网络开销

🧠 深度理解两种算法

🪣 漏桶算法详解 (Nginx)

💡 形象比喻:
想象一个底部有小洞的水桶:
• 水桶上方不断有水倒入(用户请求)
• 水桶底部的小洞以恒定速度漏水(处理请求)
• 无论上面倒水多快,下面漏水速度始终不变
🔄 实际工作过程:
时间: 0秒 → 突然来了100个请求
漏桶: 我只能以每秒10个的速度处理,多的先排队等着

时间: 1秒 → 处理了10个请求,还剩90个在等
时间: 2秒 → 又处理了10个请求,还剩80个在等
...以此类推
✅ 优点:
输出流量非常平稳,不会有突发峰值
❌ 缺点:
即使系统闲置,也不能快速处理突发请求

🪣 令牌桶算法详解 (Gateway)

💡 形象比喻:
想象一个装令牌(代币)的桶:
• 系统定期往桶里放令牌(比如每秒放10个)
• 每个请求需要拿走1个令牌才能被处理
• 桶有容量限制(比如最多装50个令牌)
• 有令牌就能立即处理,没有就等待
🔄 实际工作过程:
正常情况:
• 桶里有30个令牌
• 来了5个请求 → 拿走5个令牌,立即处理
• 剩余25个令牌

突发情况:
• 桶里有30个令牌
• 突然来了50个请求 → 只能处理30个(令牌用完)
• 剩余20个请求被拒绝或延迟
• 下一秒又补充10个令牌,可以继续处理
✅ 优点:
可以快速处理突发流量,用户体验好
⚠️ 注意:
可能产生瞬间高负载

🔍 关键区别场景对比

场景 漏桶算法 令牌桶算法
平时流量小 还是按固定速度处理 可以快速处理完,积累令牌
突发大流量 排队等待,平稳处理 消耗积累的令牌,快速处理一批
系统空闲时 不能提前"储存"处理能力 可以积累令牌,为突发做准备

📊 实际处理例子对比

🎯 场景: 你的API平时每秒5个请求,突然来了30个请求

🪣 漏桶算法处理:

第1秒:处理5个,剩余25个排队
第2秒:处理5个,剩余20个排队
第3秒:处理5个,剩余15个排队
第4秒:处理5个,剩余10个排队
第5秒:处理5个,剩余5个排队
第6秒:处理5个,全部处理完
⏱️ 总耗时:6秒

🪣 令牌桶算法处理:

假设桶容量20个令牌,每秒补充5个:

第1秒:有20个令牌,处理20个请求,剩余10个排队
第2秒:补充5个令牌,处理5个请求,剩余5个排队
第3秒:补充5个令牌,处理5个请求,全部处理完
⏱️ 总耗时:3秒

🎯 使用场景建议

选择漏桶算法(Nginx)当:

  • 你希望保护后端服务,确保负载稳定
  • 你不希望有任何流量突发峰值
  • 系统处理能力有硬性限制
  • 服务器资源有限,需要平稳使用

选择令牌桶算法(Gateway)当:

  • 你希望系统能灵活应对突发流量
  • 平时流量较小,偶尔有访问高峰
  • 用户体验更重要(减少等待时间)
  • 系统有一定的突发处理能力

💡 一句话总结

漏桶像"慢性子",令牌桶像"急性子但有准备"!