基本认识
场景分析
当流量超过阈值时,回导致cpu和内存的报表,部分服务开始不可用,从而导致整个系统的崩溃。
引入限流
通过设置最大的流量限制,当超过时就拒绝访问,好处是可以保护系统,坏处是被限流的用户体验不好,所以,限流是有损的解决方案。
限流的作用
1 保护不因为瞬间流量而崩溃 2 防止恶意请求流量,恶意攻击。
常见的限流算法
滑动窗口
发送方窗口大小由接收方决定,目的是为了控制发送速度,以免接收方缓存不够大,导致内存溢出。
演示地址:
https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/selective-repeat-protocol/index.html
漏桶(控制传输速率Leaky bucket)
基本原理
1,以恒定速率往下漏水
2 加水的速率可快可慢
桶满的处理方式
1 不允许继续往桶里加水,等桶里一部分水放走后,在允许加水
2 溢出的水直接抛弃掉。
image.png
令牌桶(能够解决突发流量)
组成元素
1 令牌桶:以恒定速度往桶里加令牌,若桶满后则丢弃令牌
2 令牌流:存放令牌的速度
3 数据流:取令牌的速度
情境分析
image.png数据流的速率 等于 令牌流的速率,数据流的速率 小于 令牌流的速率, 数据流的速率 大于 令牌流的速率
实现方式
恒定速率
guava包中有RateLimiter类,可以用来实现恒定速率,进而可以实现漏桶算法和令牌桶算法
最大并发个数
可以通过Semaphore来实现,可以实现滑动窗口的算法。
网友评论