Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】

前言

在上一篇《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》中,我们已经体验了如何使用@HystrixCommand来为一个依赖资源定义服务降级逻辑。实现方式非常简单,同时对于降级逻辑还能实现一些更加复杂的级联降级等策略。之前对于使用Hystrix来实现服务容错保护时,除了服务降级之外,我们还提到过线程隔离、断路器等功能。那么在本篇中我们就来具体说说线程隔离。

依赖隔离

“舱壁模式”对于熟悉Docker的读者一定不陌生,Docker通过“舱壁模式”实现进程的隔离,使得容器与容器之间不会互相影响。而Hystrix则使用该模式实现线程池的隔离,它会为每一个Hystrix命令创建一个独立的线程池,这样就算某个在Hystrix命令包装下的依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的服务。

通过对依赖服务的线程池隔离实现,可以带来如下优势:

  • 应用自身得到完全的保护,不会受不可控的依赖服务影响。即便给依赖服务分配的线程池被填满,也不会影响应用自身的额其余部分。
  • 可以有效的降低接入新服务的风险。如果新服务接入后运行不稳定或存在问题,完全不会影响到应用其他的请求。
  • 当依赖的服务从失效恢复正常后,它的线程池会被清理并且能够马上恢复健康的服务,相比之下容器级别的清理恢复速度要慢得多。
  • 当依赖的服务出现配置错误的时候,线程池会快速的反应出此问题(通过失败次数、延迟、超时、拒绝等指标的增加情况)。同时,我们可以在不影响应用功能的情况下通过实时的动态属性刷新(后续会通过Spring Cloud Config与Spring Cloud Bus的联合使用来介绍)来处理它。
  • 当依赖的服务因实现机制调整等原因造成其性能出现很大变化的时候,此时线程池的监控指标信息会反映出这样的变化。同时,我们也可以通过实时动态刷新自身应用对依赖服务的阈值进行调整以适应依赖方的改变。
  • 除了上面通过线程池隔离服务发挥的优点之外,每个专有线程池都提供了内置的并发实现,可以利用它为同步的依赖服务构建异步的访问。

总之,通过对依赖服务实现线程池隔离,让我们的应用更加健壮,不会因为个别依赖服务出现问题而引起非相关服务的异常。同时,也使得我们的应用变得更加灵活,可以在不停止服务的情况下,配合动态配置刷新实现性能配置上的调整。

虽然线程池隔离的方案带了如此多的好处,但是很多使用者可能会担心为每一个依赖服务都分配一个线程池是否会过多地增加系统的负载和开销。对于这一点,使用者不用过于担心,因为这些顾虑也是大部分工程师们会考虑到的,Netflix在设计Hystrix的时候,认为线程池上的开销相对于隔离所带来的好处是无法比拟的。同时,Netflix也针对线程池的开销做了相关的测试,以证明和打消Hystrix实现对性能影响的顾虑。

下图是Netflix Hystrix官方提供的一个Hystrix命令的性能监控,该命令以每秒60个请求的速度(QPS)向一个单服务实例进行访问,该服务实例每秒运行的线程数峰值为350个。

从图中的统计我们可以看到,使用线程池隔离与不使用线程池隔离的耗时差异如下表所示:

比较情况未使用线程池隔离使用了线程池隔离耗时差距
中位数2ms2ms2ms
90百分位5ms8ms3ms
99百分位28ms37ms9ms

在99%的情况下,使用线程池隔离的延迟有9ms,对于大多数需求来说这样的消耗是微乎其微的,更何况为系统在稳定性和灵活性上所带来的巨大提升。虽然对于大部分的请求我们可以忽略线程池的额外开销,而对于小部分延迟本身就非常小的请求(可能只需要1ms),那么9ms的延迟开销还是非常昂贵的。实际上Hystrix也为此设计了另外的一个解决方案:信号量。

