mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
[docs update]增加对 Redis+Lua 限流方式的介绍
This commit is contained in:
parent
7d69842586
commit
10f7641d58
@ -3,8 +3,6 @@ title: 限流
|
|||||||
category: 高可用
|
category: 高可用
|
||||||
---
|
---
|
||||||
|
|
||||||
## 何为限流?为什么要限流?
|
|
||||||
|
|
||||||
针对软件系统来说,限流就是对请求的速率进行限制,避免瞬时的大量请求击垮软件系统。毕竟,软件系统的处理能力是有限的。如果说超过了其处理能力的范围,软件系统可能直接就挂掉了。
|
针对软件系统来说,限流就是对请求的速率进行限制,避免瞬时的大量请求击垮软件系统。毕竟,软件系统的处理能力是有限的。如果说超过了其处理能力的范围,软件系统可能直接就挂掉了。
|
||||||
|
|
||||||
限流可能会导致用户的请求无法被正确处理,不过,这往往也是权衡了软件系统的稳定性之后得到的最优解。
|
限流可能会导致用户的请求无法被正确处理,不过,这往往也是权衡了软件系统的稳定性之后得到的最优解。
|
||||||
@ -13,7 +11,7 @@ category: 高可用
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 常见限流算法
|
## 常见限流算法有哪些?
|
||||||
|
|
||||||
简单介绍 4 种非常好理解并且容易实现的限流算法!
|
简单介绍 4 种非常好理解并且容易实现的限流算法!
|
||||||
|
|
||||||
@ -61,7 +59,9 @@ category: 高可用
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 单机限流
|
## 单机限流怎么做?
|
||||||
|
|
||||||
|
单机限流针对的是单体架构应用。
|
||||||
|
|
||||||
单机限流可以直接使用 Google Guava 自带的限流工具类 `RateLimiter` 。 `RateLimiter` 基于令牌桶算法,可以应对突发流量。
|
单机限流可以直接使用 Google Guava 自带的限流工具类 `RateLimiter` 。 `RateLimiter` 基于令牌桶算法,可以应对突发流量。
|
||||||
|
|
||||||
@ -184,7 +184,9 @@ Resilience4j 不仅提供限流,还提供了熔断、负载保护、自动重
|
|||||||
|
|
||||||
因此,在绝大部分场景下 Resilience4j 或许会是更好的选择。如果是一些比较简单的限流场景的话,Guava 或者 Bucket4j 也是不错的选择。
|
因此,在绝大部分场景下 Resilience4j 或许会是更好的选择。如果是一些比较简单的限流场景的话,Guava 或者 Bucket4j 也是不错的选择。
|
||||||
|
|
||||||
## 分布式限流
|
## 分布式限流怎么做?
|
||||||
|
|
||||||
|
分布式限流针对的分布式/微服务应用架构应用,在这种架构下,单机限流就不适用了,因为会存在多种服务,并且一种服务也可能会被部署多份。
|
||||||
|
|
||||||
分布式限流常见的方案:
|
分布式限流常见的方案:
|
||||||
|
|
||||||
@ -193,7 +195,12 @@ Resilience4j 不仅提供限流,还提供了熔断、负载保护、自动重
|
|||||||
|
|
||||||
如果你要基于 Redis 来手动实现限流逻辑的话,建议配合 Lua 脚本来做。
|
如果你要基于 Redis 来手动实现限流逻辑的话,建议配合 Lua 脚本来做。
|
||||||
|
|
||||||
网上也有很多现成的脚本供你参考,就比如 Apache 网关项目 ShenYu 的 RateLimiter 限流插件就基于 Redis + Lua 实现了令牌桶算法/并发令牌桶算法、漏桶算法、滑动窗口算法。
|
**为什么建议 Redis+Lua 的方式?** 主要有两点原因:
|
||||||
|
|
||||||
|
- **减少了网络开销** :我们可以利用 Lua 脚本来批量执行多条 Redis 命令,这些 Redis 命令会被提交到 Redis 服务器一次性执行完成,大幅减小了网络开销。
|
||||||
|
- **原子性** :一段 Lua 脚本可以视作一条命令执行,一段 Lua 脚本执行过程中不会有其他脚本或 Redis 命令同时执行,保证了操作不会被其他指令插入或打扰。
|
||||||
|
|
||||||
|
我这里就不放具体的限流脚本代码了,网上也有很多现成的优秀的限流脚本供你参考,就比如 Apache 网关项目 ShenYu 的 RateLimiter 限流插件就基于 Redis + Lua 实现了令牌桶算法/并发令牌桶算法、漏桶算法、滑动窗口算法。
|
||||||
|
|
||||||
> ShenYu 地址: https://github.com/apache/incubator-shenyu
|
> ShenYu 地址: https://github.com/apache/incubator-shenyu
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user