Sentinel篇
前言
在互联网应用过程中,有很多的高并发访问场景,类似于双十一这种活动,特点是访问量剧增,访问量超出系统所能处理的最大并发数。
如果没有保护机制的话,假设让这些流量都进入服务器就会导致系统不可用,造成巨大的损失。为了避免这种情况的发生,我们需要采用保护策略,常见的有服务降级、限流和熔断等。
接下来介绍服务限流和服务熔断。
一、服务限流
限流的目的是为了防止大量数据涌入服务器,通过限制并发访问数量和同一时间窗口内处理的请求数量来保护系统,一旦达到限制就采用对应的拒绝策略,比如跳转到错误页面、进入排队系统等等。本质上就是限制了一部分用户的使用权来为其他用户提供更好的服务。
1、限流的算法
1.1 计数器算法
很好理解,计数器就是在指定的周期内,记录访问的数量,当访问次数达到阈值的时候,就触发限流策略,进入下一个周期后访问次数清0。
该算法优点是实现简单,缺点是存在临界问题,在上一个周期末尾和下一个周期开始访问的话,短时间内访问量会剧增。
1.2 滑动窗口算法
为了解决上面的临界问题,提出了滑动窗口算法。实现的原理是将固定窗口分为多个小窗口,分别记录这个小窗口的访问次数,然后滑动窗口确保滑动范围内只可以处理固定数量的次数,之后删除过期的小窗口。这个经常刷算法的同学应该比较了解,不过多介绍。
Sentinel就是采用滑动窗口算法。
1.3 令牌桶限流算法
令牌桶是网络流量整形和速度限制的常用办法。对于每一个请求,都需要在令牌桶中拿一个令牌,如果没有拿到令牌,则需要触发限流策略。
原理也很简单,系统以一个恒定的速度生产令牌,放到桶里,请求过来就去桶里拿令牌获取访问资格。如果访问大于生产,令牌就被取完了,后面的请求就被限流;如果访问等于生产,系统平稳运行;如果访问小于生产,系统并发不高,正常处理。
1.4 漏桶流算法
主要作用是控制数据注入网络的速度,平滑网络上的突发流量。
原理和令牌桶相似,内部也维护一个容器,以固定速度出水,不管生产者的需求有多大,消息处理能力取决于消费者。缺点是漏桶无法处理短时间内的突发流量。
二、服务熔断和降级
在微服务架构中,服务被拆分成细粒度的微服务,会出现请求链路较长的情况,一个简单的请求需要调用多个微服务。在高并发场景中,这些依赖服务的稳定性对系统影响很大,如果某个服务因为网络延迟或者访问超时不可用,就会导致当前请求堵塞。
服务熔断就是用来解决这种情况,如果当前某个服务提供者因为某些问题无法提供服务,为了防止整个系统雪崩,就把有问题的这个服务隔离出来,断绝和外界的联系,触发熔断之后,后续一段时间该服务调用者都直接报失败。
服务降级有几个参考的指标,一般包括:
- 平均响应时间
- 异常比例
- 异常数量
三、Sentinel
1、概念
Sentinel是面向分布式服务框架的轻量级流量控制组件。以流量为切入点,从限流、流量整形、服务降级、系统负载保护等多个维度保护系统。
2、Sentinel特性
- 丰富的应用场景
- 实时监控
- 开源生态支持
- SPI扩展点支持
3、Sentinel组成
-
核心库:不依赖任何框架,能够运行所有的java运行时环境,同时对Dubbo、Spring Cloud等框架有较好的支持。
- 控制台: 基于Springboot开发,打包之后直接运行,不需要额外的tomcat等应用容器
4、应用步骤
-
定义资源
-
定义限流规则
-
检验规则是否生效