学习笔记-架构的演进之服务容错策略设计模式-3月day02

news2024/11/14 17:35:56

文章目录

  • 前言
  • 断路器模式
  • 舱壁隔离模式
  • 重试模式
  • 总结

前言

容错设计模式,指的是“要实现某种容错策略,我们该如何去做”。微服务中常见的设计模式包括断路器模式、舱壁隔离模式和超时重试模式等,另外还有流量控制模式等。

断路器模式

断路器模式是微服务架构中最基础的容错设计模式。断路器的思路也简单,就是通过代理(断路器对象)来一对一(一个远程服务对应一个断路器对象)地接管服务调用者的远程请求。断路器会持续监控并统计服务返回的成功、失败、超时、拒绝等各种结果,当出现故障(失败、超时、拒绝)的次数达到断路器的阈值时,它的状态就自动变为“OPEN”。之后这个断路器代理的远程访问都将直接返回调用失败,而不会发出真正的远程服务请求。
通过断路器对远程服务进行熔断,就可以避免因为持续的失败或拒绝而消耗资源,因为持续的超时而堆积请求,最终可以避免雪崩效应的出现。由此可见,断路器本质上是快速失败策略的一种实现方式。
在这里插入图片描述
从调用序列来看,断路器就是一种有限状态机,断路器模式就是根据自身的状态变化,自动调整代理请求策略的过程
断路器一般可以设置为 CLOSED、OPEN 和 HALF OPEN 三种状态:

  1. CLOSED:表示断路器关闭(请求可正常响应),此时的远程请求会真正发送给服务提供者。断路器刚刚建立时默认处于这种状态,此后将持续监视远程请求的数量和执行结果,决定是否要进入 OPEN 状态。
  2. OPEN:表示断路器开启,此时不会进行远程请求,直接给服务调用者返回调用失败的信息,以实现快速失败策略
  3. HALF OPEN:是一种中间状态。断路器必须带有自动的故障恢复能力,当进入 OPEN 状态一段时间以后,将“自动”(一般是由下一次请求而不是计时器触发的,所以这里的自动是带引号的)切换到 HALF OPEN 状态。在中间状态下,会放行一次远程调用,然后根据这次调用的结果成功与否,转换为 CLOSED 或者 OPEN 状态,来实现断路器的弹性恢复。在这里插入图片描述
    这里值得讨论的是OPEN 和 CLOSED 状态的转换条件,不同框架都有各自的偏好设置,如Netflix Hystrix中的默认设置:
    当一次调用失败后,如果还同时满足下面两个条件,断路器的状态就变为 OPEN:
  4. 一段时间(比如 10 秒以内)内,请求数量达到一定阈值(比如 20 个请求)。(响应频率)
  5. 一段时间(比如 10 秒以内)内,请求的故障率(发生失败、超时、拒绝的统计比例)到达一定阈值(比如 50%)。(可用性)

另外,服务熔断和服务降级之间的联系与差别:
断路器做的事情是自动进行服务熔断,属于一种快速失败的容错策略的实现方法。在快速失败策略明确反馈了故障信息给上游服务以后,上游服务必须能够主动处理调用失败的后果,而不是坐视故障扩散。这里的“处理”,指的就是一种典型的服务降级逻辑,降级逻辑可以是,但不应该只是,把异常信息抛到用户界面去,而应该尽力想办法通过其他路径解决问题,比如把原本要处理的业务记录下来,留待以后重新处理是最低限度的通用降级逻辑。
服务降级不一定是在出现错误后才被动执行的,我们在很多场景中谈论的降级更可能是指,需要主动迫使服务进入降级逻辑的情况。比如,出于应对可预见的峰值流量,或者是系统检修等原因,要关闭系统部分功能或关闭部分旁路服务,这时候就有可能会主动迫使这些服务降级。此时服务降级就是出于流量控制的范畴。

舱壁隔离模式

舱壁隔离模式,是常用的实现服务隔离的设计模式。舱壁这个词来自造船业,意思是在每个区域设计独立的水密舱室。

