Sentinel : 服务容错(降级熔断、流量整形)

什么是服务雪崩?

服务雪崩效应是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象。

我来用一个模拟场景带你感受一下服务雪崩的厉害之处。假设我有一个微服务系统,服务提供者不可用,比如,服务提供者A服务的访问压力过大,或者是网络原因,硬件原因等等多种因素,造成了服务提供者的不可访问。此时,相应的服务调用者B服务,就无法成功调用其提供的接口,并且造成线程阻塞,挤压线程。随着调用次数的增多,挤压的线程越来越多,那么这个服务调用者的抗并发量,就越来越少,直至最后崩掉。依次类推,B服务还为C服务提供了接口,那么B服务崩掉了,C服务的线程也开始挤压,直至C服务崩掉。依次类推,最后的效果就是所有的微服务都崩掉了。这就是服务雪崩效应。

Sentinel 服务容错的思路

Sentinel 是 Spring Cloud Alibaba 的一款服务容错组件,我们也经常把它叫做“防流量哨兵”。它是阿里巴巴双十一大促核心场景的保护神,内置了丰富的服务容错应用场景。它以流量作为切入点,通过各种内外防控手段达到维持服务稳定性的目的。

阿里系的 Sentinel 解决服务稳定性的思路是什么呢?就拿服务雪崩这种稳定性崩坏的场景来说,这种极端场景的发生有两个主要因素,一个是外部的高并发流量导致的请求数量增多,超过了集群的吞吐量,另一个是内部各种未知异常导致的接口响应异常超时。

我们可以采用“内外兼修”的思路来摆平服务雪崩的两个主要因素。所谓“内”,是指内部的异常治理,所谓“外”,则是外部用户流量的疏导。内外兼修的根本目的,是从内部和外部双管齐下对集群访问量进行减压,下面我们深入分析一下 Sentinel 是如何通过内外兼修的手段做服务容错的。

内部异常治理

在 Sentinel 中,我们可以采用降级和熔断的方式处理内部的异常。所谓降级,是指当服务调用发生了响应超时、服务异常等情况时,我们在服务内部可以执行一段“降级逻辑”。

在这里插入图片描述
在降级逻辑中,你可以选择静默处理,即忽略掉异常继续执行后续逻辑;或者你可以返回一个让业务可以继续执行下去的默认结果;又或者,在降级逻辑中尝试重试、或者恢复异常服务。从这里我们可以看出,降级是针对“单次服务调用异常”而执行的处理逻辑。

而所谓熔断,对已经挂掉的服务,直接不再进行调用,而是直接返回结果,这就是熔断。以此避免已经挂掉的服务对调用者造成的影响。

在这里插入图片描述
我们可以看出,当服务进入到了“熔断状态”以后,当前服务对下游目标服务的调用行为也就停止了,这样一来就大大降低了下游服务的访问压力。

关于降级熔断,我的经验是主链路服务(也就是核心业务链路的重要服务)一定要设置降级预案,防止服务雪崩在核心业务上的传播。除此之外,对于非核心链路的服务,应该设置手动降级开关,在大促等高并发场景下做主动降级,将额外的计算资源通过弹性方案匀给主链路服务。

关于降级的判定条件,需要结合全链路压测的结果来判定。通常我们在双 11 这类大促场景下,会组建一个稳定性团队专门负责全链路压测,并根据多轮次的压测结果来调整各个服务集群的水位,并对降级和限流判定条件进行微调,以期达到最佳的主链路吞吐量。

外部流量控制

提到外部流量控制,你一定会想到“限流”。没错,限流是流量整形 / 流控方案的一种。在 Sentinel 中我们可以根据集群的处理能力,为每个服务设置一个限流规则,从 QPS 维度或者并发线程数的维度控制外部的访问流量。一旦访问量超过阈值,后续的请求就会被“fast fail”,这是最为常用的一种限流手段。但 Sentinel 所支持的方案可不止这一种。

从流量整形的效果来看,除了“快速失败”以外,我们还可以在 Sentinel 中选择预热模型和排队模型。顾名思义,预热模型就是在一段规定的预热时间窗口内,由低到高逐渐拉高流量阈值,直到达到预设的最高阈值为止。

