聊聊Sentinel的熔断降级

Sentinel的熔断降级实现有两个模式,一开始是基于熔断规则的简单处理(说简单其实不简单),目前已改为了基于断路器模式实现,这也是业内常见实现。

断路器模式

断路器模式中讨论了 3 个主要状态。他们是:

CLOSED
OPEN
HALF OPEN
让我们简要了解一下状态……

CLOSED State
当正在交互的两个服务都启动并运行时,断路器默认关闭。断路器会持续统计远程 API 调用的次数。

OPEN State
一旦远程 API 调用失败百分比超过给定阈值,断路器就会将其状态更改为 OPEN 状态。调用微服务会立即失败,返回异常。也就是说,流量中断了。

HALF OPEN State
在 OPEN 状态停留给定的超时时间后,断路器自动将其状态变为 HALF OPEN 状态。在这种状态下,只允许有限数量的远程 API 调用通过。如果失败调用计数大于此有限数量,则断路器再次变为 OPEN 状态,流量继续中断。否则关闭断路器,流量恢复正常。

流程图可描述如下:
image

实现

最经典的实现就是Hytrix,而且它的实现是基于响应式编程来做的;其次Spring官方出品的Resilience4j、Sentinel也是基于此方式实现。

Sentinel熔断降级实现关键对象

我个人对Sentinel比较推崇,功能强大,源码易读,而且设计架构简介。Sentinel框架中有三个关键的对象是一直贯彻整个框架的,也是最关键的三个个点:ProcessorSlot、Rule(规则)与指标数据统计(Bucket)。

ProcessorSlot

这里不多讲,实现了责任链模式,基于SPI机制支持可扩展性,这个设计很好,值得借鉴。其实也类似MVC框架的管道模式。DegradeSlot插槽实现断路器模式,最终达到限流降级的目的。

规则与指标数据统计

对于熔断降级或是限流等场景,最后的实现结果一定是由于当前的流量或是异常等维度指标超出了限定值,这个过程就是规则(Rule)的体现,而规则背后的开关实现就是指标数据的统计。这是我个人的理解,大白话表述。

指标数据统计在Sentinel中对应着三个抽象;暂时先不表述。如果要我来实现的话,我的思考是,有一个数据结构存储着在某个时间段内,统计了某些维度的数据(比如成功、异常、总计),而且这个数据结构是随着时间的推移不断地统计;现在给定一个时间点或是时间段,判断是否需要限流或是熔断;在这里就需要注意两个问题点:

  1. 给定的时间是否在统计的时间范围内
  2. 在统计的时间范围内,如果定位到对应的数据结构
指标统计抽象

Sentinel是基于滑动窗口实现资源的实时指标数据统计的。

Sentinel使用Bucket统计一段时间内的各项指标数据,这些指标数据包括请求总数、成功总数、异常总数、总耗时、最小耗时等。一个Bucket可以记录1秒内的数据,也可以记录10毫秒内的数据,这由采样周期决定。采样周期就是每个Bucket的时间窗口大小。

WindowWrap,用于记录Bucket的时间窗口信息(包括时间窗口的开始时间戳和大小),而WindowWrap数组就是一个滑动窗口。当收到一个请求时,可以根据收到请求时的时间戳和滑动窗口大小计算出一个索引值,从滑动窗口(WindowWrap数组)中获取一个WindowWrap类,从而获取WindowWrap类包装的Bucket,并调用Bucket实例的add方法统计指标。

LeapArray,Sentinel 中统计指标的基本数据结构。基于滑动窗口算法来计算数据返回windowWrap时间窗口对象。前面说的两个问题在这个数据结构里面都有对应的算法实现,当然还有别的统计算法,但最后都是算时间窗口。

脑图概览

image

本文转载于网络 如有侵权请联系删除