Hystrix中除了使用线程池之外,还可以使用信号量来控制单个依赖服务的并发度,信号量的开销要远比线程池的开销小得多,但是它不能设置超时和实现异步访问。所以,只有在依赖服务是足够可靠的情况下才使用信号量。在HystrixCommand和HystrixObservableCommand中2处支持信号量的使用:

  • 命令执行:如果隔离策略参数execution.isolation.strategy设置为SEMAPHORE,Hystrix会使用信号量替代线程池来控制依赖服务的并发控制。
  • 降级逻辑:当Hystrix尝试降级逻辑时候,它会在调用线程中使用信号量。

信号量的默认值为10,我们也可以通过动态刷新配置的方式来控制并发线程的数量。对于信号量大小的估算方法与线程池并发度的估算类似。仅访问内存数据的请求一般耗时在1ms以内,性能可以达到5000rps,这样级别的请求我们可以将信号量设置为1或者2,我们可以按此标准并根据实际请求耗时来设置信号量。

如何使用

说了那么多依赖隔离的好处,那么我们如何使用Hystrix来实现依赖隔离呢?其实,我们在上一篇定义服务降级的时候,已经自动的实现了依赖隔离。

在上一篇的示例中,我们使用了@HystrixCommand来将某个函数包装成了Hystrix命令,这里除了定义服务降级之外,Hystrix框架就会自动的为这个函数实现调用的隔离。所以,依赖隔离、服务降级在使用时候都是一体化实现的,这样利用Hystrix来实现服务容错保护在编程模型上就非常方便的,并且考虑更为全面。除了依赖隔离、服务降级之外,还有一个重要元素:断路器。我们将在下一篇做详细的介绍,这三个重要利器构成了Hystrix实现服务容错保护的强力组合拳。

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

  • 码云:点击查看
  • GitHub:点击查看

相关阅读

  • Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)
  • Spring Cloud构建微服务架构:服务消费者(基础)
  • Spring Cloud构建微服务架构:服务消费者(Ribbon)
  • Spring Cloud构建微服务架构:服务消费者(Feign)
  • Spring Cloud构建微服务架构:分布式配置中心
  • Spring Cloud构建微服务架构:服务容错保护(hystrix服务降级)
  • Spring Cloud构建微服务架构:服务容错保护(hystrix依赖隔离)
  • Spring Cloud构建微服务架构:服务容错保护(hystrix断路器)
  • Spring Cloud构建微服务架构:Hystrix监控面板
  • Spring Cloud构建微服务架构:Hystrix监控数据聚合
  • 更多Spring Cloud内容…

money.jpg

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重点领域知识工程课程群虚拟教研室建设启动会暨第一次教学研讨会在线召开...

重点领域知识工程课程群虚拟教研室启动会暨第一次教学研讨会于2022年10月11日晚在线召开。重点领域教学资源建设项目管理办公室相关负责人、中国中文信息学会语言与知识计算专委会主任李涓子、天津大学智能与计算学部主任李克秋出席会议并致辞。天津大学人工智能学院院长胡清华…

LeetCode 556. 下一个更大元素 III

1. 题目 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。 示例 1: 输入: 12 输出: 21示例 2: 输入: 21 输出: -1来源:力扣&#x…

这可能是你与 AI 大神们近距离接触的唯一机会……

明人不说暗话:作为粤海街头放飞梦想的有志青年,他们可能是国内最大胆的「狗仔队」。从2016年成立至今,他们报道过:国内外数十场 AI 学术会议动态,写下老中青研究者们在会场前线的精神风采AI 领域的每一个最新研究突破&…

Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调…

论文浅尝 | 基于注意力图卷积神经网络的依存驱动关系抽取

笔记整理:王大壮论文链接:https://aclanthology.org/2021.acl-long.344.pdf动机句法信息,特别是依存树,已经被广泛应用于关系提取,以更好地分析与给定实体相关联的上下文信息。然而大多数现有的研究都饱受依赖树噪声的影响,特别是当它们自动生…

别再龟速炼丹了!聊聊怎样科学提升训练效率

文 | Horace He等编 | Juniper源 | 机器之心深度学习是门玄学?也不完全是。每个人都想让模型训练得更快,但是你真的找对方法了吗?在康奈尔大学本科生、曾在 PyTorch 团队实习的 Horace He 看来,这个问题应该分几步解决&#xff1a…

LeetCode 第 17 场双周赛(469/897,前52.3%)