而对于排队模型来说,如果访问量超过了设定的阈值,服务请求不会被立即失败,而是被放入一个队列内等待处理,如果服务请求在预设的超时时间内仍然未被处理,那么就会被移出队列。

限流是挡在降级熔断之前的一道关卡,它是投入产出比最高的防护措施,为什么这样说呢?我们将限流和降级做一个比对:在熔断阶段,用户流量已经打到了服务器,尽管我们对下游服务的调用不会真实发起,但上游服务的计算资源实打实的被占用了;而限流则不同,如果用户流量在入口处就被限制,那么它并不会占用服务器的资源来处理这个请求。

Sentinel 工作原理

在这里插入图片描述

sentinel在内部创建了一个责任链,责任链是由一系列ProcessorSlot对象组成的,每个ProcessorSlot对象负责不同的功能,外部请求是否允许访问资源,需要通过责任链的校验,只有校验通过的,才可以访问资源,如果被校验失败,会抛出BlockException异常。
sentinel提供了8个ProcessorSlot的实现类,下面实现类功能介绍:

  • DegradeSlot:用于服务降级,如果发现服务超时次数或者报错次数超过限制,DegradeSlot将禁止再次访问服务,等待一段时间后,DegradeSlot试探性的放过一个请求,然后根据该请求的处理情况,决定是否再次降级。
  • AuthoritySlot:黑白名单校验,按照字符串匹配,如果在黑名单,则禁止访问。
  • ClusterBuilderSlot:构建ClusterNode对象,该对象用于统计访问资源的QPS、线程数、异常、响应时间等,每个资源对应一个ClusterNode对象。
  • SystemSlot:校验QPS、并发线程数、系统负载、CPU使用率、平均响应时间是否超过限制,使用滑动窗口算法统计上述这些数据。
  • StatisticSlot:用于从多个维度(入口流量、调用者、当前被访问资源)统计响应时间、并发线程数、处理失败个数、处理成功个数等。
  • FlowSlot:用于流控,可以根据QPS或者每秒并发线程数控制,当QPS或者并发线程数超过设定值,便会抛出FlowException异常。FlowSlot依赖于StatisticSlot的统计数据。
  • NodeSelectorSlot:负责收集资源路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级、数据统计。
  • LogSlot:打印日志。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20526.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20 散列表的查找

散列表的查找 简介:散列表(也成哈希表)是一种高效的数据结构,他可以在平均复杂度为O(1)的情况下实现查找、插入和删除操作。 哈希表的基本思想是根据关键字的值来计算其应存储的位置。这个计算过程就是通过哈希函数来实现的。 根…

深度学习-第T5周——运动鞋品牌识别

深度学习-第T5周——运动鞋品牌识别 深度学习-第T5周——运动鞋品牌识别一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目3、查看数据 四、数据预处理1、 加载数据1、设置图片格式2、划分训练集3、划分验证集4、查看标签 2、数据可视化3、检查数据4、配置数据集 …

西瓜书读书笔记整理(三)—— 第二章 模型评估与选择

第二章 模型评估与选择 第 2 章 模型评估与选择2.1 经验误差与过拟合1. 错误率 / 精度 / 误差2. 训练误差 / 经验误差 / 泛化误差3. 过拟合 / 欠拟合4. 学习能力5. 模型选择 2.2 评估方法1. 评估方法概述2. 留出法3. 交叉验证法4. 自助法5. 调参 / 最终模型 2.3 性能度量1. 回归…

Ada语言学习(1)Basic Knowledge

文章目录 说在前头命名注释数字变量变量类型signed integersEnumerationsFloating Points 类型重用(继承)类型转换 运算符属性(Attributes)练习 说在前头 本系列教程将会通过提问的方式来完成整个学习过程,因为当你能…

86盒IP对讲一键报警器

86盒IP对讲一键报警器 86盒IP对讲一键报警器:革命性保障生命安全的利器! 随着科技的飞速发展,我们的生活变得越来越方便和智能化。而86盒IP对讲一键报警器更是在这种背景下应运而生。这款产品不仅无缝对接各种手机APP,也可以在智…

RabbitMQ --- 惰性队列、MQ集群

一、惰性队列 1.1、消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。 解决消息堆积有三种…