分布式系统中,服务隔离,就是避免某一个远程服务的局部失败影响到全局,而设置的一种止损方案。这种思想,对应的就是容错策略中的失败静默策略
在调用外部服务可能面临的三大类故障:失败、拒绝和超时中,“超时”引起的故障,尤其容易给调用者带来全局性的风险。这是因为,目前主流的网络访问大多是基于 TPR 并发模型(Thread per Request)来实现的,只要请求一直不结束(无论是以成功结束还是以失败结束),就要一直占用着某个线程不能释放。而线程是典型的整个系统的全局性资源,尤其是在 Java 这类将线程映射为操作系统内核线程来实现的语言环境中。

要解决这类问题,本质上就是要控制单个服务的最大连接数。一种可行的解决办法是为每个服务单独设立线程池,这些线程池默认不预置活动线程,只用来控制单个服务的最大连接数。使用局部的线程池来控制服务的最大连接数,有很多好处,比如当服务出问题时能够隔离影响,当服务恢复后,还可以通过清理掉局部线程池,瞬间恢复该服务的调用。而如果是 Tomcat 的全局线程池被占满,再恢复就会非常麻烦。
但是,局部线程池有一个显著的弱点,那就是它额外增加了 CPU 的开销,每个独立的线程池都要进行排队、调度和下文切换工作。

为应对这种情况,还有一种更轻量的控制服务最大连接数的办法,那就是信号量机制(Semaphore)。如果不考虑清理线程池、客户端主动中断线程这些额外的功能,仅仅是为了控制单个服务并发调用的最大次数的话,我们可以只为每个远程服务维护一个线程安全的计数器,并不需要建立局部线程池。具体做法是,当服务开始调用时计数器加 1,服务返回结果后计数器减 1;一旦计数器的值超过设置的阈值就立即开始限流,在回落到阈值范围之前都不再允许请求了。因为不需要承担线程的排队、调度和切换工作,所以单纯维护一个作为计数器的信号量的性能损耗,相对于局部线程池来说,几乎可以忽略不计。

一般来说,我们会选择将服务层面的隔离实现在服务调用端或者边车代理上,将系统层面的隔离实现在 DNS 或者网关处。

重试模式

故障转移和故障恢复这两种策略都需要对服务进行重复调用,差别就在于这些重复调用有可能是同步的,也可能是后台异步进行;有可能会重复调用同一个服务,也可能会调用服务的其他副本。但是,无论具体是通过怎样的方式调用、调用的服务实例是否相同,都可以归结为重试设计模式的应用范畴。
重试模式适合解决系统中的瞬时故障,简单地说就是有可能自己恢复(Resilient,称为自愈,也叫做回弹性)的临时性失灵,比如网络抖动、服务的临时过载(比如返回了 503 Bad Gateway 错误)这些都属于瞬时故障。

重试模式实现起来并不难,在实践中,我们判断是否应该且是否能够对一个服务进行重试时,要看是否同时满足下面 4 个条件:

  • 第一,仅在主路逻辑的关键服务上进行同步的重试。(如果不是关键服务,一般不要把重试作为首选容错方案,尤其不应该进行同步重试。)
  • 第二,仅对由瞬时故障导致的失败进行重试。尽管要做到精确判定一个故障是否属于可自愈的瞬时故障并不容易,但我们至少可以从 HTTP 的状态码上获得一些初步的结论。比如,当发出的请求收到了 401 Unauthorized 响应时,说明服务本身是可用的,只是你没有权限调用,这时候再去重试就没有什么意义。
  • 第三,仅对具备幂等性的服务进行重试。比如,RESTful 服务中的 POST 请求是非幂等的;GET、HEAD、OPTIONS、TRACE 请求应该被设计成幂等的,因为它们不会改变资源状态;PUT 请求一般也是幂等的,因为 n 个 PUT 请求会覆盖相同的资源 n-1 次;DELETE 请求也可看作是幂等的,同一个资源首次删除会得到 200 OK 响应,此后应该得到 204 No Content 响应。
  • 第四,重试必须有明确的终止条件,常用的终止条件有超时终止和次数终止两种:
    超时终止。其实,超时机制并不限于重试策略,所有涉及远程调用的服务都应该有超时机制来避免无限期的等待。
    次数终止。重试必须要有一定限度,不能无限制地做下去,通常是重试 2~5 次。因为重试不仅会给调用者带来负担,对服务提供者来说也同样是负担,所以我们要避免把重试次数设得太大。

