如果观看抽奖或秒杀系统的请求监控曲线,你就会发现这类系统在活动开放的时间段内会出现一个波峰,而在活动未开放时,系统的请求量、机器负载一般都是比较平稳的。为了节省机器资源,我们不可能时时都提供最大化的资源能力来支持短时间的高峰请求。所以需要使用一些技术手段,来削弱瞬时的请求高峰,让系统吞吐量在高峰请求下保持可控。——百度百科
流量削峰方案:
无损方案:排队、验证、分层过滤,不会损失用户发出的请求。
有损方案:限流、熔断,会损失用户发出的请求。
排队
用消息队列来缓冲瞬时流量,把同步的直接调用转换成异步的间接推送,中间通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。
常见的消息中间有RocketMQ、Kafka、RabbitMQ等。
验证
对请求加以验证,增加请求的复杂度,延缓请求。同时也可以防止恶意请求和攻击。
比如:图形验证码、滑动验证码、短信验证码等。
分层过滤
采用“漏斗”式设计来处理请求,在不同的层次尽可能地过滤掉无效请求,让“漏斗”最末端的才是有效请求。
限流
常见的限流算法有滑动窗口、令牌桶、漏桶、计数器。
限流的方式有接口限流、用户限流、IP限流、服务整体请求量限流。
可以动态限流,创建容器监控,然后监听容器CPU、内存等指标运行情况,达到阈值启用限流。也可以放行核心请求,限制非核心请求。
熔断
线程池隔离:根据线上的生产情况对某个接口在高峰期的QPS进行合理的预估之后,对接口根据预估值给定一个合理的线程数,如果出了故障,那么接口所在的服务器最多分配的线程数会被限制在这个数量之内,这样不会导致系统资源被耗尽,同时,当高峰期接口被调用的时候,hystrix可以通过设置降级策略对请求返回。