互联网大厂测开面试记,二面被按地上血虐,所幸Offer已到手

在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 如何备战面试的? 第一步:准备简历 …

vue3回到上一个路由页面

学习链接 Vue Router获取当前页面由哪个路由跳转 在Vue3的setup中如何使用this beforeRouteEnter 在这个路由方法中不能访问到组件实例this,但是可以使用next里面的vm访问到组件实例,并通过vm.$data获取组件实例上的data数据getCurrentInstance 是vue3提…

51单片机也可以移植RTOS

说起RTOS移植,我们首先会想到32位单片机。 那么51单片机可以移植RTOS吗? 我的答案是,只要资源够用(ROM空间、RAM空间),可以移植。 前提是你对RTOS的实现原理非常清楚,并且可以自己完成移植工作…

数据可视化大屏的页面布局以及自适应

在做数据可视化大屏之前,我们需要考虑到页面的布局问题以及页面缩放自适应问题,下面分别就这两个方面讲解。 页面布局 类似这种页面区块的明显划分,常用的布局方式有两种: 1、flex布局 2、grid布局 grid布局 grid布局可以按区块…

深度学习用于医学预后-第二课第四周5-10节-为个体患者制定风险评估模型

文章目录 相对风险按风险对患者进行排序个体与基线风险吸烟者与不吸烟者年龄对风险的影响 在本课中,您将学习 Cox 比例风险模型(Cox Proportional Hazards Model)。您将了解 Cox 模型如何考虑患者变量来比较不同患者的风险,使用他们的患者概况。 但到目前…

mysql增量备份

目录 一、修改配置文件,开启增量备份功能 (1)查看是否已经开启了 (2)修改配置文件开启 (3)增量记录文件 二、还原增量备份 (1)修改了数据 (2&#xff…

nginx keepalive 高可用原理和实操

文章目录 前言一、nginxkeepalive搭建高可用服务方案?二、方案解析1.keepalive是什么2.nginx是什么 三、keepalive与nginx环境安装四、高可用配置实例总结 前言 一、nginxkeepalive搭建高可用服务方案? 使用nginx-keepalived双机热备机制,vi…

【云计算•云原生】4.云原生之什么是Kubernetes

文章目录 Kubernetes概念Kubernetes核心概念集群podConfigMap Kubernetes架构master节点的组件worker节点组件 Kubernetes网络架构内部网络外部网络 k8s各端口含义 Kubernetes概念 K8S就是Kubernetes,Kubernetes首字母为K,末尾为s,中间一共有…

BEV(0)---Transformer

1 Transformer Transformer是一个Sequence to Sequence model,特别之处在于它大量用到了self-attention,替代了RNN,既考虑了Sequence的全局信息也解决了并行计算的问题。 1.1 self-attention: ①. 输入x1 ~ x4为一个sequence&…

MySQL基础(三十一)数据库其它调优策略

1 数据库调优的措施 1.1 调优的目标 尽可能 节省系统资源 ,以便系统可以提供更大负荷的服务。(吞吐量更大)合理的结构设计和参数调整,以提高用户操作 响应的速度 。(响应速度更快)减少系统的瓶颈&#xf…

服务网关Gateway

前言 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 破坏了服务无状态…

DJ6-4 文件存储空间的管理

目录 6.4.1 空闲表 1、存储空间的分配与回收 2、空闲表法的优缺点 6.4.2 空闲链表 1、空闲盘块链 2、空闲盘区链 6.4.3 位示图 1、位示图的表示 2、存储空间的分配 3、存储空间的回收 4、位示图法的优缺点 6.4.4 成组链接 1、空闲盘块的组织 plus 个人理解图…

上海亚商投顾:沪指震荡调整跌0.21% 两市成交金额不足8000亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日震荡调整,上证50午后一度跌超1%,以保险为首的权重板块走低。军工股逆市大涨&a…

Python基本数据类型之一——set(集合)

Python基本数据类型之一——set(集合) 一、python集合定义 集合(set)是一个无序不重复元素的序列。基本功能是进行成员关系测试和删除重复元素。 二、创建方式 在Python中,创建集合有两种方式: 一种是用一对大括号将多个用逗号分隔的数据括起来。 另一种…