在分布式系统中,如果某个服务节点发生故障或者网络发生异常,都有可能导致调用方被阻塞等待,如果超时时间设置很长,调用方资源很可能被耗尽。这又导致了调用方的上游系统发生资源耗尽的情况,最终导致系统雪崩。
如下图:
如果D
服务发生了故障不能响应,B
服务调用D
时只能阻塞等待。假如B
服务调用D
服务设置超时时间是10
秒,请求速率是每秒100
个,那10
秒内就会有1000
个请求线程被阻塞等待,如果B
的线程池大小设置1000
,那B
系统因为线程资源耗尽已经不能对外提供服务了。而这又影响了入口系统A
的服务,最终导致系统全面崩溃。
提高系统的整体容错能力是防止系统雪崩的有效手段。
在Martin Fowler
和James Lewis
的文章 《Microservices: a definition of this new architectural term》[1]中,提出了微服务的9
个特征,其中一个是容错设计。
要防止系统发生雪崩,就必须要有容错设计。如果遇到突增流量,一般的做法是对非核心业务功能采用熔断和服务降级的措施来保护核心业务功能正常服务,而对于核心功能服务,则需要采用限流的措施。
今天我们来聊一聊系统容错中的限流、熔断和服务降级。
当系统的处理能力不能应对外部请求的突增流量时,为了不让系统奔溃,必须采取限流的措施。
系统吞吐量是衡量系统性能的关键指标,按照事务的完成数量来限流是最合理的。
但是对实操性来说,按照事务来限流并不现实。在分布式系统中完成一笔事务需要多个系统的配合。比如我们在电商系统购物,需要订单、库存、账户、支付等多个服务配合完成,有的服务需要异步返回,这样完成一笔事务花费的时间可能会很长。如果按照TPS
来进行限流,时间粒度可能会很大大,很难准确评估系统的响应性能。
每秒请求数,指每秒钟服务端收到客户端的请求数量。
❝如果一个请求完成一笔事务,那
TPS
和HPS
是等同的。但在分布式场景下,完成一笔事务可能需要多次请求,所以TPS
和HPS
指标不能等同看待。❞
服务端每秒能够响应的客户端查询请求数量。
❝如果后台只有一台服务器,那
HPS
和QPS
是等同的。但是在分布式场景下,每个请求需要多个服务器配合完成响应。❞
❝目前主流的限流方法多采用
HPS
作为限流指标。❞
这是最简单直接的方法,比如限制每秒请求数量100
,超过100
的请求就拒绝掉。
但是这个方法存在2
个明显的问题:
1s
)很难把控,如下图:
这张图上,从下面时间看,HPS
没有超过100
,但是从上面看HPS
超过100
了。HPS
限制50
,虽然前3s
流量超了,但是如果读超时时间设置为5s
,并不需要限流。滑动时间窗口算法是目前比较流行的限流算法,主要思想是把时间看做是一个向前滚动的窗口,如下图:
开始的时候,我们把t1~t5
看做一个时间窗口,每个窗口1s
,如果我们定的限流目标是每秒50
个请求,那t1~t5
这个窗口的请求总和不能超过250
个。
这个窗口是滑动的,下一秒的窗口成了t2~t6
,这时把t1
时间片的统计抛弃,加入t6
时间片进行统计。这段时间内的请求数量也不能超过250
个。
滑动时间窗口的优点是解决了流量计数器算法的缺陷,但是也有2
个问题:
漏桶算法的思想如下图: 在客户端的请求发送到服务器之前,先用漏桶缓存起来,这个漏桶可以是一个长度固定的队列,这个队列中的请求均匀的发送到服务端。
如果客户端的请求速率太快,漏桶的队列满了,就会被拒绝掉,或者走降级处理逻辑。这样服务端就不会受到突发流量的冲击。
漏桶算法的优点是实现简单,可以使用消息队列来削峰填谷。
但是也有3
个问题需要考虑:
❝漏桶大小和发送速率这
2
个值在项目上线初期都会根据测试结果选择一个值,但是随着架构的改进和集群的伸缩,这2
个值也会随之发生改变。❞
令牌桶算法就跟病人去医院看病一样,找医生之前需要先挂号,而医院每天放的号是有限的。当天的号用完了,第二天又会放一批号。
算法的基本思想就是周期性的执行下面的流程: 客户端在发送请求时,都需要先从令牌桶中获取令牌,如果取到了,就可以把请求发送给服务端,取不到令牌,就只能被拒绝或者走服务降级的逻辑。如下图:
❝令牌桶算法解决了漏桶算法的问题,而且实现并不复杂,使用信号量就可以实现。在实际限流场景中使用最多,比如
guava
中就实现了令牌桶算法限流,感兴趣可以研究一下。❞
如果在分布式系统场景下,上面介绍的4
种限流算法是否还适用呢?
以令牌桶算法为例,假如在电商系统中客户下了一笔订单,如下图:
如果我们把令牌桶单独保存在一个地方(比如redis
中)供整个分布式系统用,那客户端在调用组合服务,组合服务调用订单、库存和账户服务都需要跟令牌桶交互,交互次数明显增加了很多。
有一种改进就是客户端调用组合服务之前首先获取四个令牌,调用组合服务时减去一个令牌并且传递给组合服务三个令牌,组合服务调用下面三个服务时依次消耗一个令牌。
hystrix可以使用信号量和线程池来进行限流。
hystrix
可以使用信号量进行限流,比如在提供服务的方法上加下面的注解。这样只能有20个并发线程来访问这个方法,超过的就被转到了errMethod这个降级方法。
@HystrixCommand(
commandProperties= {
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE"),
@HystrixProperty(name="execution.isolation.semaphore.maxConcurrentRequests", value="20")
},
fallbackMethod = "errMethod"
)
hystrix
也可以使用线程池进行限流,在提供服务的方法上加下面的注解,当线程数量
@HystrixCommand(
commandProperties = {
@HystrixProperty(name = "execution.isolation.strategy", value = "THREAD")
},
threadPoolKey = "createOrderThreadPool",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "20"),
@HystrixProperty(name = "maxQueueSize", value = "100"),
@HystrixProperty(name = "maximumSize", value = "30"),
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "120")
},
fallbackMethod = "errMethod"
)
❝这里要注意:在
java
的线程池中,如果线程数量超过coreSize
,创建线程请求会优先进入队列,如果队列满了,就会继续创建线程直到线程数量达到maximumSize
,之后走拒绝策略。但在hystrix配置的线程池中多了一个参数queueSizeRejectionThreshold
,如果queueSizeRejectionThreshold < maxQueueSize
,队列数量达到queueSizeRejectionThreshold
就会走拒绝策略了,因此maximumSize
失效了。如果queueSizeRejectionThreshold > maxQueueSize
,队列数量达到maxQueueSize
时,maximumSize
是有效的,系统会继续创建线程直到数量达到maximumSize
。Hytrix线程池设置坑[2]❞
相信大家对断路器并不陌生,它就相当于一个开关,打开后可以阻止流量通过。比如保险丝,当电流过大时,就会熔断,从而避免元器件损坏。
服务熔断是指调用方访问服务时通过断路器做代理进行访问,断路器会持续观察服务返回的成功、失败的状态,当失败超过设置的阈值时断路器打开,请求就不能真正地访问到服务了。
为了更好地理解,我画了下面的时序图:
❝可以参考
Martin Fowler
的论文《CircuitBreaker》[3]。❞
断路器有3
种状态:
CLOSED
:默认状态。断路器观察到请求失败比例没有达到阈值,断路器认为被代理服务状态良好。OPEN
:断路器观察到请求失败比例已经达到阈值,断路器认为被代理服务故障,打开开关,请求不再到达被代理的服务,而是快速失败。HALF OPEN
:断路器打开后,为了能自动恢复对被代理服务的访问,会切换到半开放状态,去尝试请求被代理服务以查看服务是否已经故障恢复。如果成功,会转成CLOSED
状态,否则转到OPEN
状态。断路器的状态切换图如下:
使用断路器需要考虑一些问题:
HALF OPEN
进行重试。connection timeout
造成的熔断,可以用异步线程进行网络检测,比如telenet
,检测到网络畅通时切换到HALF OPEN
进行重试。read timeout
会比较长,防止客户端大量重试请求导致的连接、线程资源不能释放前面讲了限流和熔断,相比来说,服务降级是站在系统全局的视角来考虑的。
在服务发生熔断后,一般会让请求走事先配置的处理方法,这个处理方法就是一个降级逻辑。
服务降级是对非核心、非关键的服务进行降级。
hystrix降级时可以忽略某个异常,在方法上加上@HystrixCommand
注解:
下面的代码定义降级方法是errMethod
,对ParamErrorException
和BusinessTypeException
这两个异常不做降级处理。
@HystrixCommand(
fallbackMethod = "errMethod",
ignoreExceptions = {ParamErrorException.class, BusinessTypeException.class}
)
专门针对调用第三方接口超时降级。
下面的方法是调用第三方接口3秒未收到响应就降级到errMethod方法。
@HystrixCommand(
commandProperties = {
@HystrixProperty(name="execution.timeout.enabled", value="true"),
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000"),
},
fallbackMethod = "errMethod"
)
限流、熔断和服务降级是系统容错的重要设计模式,从一定意义上讲限流和熔断也是一种服务降级的手段。
熔断和服务降级主要是针对非核心业务功能,而核心业务如果流程超过预估的峰值,就需要进行限流。
对于限流,选择合理的限流算法很重要,令牌桶算法优势很明显,也是使用最多的限流算法。
在系统设计的时候,这些模式需要配合业务量的预估、性能测试的数据进行相应阈值的配置,而这些阈值最好保存在配置中心,方便实时修改。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/_bybKo0yTpAtr5hgKVZoXw
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。