Skip to content

Commit 7be8515

Browse files
committed
限流算法
1 parent 4e9f619 commit 7be8515

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

MD/Limiting.md

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# 限流算法
2+
3+
限流是解决高并发大流量的一直方案,至少是可以保证应用的可用性。
4+
5+
通常有以下两种限流方案:
6+
7+
- 漏桶算法
8+
- 令牌桶算法
9+
10+
## 漏桶算法
11+
12+
![漏桶算法,来自网络.png](https://i.loli.net/2017/08/11/598c905caa8cb.png)
13+
14+
漏桶算法非常简单,就是将流量放入桶中并按照一定的速率流出。如果流量过大时候并不会提高流出效率,而溢出的流量也只能是抛弃掉了。
15+
16+
这种算法很简单,但也非常粗暴,无法应对突发的大流量。
17+
这时可以考虑令牌桶算法。
18+
19+
## 令牌桶算法
20+
![令牌桶算法-来自网络.gif](https://i.loli.net/2017/08/11/598c91f2a33af.gif)
21+
22+
令牌桶算法是按照恒定的速率向桶中放入令牌,每当请求经过时则消耗一个或多个令牌。当桶中的令牌为 0 时,请求则会被阻塞。
23+
24+
> note:
25+
令牌桶算法支持先消费后付款,比如一个请求可以获取多个甚至全部的令牌,但是需要后面的请求付费。也就是说后面的请求需要等到桶中的令牌补齐之后才能继续获取。
26+
27+
实例:
28+
```java
29+
@Override
30+
public BaseResponse<UserResVO> getUserByFeignBatch(@RequestBody UserReqVO userReqVO) {
31+
//调用远程服务
32+
OrderNoReqVO vo = new OrderNoReqVO() ;
33+
vo.setReqNo(userReqVO.getReqNo());
34+
35+
RateLimiter limiter = RateLimiter.create(2.0) ;
36+
//批量调用
37+
for (int i = 0 ;i< 10 ; i++){
38+
double acquire = limiter.acquire();
39+
logger.debug("获取令牌成功!,消耗=" + acquire);
40+
BaseResponse<OrderNoResVO> orderNo = orderServiceClient.getOrderNo(vo);
41+
logger.debug("远程返回:"+JSON.toJSONString(orderNo));
42+
}
43+
44+
UserRes userRes = new UserRes() ;
45+
userRes.setUserId(123);
46+
userRes.setUserName("张三");
47+
48+
userRes.setReqNo(userReqVO.getReqNo());
49+
userRes.setCode(StatusEnum.SUCCESS.getCode());
50+
userRes.setMessage("成功");
51+
52+
return userRes ;
53+
}
54+
```

0 commit comments

Comments
 (0)