文章目录1. 比赛结果2. 题目LeetCode 5143. 解压缩编码列表 easyLeetCode 5144. 矩阵区域和 mediumLeetCode 5145. 祖父节点值为偶数的节点和 mediumLeetCode 5146. 不同的循环子字符串 hard1. 比赛结果 做出来了1, 3两题,第2题在比赛结束后10分钟提交通过。 2.…

Spring Cloud构建微服务架构:分布式配置中心【Dalston版】

Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连…

图谱实战 | 知识图谱在美团搜索酒旅场景认知中的应用

分享嘉宾:陈骐 美团 高级算法专家编辑整理:毛佳豪 中国平安浙江分公司(实习)出品平台:DataFunTalk导读:知识图谱凭借能够以图模型描述知识和世界万物关联关系的特性,在各行业领域大放异彩。与此同时,知识图…

AI技术在空气净化机器人中的高能应用

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

Spring Cloud构建微服务架构:服务消费(Feign)【Dalston版】

通过前两篇《Spring Cloud构建微服务架构:服务消费(基础)》和《Spring Cloud构建微服务架构:服务消费(Ribbon)》,我们已经学会了在Spring Cloud中基本的服务调用方式。本文我们将继续介绍Spring…

LeetCode 1317. 将整数转换为两个无零整数的和

1. 题目 「无零整数」是十进制表示中 不含任何 0 的正整数。 给你一个整数 n,请你返回一个 由两个整数组成的列表 [A, B],满足: A 和 B 都是无零整数A B n 题目数据保证至少有一个有效的解决方案。 如果存在多个有效解决方案&#xff…

预训练模型对实体的表示能力差?一个简单有效的解法来了(开源)

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

图谱实战 | 深度应用驱动的医学知识图谱构建

分享嘉宾:徐美兰 浙江数字医疗卫生技术研究院 数字医学知识中心主任编辑整理:李杰 京东出品平台:DataFunTalk导读:数研院这些年在知识图谱建设上取得了丰硕成果,今天我们将图谱构建过程中的经验、心得分享给大家&#…

朴素贝叶斯法(Naive Bayes,NB)

文章目录1. 朴素贝叶斯法的学习与分类1.1 基本方法2. 参数估计2.1 极大似然估计2.2 学习与分类算法2.2.1 例题2.2.2 例题代码2.3 贝叶斯估计(平滑)2.3.1 例题2.3.2 例题代码3. 自编程实现NB4. sklearn.naive_bayes1. 朴素贝叶斯法的学习与分类 1.1 基本…

《Easy RL:强化学习教程》出版了!文末送书

作为人工智能里最受关注的领域之一,强化学习的热度一直居高不下,但它的学习难度也同样不低。在学习强化学习的过程中,遇到了有无数资料却难以入门的问题,于是发起了Datawhale强化学习项目,希望自学的同时帮助更多学习者…

Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】

通过上一篇《Spring Cloud构建微服务架构:服务注册与发现》,我们已经成功地将服务提供者:eureka-client或consul-client注册到了Eureka服务注册中心或Consul服务端上了,同时我们也通过DiscoveryClient接口的getServices获取了当前…

论文浅尝 | Temporal Knowledge Graph Completion Using Box Embeddings

笔记整理:杨露露,天津大学硕士论文链接:https://www.aaai.org/AAAI22Papers/AAAI-6210.MessnerJ.pdf动机时态知识图谱补全(TKGC)中的主要挑战是额外学习时间戳嵌入,以便嵌入模型根据关系、实体和时间戳嵌入…

别再无脑wwm了,在下游任务中不一定有效

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

逻辑斯谛回归模型( Logistic Regression,LR) 最大熵模型(Max Entropy,ME)

文章目录1. Logistic Regression 模型1.1 logistic 分布1.2 二项逻辑斯谛回归模型1.3 模型参数估计1.4 多项逻辑斯谛回归1.5 Python代码2. Maximum Entropy 模型2.1 最大熵原理2.2 最大熵模型的定义2.3 最大熵模型的学习2.4 例题3. 模型学习的最优化算法4. 鸢尾花LR分类实践1. …