另外,由于重试模式可以在网络链路的多个环节中去实现,比如在客户端发起调用时自动重试、网关中自动重试、负载均衡器中自动重试等等,如果配置不当,可能会带来巨大的负担。

总结

熔断、隔离、重试、降级、超时等概念,都是建立具有韧性的微服务系统的必须的保障措施。那么就目前来说,这些措施的正确运作,主要还是依靠开发人员对服务逻辑的了解,以及根据运维人员的经验去静态地调整、配置参数和阈值。

但是,面对能够自动扩缩(Auto Scale)的大型分布式系统,静态的配置越来越难以起到良好的效果。这就要求,系统不仅要有能力可以自动地根据服务负载来调整服务器的数量规模,同时还要有能力根据服务调用的统计结果,或者启发式搜索的结果来自动变更容错策略和参数。当然,目前这方面的研究,还处于各大厂商在内部分头摸索的初级阶段,不过这正是服务治理未来的重要发展方向之一。

此文章为3月Day02学习笔记,内容来源于极客时间《周志明的软件架构课》

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

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

相关文章

VSCode——SSH免密登录

文章目录本地PC端(一般为Windows)1. 检查自己是否已经生成公钥2. 配置VScode的SSH config远程服务器端1. 服务器新建授权文件2. 赋权限3. 重启远程服务器的ssh服务最全步骤:【设置ssh免密不起作用?彻底搞懂密钥】vscode在remote S…

linux常用命令介绍 05 篇——实际应用篇(用 cut、uniq等统计文档里每个关键词出现的次数)

linux常用命令介绍 05 篇——实际应用篇(用 cut、uniq等统计文档里每个关键词出现的次数)1. 先导文章——关于行过滤 和 列截取2. 关于单个统计单词个数2.1 grep2.2 wc3. 统计文档中每个关键词出现的次数3.1 先看文档内容 需求3.1.1 文档内容3.1.2 需求…

系列十、锁

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…

热烈祝贺|济南市时代酒具盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会

济南市时代酒具制造股份有限公司成立于2010年,注册资金600万,员工100余人,占地30余亩,是山东省济南市一家专业的塑料产品生产厂家。主营酒塔、分酒器、混饮塔、果汁塔、橡木桶等系列酒具。经过十余年的发展,公司组建了…

201_DMA-BUF简单简介

一、DMA-BUF等概念的介绍 首先需要明确DMA-BUF,Dma buffer,ION和DMA-BUF Heap是不同的概念。 在Android 多媒体系统中为了减少因不同进程之间内存的多次拷贝而产生的不必要的开销,最直接的想法是希望跟硬件设备进行交互的应用能有一个内存能…

离线安装samba与配置(.tar方式安装)

一、samba离线安装【安装并设置成功后,相关文件及其位置:①smbd:/usr/local/samba/sbin/smbd②nmdb:/usr/local/samba/sbin/nmbd③配置文件 smb.conf:/usr/local/samba/lib/smb.conf④添加用户的 smbpasswd 文件&#…

Java并发简介(什么是并发)

