微服务面试篇-Sentinel

Sentinel与Hystrix线程隔离区别

线程隔离有两种方式实现:

  • 线程池隔离(Hystrix默认采用),创建了线程池,消耗资源
  • 信号量隔离(Sentinel默认采用),不需要维护线程池

在这里插入图片描述

Hystrix默认是基于线程池实现的线程隔离,每个被隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU开销,性能一般,但是隔离性更强。
Sentinel是基于信号量(计数器)实现的线程隔离,不用创建线程池,性能较好,但是隔离性一般。

线程池隔离

优点

支持主动超时
支持异步调用

缺点

线程的额外开销比较大

场景

低善出

信号量隔离

优点

轻量级,无额外开销

缺点

不支持主动超时
不支持异步调用

场景

高频调用
高扇出

Sentinel的限流和Gateway的限流有什么差别

限流:对应用服务器的请求做限制,避免因过多请求二导致服务器过载甚至宕机。
限流算法常见的包括两种:

  • 计数器算法,又包含窗口计数器算法、滑动窗口计数器算法
  • 令牌桶算法(Token Bucket)
  • 漏桶算法(Leaky Bucket)

Gateway则采用了基于Redis实现的令牌桶算法。而Sentinel内部却比较复杂:

  • 默认限流模式是基于滑动时间窗口算法
  • 排队等待的限流模式则基于漏桶算法
  • 而热点参数限流则是基于令牌桶算法。

固定窗口计数器算法

  • 将时间划分为多个窗口,窗口时间跨度称为Interval,本例中为1000ms;
  • 每个窗口维护一个计数器,每有一次请求就将计数器加一,限流就是设置计数器阈值,本例为3
  • 如果计数器超过了限流阈值,则超出阈值的请求都被丢弃

在这里插入图片描述

问题:固定窗口期,假设4000到4500没有请求,4500毫秒到5000毫秒有3个请求,正好没有超过阈值,5000到5500有3个请求,也是没有超过阈值,但是窗口时间跨度是不固定的,4500到5500也是1000ms,却有6个请求,超过了阈值,但是这种有可能放行了,导致服务不稳定。

滑动窗口计数器算法

滑动窗口计数器算法将一个窗口划分为n个更小的区间,例如:

  • 窗口时间跨度Interval为1秒,区间数量 n = 2,则每个小区间时间跨度为500ms
  • 限流阈值依然为3,时间窗口(1秒)内请求超过阈值时,超出的请求被限流
  • 窗口会根据当前请求所在时间(currentTime)移动,窗口范围是从(currentTime-Interval)之后的第一个时区开始,到currentTime所在时区结束。

在这里插入图片描述

令牌桶算法

  • 以固定的速率生成令牌,存入令牌桶中,如果令牌桶满了以后,多余令牌丢弃
  • 请求进入后,必须先尝试从桶中获取令牌,获取到令牌后,才可以被处理
  • 如果令牌桶中没有令牌,则请求等待或丢弃。

在这里插入图片描述

超过桶容量才会平滑

漏桶算法

  • 将每个请求视作“水滴”放入“漏桶”进行存储;
  • “漏桶”以固定速率向外“漏”出请求来执行,如果“漏桶”空了则停止“漏水”;
  • 如果“漏桶”满了则多余的“水滴”会被直接丢弃

在这里插入图片描述

可以应对突发请求,运行保持平滑的

Sentinel在实现漏桶时,采用了排队等待模式:
让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。并发的多个请求必须等待,逾期的等待时长=最近一次请求的预期等待时间+允许的间隔。如果请求预期的等待时间超出最大时长,则会被拒绝。

例如:QPS = 5,意味着每200ms处理一个队列中的请求,timeout = 2000,意味着预期等待超过2000ms的请求会被拒绝并抛出异常。
在这里插入图片描述

限流算法对比

因为计数器算法一般都是采用滑动窗口计数器,所以这里我们对比三种算法:
在这里插入图片描述

Sentinel源码

SentinelAutoConfiguration

Context

  • Context代表调用链路上下文,贯穿一次调用链路中的所有资源(Entry),基于ThreadLocal
  • Context维持着入口节点(entranceNode)、本次调用链路的curNode(当前资源节点)、调用来源(origin)等信息
  • 后续的Slot都可以通过Context拿到DefaultNode或者ClusterNode,从而获取统计数据,完成规则判断
  • Context初始化的过程中,会创建EntranceNode,contextName就是EntranceNode的名称。
// 创建context,包含两个参数:context名称,来源名称
ContextUtil.enter("contextName","originName");

@SentinelResource

在SentinelResourceAspect通过aop切面,通过SentinelResource注解标记资源
在这里插入图片描述

SentinelWebAutoConfiguration implements WebMvcConfigurer

在这里插入图片描述

ProcessorSlotChain执行流程

每个资源都需要执行
在这里插入图片描述

StatisticSlot

StatisticSlot负责统计实时调用数据,包括运行信息(访问次数,线程数)、来源信息等。
StatisticSlot是实现限流的关键,其中就滑动时间窗口算法维护了计数器,统计进入某个资源的请求次数

AuthoritySlot授权规则

在这里插入图片描述

SystemSlot系统保护规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值