相关文章

  • 【ArcGIS技巧】利用ArcGIS做土地利用变化分析(一)

    今天呢,再次给大家带来一个实用性的教程,使用ArcGIS制作土地利用变化分析,本次教程应该会分为三部分,今天的这第一步分呢先分析图形及其属性的一个变化!环境:WIN10软件:ArcGIS10.2.2软件准备:ArcMAP数据准备:自行矢量化期望结果:知晓地类变化本次演示呢,我只是随意矢量化了一部分影像做教程,大家可以使用其他数据进行实操。处理过程 1、开ArcMAP,加载我们矢量化好的数据。2、调用联合工具,联合两个图层。 工具位置:系统工具箱——分析工具——叠加分析——联合3、新建一个变化字段4、使用字段计算器对比属性值的变化,解析程序使用Python,比较两个字段的内容,如果属性没变,就赋值为1,如果属性变化了就赋值为0。这里我们用IF函数中比较字段值,相同就赋值1,不相同就赋值0 5、对比结果如下从上图颜色变化可知,此区域的变化还是不小的。6、如果想更直观的表示地类是从什么变化为什么,可以再次新建一个字段,连接变化的两个字段并赋值7、成果展示以上就是今天ArcGIS做土地利用变化分析(一)的教程,应该会对你们有所帮助!

  • ESP32-C3上手体验与​开发环境搭建

    ESP32-C3上手体验与开发环境搭建1.说明2.开发环境搭建2.1下载ESP-IDF的环境2.2编译代码2.3程序烧录与验证3.ESP32-C3LED分析4.使用WiFi功能5.小结1.说明ESP32-C3采用的是RISCV架构的芯片,目前又专注RISCV研究,所以特此来研究一下这个芯片的使用情况。该芯片的主要特性如下:采用RSCV-V32位的单核处理器,四级流水线架构,主频是160MHz。内置400KBSRAM,384KBROM完善的Wi-Fi子系统低功耗蓝牙外设支持方面外设备注GPIOx22SPIx3UARTx2I2Cx1I2Sx1红外收发器2LEDPWM6USB串口1看门狗3从芯片的设计的定位上来看,主要定位在智能家具或者小型的物联网设备端等等。下面来体验一下开发流程。2.开发环境搭建要想使用该芯片,开发环境搭建很关键,这样才能玩的更加的好。本文主要是基于Ubuntu20.04进行环境搭建,当然也支持Windows等平台的环境搭建。ESP32-C3Ubuntu20.04PC串口线2.1下载ESP-IDF的环境注意:当前ESP-IDF还没有集成在ESP-IDF正式发布的版本(v4

  • dotnet C# 将 Byte 二进制数组使用不安全代码快速转换为 int 或结构体数组

    我在写一个有趣的WPF应用,我会不断收到从硬件发过来的数据,这些数据被使用Byte[]数组进行传输。我想要使用最快的方法转换为我的int数组或者转换为结构体数组,此时可以使用不安全代码的方式转换假定有一个二进制数组Byte[]是使用如下代码创建的varmemoryStream=newMemoryStream(); varbinaryWriter=newBinaryWriter(memoryStream); for(inti=0;i<100;i++) { binaryWriter.Write(i); } memoryStream.Position=0; varbyteList=memoryStream.ToArray();复制也就是说本质这是一个int数组,在获取到byteList时,可以如何快速转换为int数组使用?如果使用不安全代码,那么转换逻辑将会非常简单unsafe { varlength=byteList.Length/sizeof(int); fixed(byte*bytePointer=byteList) { int*intList=(int*)bytePoint

  • 大数据平台之权限管理组件 - Aapche Ranger

    ApacheRanger简介ApacheRanger提供一个集中式安全管理框架,并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。Ranger优点:丰富的组件支持(HDFS,HBASE,HIVE,YARN,KAFKA,STORM)提供了细粒度级权限控制(hive列级别)权限控制插件式,统一方便的策略管理支持审计日志,记录各种操作的日志,提供统一的查询接口和界面支持和kerberos的集成,提供了Rest接口供二次开发为什么选择Ranger:多组件支持,基本覆盖目前现有技术栈的组件支持审计日志,可以查找到用户操作明细,方便问题排查反馈拥有自己的用户体系,方便和其他系统集成,提供接口调用Ranger的架构图: RangerAdmin:对于各服务策略进行规划,分配相应的资源给相应的用户或组以RESTFUL形式提供策略的增删改查接口统一查询和管理页面ServicePlugin:嵌入到各系统执行流程中,定期从RangerAdmin拉取策略根据策略执行访问

  • 删库跑路升级版,著名大厂员工离职为报复公司,直接删虚拟机!

    全世界的程序员都一样,被逼急了都会做出毁灭性的行为...1来自印度的程序员在大西洋的加利福尼亚州,有一个程序员叫做SudhishKasabaRamesh,因为名字比较长,后面我们称他为SKR。SKR是一名来自印度的程序员,在美国拿着HB-1签证(美国的工作签证)在美国工作,跟我差不多一样大今年30岁。如果不是因为入职了思科,估计他就是一个普通的程序员,谁也不认识他,他也更不可能两年后在行业搞出这么大一个事情来。SKR之前的经历不太清楚,但在2016年7月他入职当时的思科,估计在这家公司干的也不咋地,很快到2018年4月离职了。(图片来自网络,非本人)2干了惊天大事可能是和前雇主思科分手的时候闹得不太愉快,以至于SKR在离职5个月后心里面还是很不爽,于是未经授权远程连接到思科在AWS上的系统上。可能它也没想到离职这么久,竟然还可以直接登录到公司的服务器,可见全球的大公司权限管理做的也很一般呀。 可能当时心情也不太美丽,于是在GoogleCloudProject帐户中部署了一个代码,这段代码的功能很爆炸。这段代码运行后,直接删除了456个用于CiscoWebExTeams应用程序的虚拟机,

  • 从Webpack源码探究打包流程,萌新也能看懂~

    简介上一篇讲述了如何理解tapable这个钩子机制,因为这个是webpack程序的灵魂。虽然钩子机制很灵活,而然却变成了我们读懂webpack道路上的阻碍。每当webpack运行起来的时候,我的心态都是佛系心态,祈祷中间不要出问题,不然找问题都要找半天,还不如不打包。尤其是loader和plugin的运行机制,这两个是在什么时候触发的,作用于webpack哪一个环节?这些都是需要熟悉webpack源码才能有答案的问题。大家就跟着我一步步揭开webpack的神秘面纱吧。如何调试webpack本小节主要描述了,如何调试webpack,如果你有自成一派的调试方法,或者更加主流的方法,可以留言讨论讨论。简易版webpack启动工欲善其事,必先利其器。我相信大家刚学习webpack的时候一定是跟着官方文档运行webpack打包网站。webpack上手文档,->萌新指路 初级操作应该依赖webpack-cli,通过在小黑框中输入npxwebpack--configwebpack.config.js,然后enter执行打包。虽然webpack-cli会帮助我们把大多数打包过程中会出现的问考虑进

  • 聊聊curator recipes的LeaderLatch

    序本文主要研究一下curatorrecipes的LeaderLatch实例@Test publicvoidtestCuratorLeaderLatch()throwsException{ CuratorFrameworkclient=CuratorFrameworkFactory.newClient("localhost:2181",newExponentialBackoffRetry(1000,3)); client.start(); StringleaderLockPath="/leader-lock2"; List<LeaderLatch>latchList=IntStream.rangeClosed(1,10) .parallel() .mapToObj(i->newLeaderLatch(client,leaderLockPath,"client"+i)) .collect(Collectors.toList()); latchList.parallelStream() .forEach(la

  • Flex2 Tree从XML文件中加载数据

    <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"      fontFamily="simsun" fontSize="12"      layout="absolute" creationComplete="menu.send();" width="242" height="442"> <mx:Script>     <![CDATA[         import mx.collections.ArrayCollection;         import mx.rpc.events.ResultEvent;         [Bindable]         private var menus:XML;        

  • 为什么Web 设计会‘死’?

    高质量的Web模板,成熟的DesignPattern,人工智能的引用,移动技术的冲击是否标志着WebDesign结束的时代已经到来?WebDesign最终也未避免与“死亡”这个词的关联,Web网站自身已不是Internet体验的核心,这就是为什么设计者需要面临新的挑战——产品和生态系统。”WebDesign似乎已经没有未来“,这句话可能会引起争议,那么请听我娓娓道来,为什么WebDesign没有未来,而Web设计者又能够做些什么改变来挽回?作为一个单独的开发领域,WebDesign已经耗尽了所有的可能性,新兴的技术和文化趋势相结合已经明显标识了需要一个更广泛更有意义的方法的出现。让我们一起来看看WebDesign死亡症状!症状1:模板的商品化如今,你所看到的Web网站,大都是由存在的成熟的框架或服务搭建的,如WordPress,Blogger,Drupal等。框架已经提供了构建Web网站的基础和快捷方式,因此只需要花费很少的时间就能够创建属于你自己的网站,大部分的时间都只是花费在网站内容的构建。框架自然是带来了便捷,高效,而使用这些框架也带来一系列的问题,一款全球免费的或是付费的模板都

  • 恭喜磊哥喜提n+1

    昨天下午两点多磊哥突然喊我下楼,第一反应是“这孙子,抽烟就直说,还说个事,你以外你是吉祥村大姐啊”。 心里骂完以后我慢慢悠悠下楼了,见他在打电话我先默默点上一支,准备待他结束以后对其发起灵魂拷问。 电话打完了,正当我口吐芬芳之际他来了一句:“我今天下班就不来了。”   “中彩票了?” “刚老板找我谈话,一进门就说咱都是成年人,我就直说了,团队现在不需要自动化测试,两个选择,要么转业务测试,要么n+1。”  听他说完我一时语塞,不知道说些什么,好在他状态不错,我也就故作轻松的跟他开玩笑:“恭喜磊哥喜提大礼包。”   上一次经历这种事是2020年的四月份,老东家由于口罩原因业务全线停摆,二月份开始延迟发放工资,三月份发50%,四月份缓发且没有承诺期限,四月底旁边的工位空了一大片,有主动离开的,也有被暴力裁员走的,他们比磊哥好的一点是提前预料到会有这么一天,悲催的是没有n+1,甚至前几个月拖欠的工资可能也不了了之。   看着空荡荡的办公区,心里多少有点难受,曾经一起奋斗的战友就这么离开了?有些同事被裁的时候还隔离在家,裁员通知书和离职证明都是顺丰快

  • .NET WebAPI 实现 接口版本控制并打通 Swagger支持

    我们在开发webapi项目时如果遇到api接口需要同时支持多个版本的时候,比如接口修改了入参之后但是又希望支持老版本的前端(这里的前端可能是网页,可能是app,小程序等等)进行调用,这种情况常见于app,毕竟网页前端我们可以主动控制发布,只要统一发布后所有人的浏览器下一次访问网页时都会重新加载到最新版的代码,但是像app则无法保证用户一定会第一时间升级更新最新版的app,所以往往需要api接口能够同时保持多个版本的逻辑,同支持新老版本的调用端app进行调用。 针对上面的描述举一个例子: 比如一个创建用户的接口,api/user/createuser 如果我们这个时候对该接口的入参和返回参数修改之后,但是又希望原本的api/user/createuser接口逻辑也可以正常运行,常见的做法有以下几种: 修改接口名称,将新的创建用户接口地址定义为api/user/newcreateuser url传入版本标记,将新的创建用户接口地址定义为api/user/createuser?api-version=2 header传入版本标记,通过校验header中的api-version字段的值,用来

  • github 配置host加速

     Step1:查询https://github.com/的IP地址。      140.82.112.4github.com    

  • 百度网盘下载慢怎么解决--解决方法

    引用:http://www.xitongcheng.com/jiaocheng/dnrj_article_69216.html 按照以下步骤即可: 结果对比:

  • 途家网 BI 总监分享:如何搭建一个数据分析团队

    以前说到数据驱动业务增长,我们第一个想到的可能是数据分析的方法。但就目前来看,数据驱动业务的增长已经成为一个不仅仅是分析方法和模型,而是包括了数据人才培养、数据架构的设计,甚至整个公司组织架构设计的企业治理问题。所以,今天我想从途家数据团队的发展、部门的构成及职责这两个方面去跟大家分享一下途家网的一些实践。 如果对一个公司的业务没有足够的了解,是没有办法去做分析的,今天演讲中阐述的不管是组织架构的设计还是分析案例,都是紧紧围绕途家网的商业模型展开,所以我先大概介绍一下途家的业务:途家网是一家已经进入“独角兽”俱乐部的全球公寓民宿预订平台,于2011年12月1日正式上线。我们提供服务公寓、度假公寓、别墅、客栈、民宿等各类度假租赁产品的在线搜索、查询和交易服务。 一、数据分析团队发展的5个阶段 我们途家网成立五年以来,整个数据团队的成长也是经历了五个阶段。 途家网数据团队的发展线路图 第一阶段:从2011年底途家网正式上线到2013年2月,这个阶段我们没有专业的数据分析师。 在公司刚刚成立的阶段,没有招专业数据分析师的必要,但是这个时候仍然需要做数据分析。途家网的创始人具备深厚的计算机背

  • SEO提高网站排名快速见效的方法

      seo如何提升网站排名?seo中文名称搜索引擎优化,是提升网站排名的一种技术手段,常用的手段就是优化标签,内链外链等等,最核心的优化方向,“关键词”。最常见的表现形式就是软文,但是有的时候就算你做了很多,也不见得有效果?其实想提高网站排名不是一时半会的功夫,那是要日积月累的,下面犀牛代理IP给大家简单的说是所SEO提高网站排名快速见效的方法   seo做排名不是像竞价那么快的,自然排名的是上升需要一个周期,一般来讲这个周期的稳定时间大致需要3个月,3个月的大周期还分味几个小周期,小周期期间,蜘蛛会收录你的新内容,大型网站,每天收录是很浪费资源的,一般得3-4个月会有一个深层次的抓取。虽然做自然排名,速度是慢了点,但是方法还是系统有序的。   seo怎么提高网站排名——用户浏览   当你的关键词已经优化到搜索引擎前20名的时候,这个时候外链的作用比已经没有那么大了,这个时候决定关键词排名的就是用户的浏览时间了,用户访问A页面和B页面,假设用户访问A页面的时间多过B页面,那么A页面会被蜘蛛认为更具有浏览价值,从而提升A页面的排

  • python调用声卡录制声音

    #_*_coding:utf-8_*___author__='pythonwu'__date__="2018/7/1917:39"importpyaudioimportwave#使用wave模式CHUNK=1024#缓存区设置1024个字节FORMAT=pyaudio.paInt16#取样值的量化格式CHANNELS=2RATE=44100RECORD_SECONDS=5WAVE_OUTPUT_FILENAME="output.wav"p=pyaudio.PyAudio()stream=p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)print("*recording")frames=[]foriinrange(0,int(RATE/CHUNK*RECORD_SECONDS)):data=stream.read(CHUNK)frames.append(data)print("*donerecording")stream.stop_stream()stream.clos

  • 洛谷P2679 子串

    题目 因为该题需要求解方案数,因此我们不能用计数题的常用方法,即用递推来解决,类似于动态规划的思想。 我们用\(dp[i][j][h][o]\)表示第一个串枚举到了\(i\),第二个串枚举到了\(j\),\(A\)中取了\(h\)串,\(o\)表示选不选当前第i位的方案数。 可以得出以下的状态转移: 如果此位不选择的话 \(dp[i][j][h][0]=dp[i-1][j][h][0]+dp[i-1][j][h][1]\),此位不选则用加法原理选之前一位选择的和。 如果此位选择的话: 如果\(a[i]\)和\(b[j]\)不相等的话选择该位不能产生一个满足条件的子串。 如果相等的话,子串个数增加和不增加的情况都需要考虑,子串个数不增加的话,则\(i-1\)必须选,而选了\(i\)之后子串个数增加的话,\(i-1\)可选可不选。注意此时第二个串应该加上枚举到\(j-1\)的方案。 然后i的转移只跟i-1有关,因此考虑空间优化 #include<bits/stdc++.h> #defineN1001001 #definemod1000000007 usingnamespaces

  • iOS项目iCloud及CloudKit Dashboard运用

    CloudKit是苹果推出的基于iCloud的一个云端数据存储服务.其主要由下面两部分组成: 一个仪表web页面,用于管理公开数据的记录类型. 一组API接口,用于iCloud和设备之间的数据传递.   一:首先在XCode上面打开关于iCloud功能 1:进入对应的项目Targets中的Capabilities选项卡,打开关于iCloud功能;如果勾选iCloudDocuments或CloudKit会自动生成一个带iCloud.开头的Containers,要配置证书支持;CloudKitDashboard则可以直接跳转到Web配置关于iCloud的内容;而关于Steps则是配置的步骤是否都成功;     二:关于证书如何配置支持iCloud功能 1:进入苹果证书管理后台中的Identifiers里有个iCloudContainers菜单   因为实例中的BundleIdentifier的名字wjy.com.MobileProject;所以在这边创建一个iCloud.wjy.com.MobileProject的ID值;都是前面增加一个iClo

  • 对象数组的使用

    #include<iostream> usingnamespacestd; classBox { public: Box(inth=10,intw=12,intlen=15):height(h),width(w),length(len){}; //等于以下赋值情况 /**height=h; width=w; length=len;*/ intvolume(); private: intheight; intwidth; intlength; }; intBox::volume(){ return(height*width*length); } intmain() { //定义对象数组, Boxa[3]={ Box(1,2,3),Box(2,3,4),Box(4,5,6)}; cout<<a[0].volume()<<endl; return0; }复制

  • 四元数与旋转向量的转化

    floatr1,r2,r3; //旋转向量 floatqx,qy,qz,qw; //四元数 floattheta; //角度 //四元数转旋转向量 floattheta=2*acosf(qw); r1=qx/sinf(theta*0.5f)*theta; r2=qy/sinf(theta*0.5f)*theta; r3=qz/sinf(theta*0.5f)*theta; //旋转向量转四元数 theta=sqrt(r1*r1+r2*r2+r3*r3); qw=cosf(theta*0.5f); qx=r1*sinf(theta*0.5f)/theta; qy=r2*sinf(theta*0.5f)/theta; qz=r3*sinf(theta*0.5f)/theta; 复制

  • 改进版游戏

    这是之前的游戏代码的改进版,添加了商店,勇者们可以在商店里购买云南白药等回血道具和毒镖等攻击道具,再也不怕打不败森林巨人王和使徒了! 接下来就是代码啦~

相关推荐

推荐阅读