文章目录并发概念并发和并行同步和异步阻塞和非阻塞进程和线程竞态条件和临界区管程并发的特点提升资源利用率程序响应更快并发的问题安全性问题缓存导致的可见性问题线程切换带来的原子性问题编译优化带来的有序性问题保证并发安全的思路互斥同步(阻塞同步&#xf…

Delphi 中 FireDAC 数据库连接(处理错误)

参见:Delphi 中 FireDAC 数据库连接(总览)本主题描述了如何用FireDAC处理数据库错误。一、概述EFDDBEngineException类是所有DBMS异常的基类。单个异常对象是一个数据库错误的集合,可以通过EFDDBEngineException.Errors[]属性访问…

第十届蓝桥杯省赛——6旋转(二维数组,找规律)

题目:试题 F: 旋转时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分【问题描述】图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。我们用一个 n m 的二维数组来表示一个图片,例如下面…

什么是项目管理资格认证

项目管理资格认证是项目管理协会(PMI)在全球范围内推出的针对项目经理的资格认证体系,包括项目管理专业人士(PMP)认证、PMI敏捷管理专业人士(PMI-ACP)认证、PMI商业分析专业人士(PMI-PBA)认证、项目集管理专业人士&…

驱动器,DRV10975ZRHFR原理图DRV83055QPHPRQ1规格参数

DRV10975器件是一款具有集成功率MOSFET的三相无传感器电机驱动器,可提供高达1.5A的持续驱动电流。该器件专为成本敏感型、低噪声、低外部组件数量应用而设计。DRV10975(明佳达电子)DRV10975ZRHFR IC MTR DRV MULTPHS 6.5-18V 24QFN电机类型 -…

拿下3个大厂offer的软件测试面试宝典,面试一文搞定

我是谁、工作几年、你上家公司做什么、负责什么、你的优势、为什么适合这个职位、我想做什么、在这个职位上想得到什么 【呕心沥血】耗时7天整理的金三银四必看的软件测试频面试题 涵盖 接口自动化测试框架面试题_哔哩哔哩_bilibili【呕心沥血】耗时7天整理的金三银四必看的软…

day26 员工薪水中位数

569. 员工薪水中位数 写一个SQL查询,找出每个公司的工资中位数。 以 任意顺序 返回结果表。 查询结果格式如下所示。 SQL:方法一 select id, company, salary from (selectid, company, salary,row_number() over(partition by company order by s…

aws batch 理解batch中的任务调度策略

参考资料 https://docs.amazonaws.cn/en_us/batch/latest/userguide/job_queue_parameters.html#job_queue_scheduling_policy https://docs.amazonaws.cn/en_us/batch/latest/userguide/scheduling-policies.html https://catalog.us-east-1.prod.workshops.aws/workshops/c…

【Python实战】快看:”又中奖了,中大奖了“周围的小伙伴都惊呆了~你还不麻溜滴~(代码版彩票小游戏上线啦)

导语 哈喽!北鼻们,晚上好。 夕阳🌇的第一缕阳光送给小可爱们~每天都要加油鸭! 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 彩票是一个恒古不…

206页16万字城市运行“一网统管”体系建设项目需求报告

本资料来源网络,知识分享,仅供个人学习,请勿商用。完整资料领取见文末,部分资料内容: 第 一 章 应用场景示例 一.1 一卡通人员管理针对企业厂区、办公楼等场所人员出入频繁、安保问题多样化、管理环节复杂等现状&#…

文科生比不过理科生,转码IT互联网将成趋势?

今天看到“文科生转码或成趋势”的话题,觉得还是非常有意思哈,所以来聊聊看~ 值得一提的是,虽然现在高中考试改制后,已不再区分文理科生(理化生史地政6选3),但是大学本科及研究生以上&#xff…

最小基因变化

基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如,"AACCGGTT" -->…

设计模式-工作线程 创建多少线程池合适

1、定义 让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现就是线程池,也体现了经典设计模式中的享元模式(重用对象)。 例如,海底捞的服务员(线程),轮流…

“数字档案室测评”相关参考依据梳理

数字档案室建设无疑比数字档案馆建设应用范围更为广泛,涉及的单位类型和专业领域也更多。这一点从国家档案局的机构设置上也可以看出端倪: 国家档案局两个内设业务指导司中,档案馆(室)业务指导司主要针对档案馆和机关档案室,而经济…