哨兵sentinel
Posted 大前端工程师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哨兵sentinel相关的知识,希望对你有一定的参考价值。
与Hystrix功能对比
|
Sentinel |
Hystrix |
---|---|---|
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于 RxJava) |
动态规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持预热模式、匀速器模式、预热排队模式 | 不支持 |
系统自适应保护 | 支持 | 不支持 |
控制台 | 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 |
Hystrix关注点:以 隔离、限流、熔断 为主的容错机制,被限流和被熔断的调用将会快速返回,触发fallback机制。
Sentinel关注点:多样化的流量控制;熔断降级;系统负载保护;实时监控和控制台(开源基于内存,需要持久化开发)。
隔离设计对比
Hystrix 支持线程池隔离 和 信号量隔离 两种隔离策略。线程池隔离针对不同的group创建不同的线程池,隔离性比较好,但达到最大线程数并队列排满后触发限流,但缺点就是线程上下文切换代价较大。信号量隔离是在某commandKey资源调用的并发数,当达到最大并发数触发限流,但没有线程池的timeout策略。原来我们web服务使用线程池隔离,单台服务器启动线程600+,后参考网关配置,修改为信号量隔离。
Sentinel 通过并发线程池模式的流量控制来提供信号量隔离的功能,并结合基于响应时间的熔断降级策略,当资源的响应时间较高时触发降级。
Sentinel特性
流量控制
关注运行指标:QPS、并发数、系统负载等。
直接拒绝模式
超出的请求直接拒绝。
热点参数限流模式
能够实时统计热点参数,并针对热点参数的资源调用进行流量控制。比如机扫接口可以控制某用户访问QPS。
慢启动预热模式
当流量激增时,控制流量通过的速率,并缓慢增加,给系统预热时间。比如网贷列表会查询用户群组,第一次访问不会命中Redis缓存,导致大量请求从数据库查询数据。
匀速器模式
严格控制了请求通过的时间间隔,同时堆积的请求将会排队,超时的请求直接被拒绝。
基于调用关系的限流模式
包括基于调用方限流、基于调用链入口限流、关联流量限流等。
系统自适应限流模式
从整体维度控制对应用入口流量进行控制,结合系统load、平均响应时间、入口QPS、线程数等几个维度指标监控,让系统的入口流量和系统的负载达到一个平衡。
限流方式
限流分为单机和分布式,单机限流是指当前进程中资源的QPS、并发线程数或者整个机器的负载,一旦超过规则配置就会触发限流。分布式限流需要启动集中管理的ticket服务器,该服务器针对制定的资源每秒只会生成一定量的ticket,在执行Resource代码之前需要获取ticket,所以分布式限流代价比单机高。
规则配置
在实际开发中,流控规则需要支持在控制台动态配置。Sentinel支持多种规则数据源配置,比如Redis,Zookeeper,mysql(不支持事件通知,定时轮询)等。
实时监控和dashboard
改造点:目前开源dashboard是基于内存的,需要改造。
概念
资源。Resource。实现类StringResourceWrapper、MethodResourceWrapper。
卡槽。Slot。
NodeSelectorSlot:主要负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级。
ClusterBuilderSlot:用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据。
LogSlot:记录Block 日志。
StatisticSlot:记录、统计不同纬度的 runtime 指标监控信息。是其他Slot限流、熔断规则的基础。
SystemSlot:系统保护,通过系统的状态,例如 load1 等,来控制总的入口流量。
AuthoritySlot:根据配置的黑白名单和调用来源信息,来做黑白名单控制。
FlowSlot:用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制。
DegradeSlot:熔断降级,通过统计信息以及预设的规则,来做熔断降级。
卡槽链。SlotChain。SlotChainBuilder(SPI接口),默认DefaultSlotChainBuilder,see Ctsp.lookProcessChain()
Context:维护着当前调用的元数据。每次调用 SphU.entry()
或 SphO.entry()
都需要在一个 context 中执行,如果没有当前执行时还没有 context,那么框架会使用默认的 context,默认的 context 是通过 MyContextUtil.myEnter()
创建的。我们可以通过调用 ContextUtil.enter()
方法来创建一个Context。
Entry:表示是否限流的一个凭证,像token。
Node:保存每个节点保存资源的实时统计信息,如passQps、blockedQps等。有了这些统计数据后,sentinel才能进行限流、降级等一系列的操作。StatisticNode通过持有Metric进行统计。
Metric:实时统计的度量接口。Node就是通过Metric进行数据统计的。Metric底层是通过滑动窗口来实现。
源码解析
滑动窗⼝ LeapArray
另外大前端工程师推荐一门课程:
以上是关于哨兵sentinel的主要内容,如果未能解决你的问题,请参考以下文章
[redis 源码走读] sentinel 哨兵 - 节点发现流程