File tree 1 file changed +54
-0
lines changed
1 file changed +54
-0
lines changed Original file line number Diff line number Diff line change
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
+ ```
You can’t perform that action at this time.
0 commit comments