限流器是一种限制某种操作在一定时间内的执行次数(例如每秒钟5次)或者执行量(例如每秒钟1G大小的数据)的机制。
限流器是一种防御性的编程实现方式,在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待、排队、降级、拒绝服务等。
在一个大型的分布式系统,系统设计要考虑很多很多方面:
举一个简单的例子:假设一个商城,有下单和查看自己的订单这两个业务。限量秒杀的时候,用户下单量在某一时候突然飚高。系统目前容量可能不够承担这么大的并发下单量,导致请求阻塞,排队,并进而导致所有的资源都被下单请求吃掉,用户查看自己订单的请求也无法执行或者很慢。同时,用户请求刷不出来就会不断地刷,导致进一步请求堆积。
如果完全不采用限流器,一般需要通过设置适当的请求超时,尽量小的同步等待队列和合适的断路策略,来防止过载。但是,这种方式并不能避免上面说的4个问题。
在目前的微服务体系中,一般一个进程既是服务提供方,又是服务调用方。在服务网格下更是如此。对于服务提供方,限流主要是控制外部流量防止压力过大。对于服务调用的时候限流,主要是考虑压力均匀(虽然服务调用一般有负载均衡算法,但是一般的负载均衡算法没法保证真正的负载完全均衡,客户端限流器可以进一步帮助防止压力全部打到了某一个实例)。
对于服务端限流,当触发限流的时候,服务端一般会拒绝请求,并且可能返回 429 这个 HTTP 状态码。客户端是这个请求直接异常,还是缓存起来之后继续重试,取决于客户端的策略。
每日一刷,轻松提升技术,斩获各种offer: