当前位置: 首页 > article >正文

深入理解Sentinel: 02 为什么需要服务降级以及常见的几种降级方式

为什么需要服务降级常见的降级方式有哪些上一篇跟大家分享了一个真实的服务雪崩的故事也分析了造成服务雪崩的真正原因那么如何才能避免服务雪崩的出现呢我知道你会说增加硬件没有什么是钱解决不了的。注意是避免在有限的硬件条件下避免流量突增导致服务雪崩。最好方案应该就是服务降级处理不过来就不处理了呗。当服务 B 业务线程池全部用满的状态时应该拒绝服务 A 的请求这一点 Dubbo 就做得很好了保护自己不被服务 A 拖垮服务 A 在服务 B 多次拒绝请求的情况下不应该再向服务 B 发送请求懂得体量它人不连累它人服务 A 在请求大量堆积的情况下也应该拒绝客户端的请求而不是继续堆积请求请求处理不过来堆积再多也没有任何意义。这些便是我们要讨论的服务降级。服务降级是服务自我保护的一种方式或者保护下游服务的一种方式用于确保服务不会受请求突增影响变得不可用至少确保服务不会奔溃。常见的服务降级实现方式有开关降级、限流降级、熔断降级。限流降级假设服务 A 需要依赖服务 B 完成客户端的一次请求那么服务 B 可以通过压测方式预测单节点所能处理的最大并发请求数只要最大并发数不超过自己的极限服务就能稳定运行。限制服务 B 处理最大并发请求就是限流例如限制每秒只处理 200 个请求超出的请求采取流量控制策略处理或直接拒绝或排队等待这便是限流降级。限流不仅可以限制单个节点的流量还可限制发往一个服务集群的流量即对一个服务集群限流。不过集群限流方式实现上需要合计单位时间内该集群的流量。流量控制除了直接拒绝外还可以采取一些策略尽可能处理更多的请求例如均速排队这种方式主要用于处理间隔性突发的流量例如在某一秒有大量的请求到来而接下来的几秒都处于空闲状态我们希望系统能够在接下来的空闲期间逐渐处理这些请求而不是在第一秒直接拒绝多余的请求。如果限流用在电商的下单场景会有什么影响一但限流就会有很多的用户下单失败这意味着收益的流失老板宁愿多花点钱搞多几台服务器也不愿看到用户想买东西都买不了的情况。所以限流降级不是解决这种问题的有效手段这种情况还是需要通过集群自动伸缩去解决。那限流降级适合哪些场景我认为秒杀场景最合适不过抢到商品的都是有效流量抢不到商品的都是无效流量对于无效流量我们可以采用直接拒绝或者匀速排队的流量控制策略。算法深度对比算法 实现复杂度 内存占用 是否支持突发 适用场景令牌桶 中 低几个long变量 是 允许流量突刺的通用场景漏桶 中 低 否 强制平滑流量的场景如数据库连接池保护滑动窗口 高 高需维护数组 可控 精确QPS控制防刷场景重点Sentinel的滑动窗口实现Sentinel并没有采用简单的令牌桶而是使用了滑动窗口LeapArray因为它能更精确地控制“每秒请求数”这种离散指标。它的核心代码逻辑简化版// 每个窗口存储一个 MetricBucket包含 passQps, blockQps, rt 等 public class WindowWrapT{private long windowStart;// 窗口开始时间 private T value;// 指标数据}// 滑动窗口数组通过时间戳定位到具体的窗口 public class LeapArrayT{private int windowLengthInMs;// 窗口长度如 1s private int sampleCount;// 窗口数如2-每个窗口 500ms private AtomicReferenceArrayWindowWrapTarray;}Sentinel默认统计1秒内的数据但通过将1秒拆分为2个500ms的窗口进行滑动实现了毫秒级的精准流控避免了令牌桶在窗口边界可能出现的“双倍请求”问题。限流的粒度与隔离在Java微服务中限流不能只做全局QPS更要做多维度限流。SentinelResource(valuegetOrder, blockHandlerhandleBlock, fallbackhandleFallback)public Order getOrder(Long orderId){// 业务逻辑}// 限流触发后的降级方法 public Order handleBlock(Long orderId, BlockException ex){//1. 记录限流日志异步打印避免影响主流程 //2. 返回友好提示returnOrder.createDegradeOrder(系统繁忙请稍后重试);}重点热点参数限流Sentinel支持针对特定的参数值如userId进行限流。原理是维护一个LRU结构的ParameterMetric对高频参数进行精细化控制。这是防止“恶意刷单”或“热点账户攻击”的关键。网关层限流 vs 服务层限流网关Spring Cloud Gateway适合做IP、设备指纹等粗粒度限流利用Redis Lua脚本做分布式限流。服务Spring Boot适合做业务维度如SKU、用户等级的限流通常使用Sentinel这种侵入式组件结合线程池隔离ThreadPoolExecutor来保护业务线程不被慢请求耗尽。熔断降级假设服务 A 需要依赖服务 B 完成客户端的一次请求服务 A 如果能够感知到服务 B 的状态在服务 B“不行”的时候不再去请求服务 B就能确保服务 A 自身不会受服务 B 的影响。那么如何知道服务 B 到底行不行呢假设一秒内向服务 b 发送 230 个请求结果有 30 个请求或超时异常或响应异常根据这个数字就可以预测后续请求服务 B 大概率也会响应异常。服务 B 已经处理不过来了那么后续的请求就没有必要再发送了反正发出去也是异常不如直接放弃。当服务 A 的下游服务 B 突然变得不可用或者不稳定时服务 A 可以自动切断与服务 B 的交互从而保证自己可用就像保险丝一样当电流异常升高到一定高度的时候保险丝切断电流这就是熔断降级。但是服务 B 不会一直不行当服务 B 恢复之后服务 A 也应该能感知到才行所以熔断需要以一个时长为周期比如 1 秒这个周期也称为时间窗口每个时间窗口都重新计算请求总数、异常总数这些指标数据这样就能实现自动恢复。熔断降级不是只能由“别人”来实现自己也可以实现。别人发现你的缺点可能会疏远你对你印象不好实际上我们自己也能够发现自己的缺点当自己发现自己缺点时可以及时弥补这一缺点避免给别人不好印象。熔断降级也是如此服务提供者也能自己统计接口的处理情况当发现请求处理不过来时触发熔断拒绝上游的请求如果可以自己自动伸缩就更好了。所以熔断降级可以在消费端实现也可以在提供端实现。如果对接的是第三方的接口那么就只能是在消费端实现。Sentinel 支持的系统负载保护也算是一种熔断降级方式。熔断降级的常见降级策略在每秒请求异常数超过多少时触发熔断降级在每秒请求异常错误率超过多少时触发熔断降级在每秒请求平均耗时超过多少时触发熔断降级响应异常数越多或者异常比率越大、平均耗时越高都说明服务的处理能力在下降。开关降级开关降级也是服务降级的一种实现方式。开关降级用于在有限的硬件条件下提升系统核心功能的并发处理能力以最少的硬件成本应对流量高峰。做电商项目的朋友可能接触最多的就是开关降级一般我们在搞大促之前都会通过开关方式将一些无关紧要的业务接口变成“不可用”。例如通过配置中心或者通过 Redis 控制服务降级开关当开关打开时需要降级的接口直接响应一个表示当前服务降级的状态码给调用者。控制服务降级开关的方式可以是人工也可以是定时任务在某个时段开启、某个时段关闭。定时任务控制开关方式适合固定时间段请求突增的场景例如点外卖的高峰期在中午那么就可以在 11 点左右打开开关在 13 点半之后关闭开关。实现方式不仅仅是布尔值在Java中开关降级的核心是配置的动态刷新。低级做法使用volatile变量 定时任务轮询数据库。高级做法利用配置中心如Nacos、Apollo的长连接监听机制。ComponentpublicclassDowngradeSwitch{// 使用 AtomicBoolean 保证内存可见性且 CAS 操作轻量privateAtomicBooleanrecommendSwitchnewAtomicBoolean(true);PostConstructpublicvoidinit(){// 监听 Nacos 配置变化ConfigService.addListener(downgrade.properties,(config)-{Stringvalueconfig.getProperty(recommend.downgrade,false);booleannewStatusBoolean.parseBoolean(value);recommendSwitch.set(newStatus);// 高级点记录配置变更日志发送到监控中心Metrics.recordConfigChange(recommendSwitch,newStatus);});}publicbooleanisRecommendOpen(){returnrecommendSwitch.get();}}重点为什么用AtomicBoolean而不是synchronized因为降级开关的判断频率极高每次请求AtomicBoolean基于CAS在低竞争下性能远优于加锁。避免配置中心故障的影响监听器启动时必须加载本地缓存配置防止配置中心宕机导致开关状态丢失Apollo有ConfigService.getAppConfig()的本地缓存机制。降级后的行为优雅的“空对象模式”开关降级后不是简单地return null而是返回一个有意义的空对象。publicclassRecommendService{publicListProductgetRecommendList(LonguserId){if(downgradeSwitch.isRecommendOpen()){// 降级返回静态的默认推荐列表来自本地内存或CDNreturngetDefaultRecommendList();}// 正常调用RPC或数据库returnrpcCall(userId);}privateListProductgetDefaultRecommendList(){// 使用 Guava LoadingCache 定时刷新本地默认数据returnLocalCache.get(default_recommend);}}重点降级时尽量避免查询任何外部依赖数据库、Redis、RPC否则可能引发级联降级。最佳实践是将兜底数据放在本地内存缓存Caffeine/Guava Cache中甚至直接使用final static常量。总结服务降级只是为了保障服务能够稳定运行应对流量突增用降级牺牲一些流量换取系统的稳定。限流降级与熔断降级都可以实现在消费端限流或者服务端限流限流可以采取流量控制策略处理超过阈值的流量。限流降级即便没有达到系统的瓶颈只要流量达到设定的阈值超出部分就会触发限流降级而熔断降级可以实现尽最大的可能去完成所有的请求容忍一些失败熔断降级也能自动恢复。开关降级适用于促销活动这种可以明确预估到并发会突增的场景。

相关文章:

深入理解Sentinel: 02 为什么需要服务降级以及常见的几种降级方式

为什么需要服务降级,常见的降级方式有哪些?上一篇跟大家分享了一个真实的服务雪崩的故事,也分析了造成服务雪崩的真正原因,那么,如何才能避免服务雪崩的出现呢?我知道你会说:增加硬件&#xff0…...

WaveTerm终极指南:5分钟掌握开源跨平台AI集成终端

WaveTerm终极指南:5分钟掌握开源跨平台AI集成终端 【免费下载链接】waveterm An open-source, cross-platform terminal for seamless workflows 项目地址: https://gitcode.com/GitHub_Trending/wa/waveterm WaveTerm是一款开源、跨平台的现代化终端工具&am…...

Fish-Speech-1.5语音克隆取证:AI生成音频检测技术

Fish-Speech-1.5语音克隆取证:AI生成音频检测技术 1. 引言 随着语音合成技术的飞速发展,像Fish-Speech-1.5这样的先进模型已经能够生成几乎无法与真人语音区分的高质量合成音频。这给音频内容的真实性和可信度带来了新的挑战。无论是法律证据、新闻采访…...

VSCode开发Pi0机器人控制中心插件全流程指南

VSCode开发Pi0机器人控制中心插件全流程指南 1. 开发环境搭建 1.1 安装VSCode和相关扩展 首先确保你已经安装了最新版本的VSCode。可以从VSCode官网下载并安装。 安装完成后,需要添加几个必要的扩展: # 安装Node.js扩展包 code --install-extension…...

Keil MDK-ARM编辑器与界面定制全攻略

Keil MDK-ARM配置详解:编辑器与界面定制指南1. 开发环境配置概述在嵌入式开发过程中,Keil MDK-ARM作为主流的集成开发环境,其配置选项直接影响开发效率和编码体验。Configuration配置是针对IDE本身的设置,与工程目标选项配置&…...

计算机毕业设计:基于爬虫与可视化的美食菜谱数据分析平台 Django框架 爬虫 机器学习 数据分析 可视化 食物 食品 菜谱(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

革新性Windows应用开发:Template Studio一站式解决方案,如何30分钟构建专业级应用?

革新性Windows应用开发:Template Studio一站式解决方案,如何30分钟构建专业级应用? 【免费下载链接】TemplateStudio Template Studio accelerates the creation of new WinUI 3, WPF, and UWP apps using a wizard-based experience. 项目…...

高效提取道路数据:QGIS+QuickOsm插件实战教程(含EPSG:3857坐标系设置技巧)

高效提取道路数据:QGISQuickOsm插件实战教程(含EPSG:3857坐标系设置技巧) 在数字化城市规划和交通网络分析中,道路数据的精准提取是基础性工作。传统人工采集方式耗时费力,而OpenStreetMap(OSM)…...

Reach UI 与 TypeScript 的终极指南:如何获得完美的类型安全体验

Reach UI 与 TypeScript 的终极指南:如何获得完美的类型安全体验 【免费下载链接】reach-ui The Accessible Foundation for React Apps and Design Systems 项目地址: https://gitcode.com/gh_mirrors/re/reach-ui 在构建现代 React 应用时,类型…...

Docker磁盘爆满?手把手教你无损迁移数据到新硬盘(附CentOS 7.9实战记录)

Docker磁盘爆满应急指南:零停机迁移数据到新存储的全流程解析 凌晨三点,服务器告警短信惊醒梦中人——"/var分区使用率99%"。作为刚接手运维工作的开发者,这种场景往往让人手足无措。本文将以CentOS 7.9环境为例,详解如…...

Grafika全帧矩形绘制优化:5个提升OpenGL ES性能的终极技巧

Grafika全帧矩形绘制优化:5个提升OpenGL ES性能的终极技巧 【免费下载链接】grafika Grafika test app 项目地址: https://gitcode.com/gh_mirrors/graf/grafika Grafika是一款专注于Android平台OpenGL ES图形渲染测试的开源项目,通过其FullFrame…...

掌握xUtils3 ORM模块:Android数据库操作的7个黄金法则与实战技巧

掌握xUtils3 ORM模块:Android数据库操作的7个黄金法则与实战技巧 【免费下载链接】xUtils3 Android orm, bitmap, http, view inject... 项目地址: https://gitcode.com/gh_mirrors/xu/xUtils3 在Android开发中,高效的数据持久化是应用性能的关键…...

Clinic.js Doctor终极指南:如何自动检测和解决Node.js性能问题

Clinic.js Doctor终极指南:如何自动检测和解决Node.js性能问题 【免费下载链接】node-clinic Clinic.js diagnoses your Node.js performance issues 项目地址: https://gitcode.com/gh_mirrors/no/node-clinic Clinic.js Doctor是Node.js性能诊断工具套件中…...

终极魔兽争霸III优化指南:5个高效配置技巧解决现代系统兼容性问题

终极魔兽争霸III优化指南:5个高效配置技巧解决现代系统兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专…...

保姆级教程:IndexTTS-2-LLM从部署到生成语音的全流程实战

保姆级教程:IndexTTS-2-LLM从部署到生成语音的全流程实战 1. 项目介绍与核心优势 1.1 什么是IndexTTS-2-LLM? IndexTTS-2-LLM是一款基于大语言模型的智能语音合成系统,它能够将文字转换为自然流畅的语音。与传统的语音合成技术相比&#x…...

张量计算卡顿的9大隐形杀手,第4个90%工程师从未排查过:从stride misalignment到NCCL超时连锁反应

第一章:张量计算卡顿的全局诊断框架张量计算卡顿并非孤立现象,而是硬件资源调度、内存带宽、计算图优化与运行时环境耦合失衡的综合体现。构建全局诊断框架的核心在于打破“单点排查”惯性,建立从设备层、驱动层、框架层到应用层的可观测性链…...

全球地理边界数据宝库:如何用3行代码搞定地图开发中的边界难题

全球地理边界数据宝库:如何用3行代码搞定地图开发中的边界难题 【免费下载链接】world-geojson GeoJson for all the countries, areas (regions) and some states. 项目地址: https://gitcode.com/gh_mirrors/wo/world-geojson 还在为地图项目寻找精准的地理…...

【协议森林】F-Stack与DPDK融合实践:用户态协议栈加速TCP通信的架构解析

1. 为什么需要用户态协议栈? 传统的内核协议栈在处理网络数据包时,就像是一个繁忙的十字路口,所有车辆(数据包)都要经过红绿灯(中断处理)和收费站(内存拷贝)。当网卡性能…...

手把手教你用PHPStudy在本地搭建彩虹易支付系统(2025版),集成CoinPayments插件收USDT

手把手教你用PHPStudy在本地搭建彩虹易支付系统(2025版),集成CoinPayments插件收USDT 在数字货币日益普及的今天,掌握一套支持加密货币的支付系统搭建技能变得尤为重要。本文将带你从零开始,在Windows本地环境中使用P…...

像素幻梦工坊实操案例:为Unity游戏项目批量生成像素动画序列帧

像素幻梦工坊实操案例:为Unity游戏项目批量生成像素动画序列帧 1. 像素幻梦工坊简介 Pixel Dream Workshop(像素幻梦工坊)是一款基于FLUX.1-dev扩散模型的像素艺术生成工具。它采用16-bit现代明亮风格设计,为游戏开发者提供沉浸…...

如何用scan4all进行移动安全检测:APP后端服务安全扫描终极指南

如何用scan4all进行移动安全检测:APP后端服务安全扫描终极指南 【免费下载链接】scan4all 项目地址: https://gitcode.com/gh_mirrors/sc/scan4all 移动应用安全检测是当今数字时代的关键挑战,而scan4all作为一款强大的开源安全扫描工具&#xf…...

Mcrouter监控与调试:使用丰富统计和调试命令的终极指南

Mcrouter监控与调试:使用丰富统计和调试命令的终极指南 【免费下载链接】mcrouter Mcrouter is a memcached protocol router for scaling memcached deployments. 项目地址: https://gitcode.com/gh_mirrors/mc/mcrouter Mcrouter作为memcached协议路由器&a…...

Decky Loader插件发布终极指南:从开发到上架的完整流程

Decky Loader插件发布终极指南:从开发到上架的完整流程 【免费下载链接】decky-loader A plugin loader for the Steam Deck. 项目地址: https://gitcode.com/gh_mirrors/de/decky-loader Decky Loader是一款专为Steam Deck设计的插件加载器,它能…...

语音去混响技术新范式:Nara WPE的跨框架实现与工程化实践

语音去混响技术新范式:Nara WPE的跨框架实现与工程化实践 【免费下载链接】nara_wpe Different implementations of "Weighted Prediction Error" for speech dereverberation 项目地址: https://gitcode.com/gh_mirrors/na/nara_wpe 一、问题场景…...

智能车竞赛中的AI视觉:Z-Image-Turbo生成训练数据增强方案

智能车竞赛中的AI视觉:Z-Image-Turbo生成训练数据增强方案 参加智能车竞赛的朋友们,肯定都遇到过这样的难题:辛辛苦苦采集了几百张赛道图片,训练出来的模型,一到赛场上光线稍微一变,或者换个背景&#xff…...

如何快速上手ComfyUI-AnimateDiff-Evolved:新手完整教程

如何快速上手ComfyUI-AnimateDiff-Evolved:新手完整教程 【免费下载链接】ComfyUI-AnimateDiff-Evolved Improved AnimateDiff for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-AnimateDiff-Evolved ComfyUI-AnimateDiff-Evolved是一款强大…...

Auxílio RS视频教程:从入门到精通的完整指南 [特殊字符]

Auxlio RS视频教程:从入门到精通的完整指南 🚀 【免费下载链接】backend Auxlio RS: Projetos de Resposta a Emergncias por Chuvas e Alagamentos 项目地址: https://gitcode.com/GitHub_Trending/bac/backend Auxlio RS是一个专门为巴西南里奥…...

基于Matlab的‘多模型加权自适应控制器‘,针对非线性时变工业过程的控制优化

65.基于matlab的多模型加权自适应控制器,对于非线性时变工业过程对象,建立模型集来覆盖被控对象动态特性,分别建立相应的内模控制器,在系统变工况运行时,进行多模型加权自适应控制,与传统单内模控制相比&am…...

餐饮餐厅点餐订餐系统 微信小程序

目录需求分析与功能规划小程序注册与开发准备前端界面设计与开发后端系统开发测试与上线运营与迭代项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与功能规划 明确餐厅点餐订餐系统的核心需求:在线点餐、订…...

ssm+java2026年毕设书憩廊在线图书管理系统【源码+论文】

本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于图书管理系统的研究,现有研究主要以传统单机版图书管理软件或基于C/S架构的管理系统为主,专门针对…...