【Java高级工程师蜕变之路】069 分布式服务治理之服务限流
服务限流
什么是服务限流
限流就是为了提供稳定的服务,限制使用人数。
限流的目的是通过对并发请求进行限速,或者对一个时间窗口内的请求数量进行限速来保护系统。
一旦达到限制速率可以拒绝服务、排队或者等待。
多维度进行限流
请求到达服务接口时,可以采用多维度限流策略。
限流算法
-
限流算法-计数器(固定窗口)
计数器限制,每一分钟或者每一秒钟内的请求不能超过一定的次数,在下一秒计时器清零重新计算
存在的问题:
客户端在第一分钟的59秒请求了100次,又在第二分钟的1秒请求了100次,2秒内,后端要承受200次请求的压力,形成了流量突刺
-
限流算法-计数器(滑动窗口)
滑动窗口是细分后的计数器。它将每个时间窗口又划分成若干个时间片段,每过一个时间片段,整个时间窗口就会向右移动一格。
打满100次,客户端就拒绝访问。
时间窗口划分的越细,滑动窗口的滚动越平滑,限流效果越精确。
-
限流算法-漏桶
漏桶算法类似一个限制出水速度的水桶,通过一个固定大小的FIFO队列+定时取队列元素的方式实现。
请求进入队列后,会被匀速取出来处理,类似桶底部的开口匀速出水。当队列被占满后,后来的请求会直接被拒绝,类似水倒得太快溢出来。
优点是可以削峰填谷,不论请求多大多快,都只会匀速发给后端,不会出现突刺现象,保证下游服务正常运行。
缺点是桶队列中的请求会排队,响应时间拉长。
-
限流算法-令牌桶
令牌桶算法是以恒定的速度往桶里放置令牌,如果桶里的令牌满了就放弃,每进来一个请求去桶里找令牌,有的话拿走令牌继续处理,没有就拒绝请求。
令牌桶的优点是可以应对突发流量,当桶里有令牌时可以快速响应也不会产生漏桶队列中的等待时间。
缺点是相对于漏桶,一定程度上减少了对下游服务的保护。