分布式架构-流量治理-服务容错

news2024/10/1 1:23:54

系列目录

分布式架构-流量治理-服务容错

分布式架构-流量治理-流量控制

引子

容错性设计(Design for Failure)是微服务的一个核心原则。随着拆分出的服务越来越多,随之而来会面临以下两个问题的困扰:

  • 由于某一个服务的崩溃,导致所有用到这个服务的其他服务都无法正常工作,这便是雪崩效应。如何防止雪崩效应便是微服务架构容错性设计原则的具体实践。
  • 服务虽然没有崩溃,但由于处理能力有限,面临超过预期的突发请求时,大部分请求直至超时都无法完成处理

本章我们将围绕以上两个问题,提出服务容错、流量控制等一系列解决方案。

1. 容错性设计

微服务真正的崛起是在 2014 年, Martin Fowler 与 James Lewis 合写的文章《Microservices: A Definition of This New Architectural Term》中首次提出微服务。文中定义的微服务的概念

微服务是一种通过多个小型服务组合来构建单个应用的架构风格,这些服务围绕业务能力而非特定的技术标准来构建。各个服务可以采用不同的编程语言,不同的数据存储技术,运行在不同的进程之中。服务采取轻量级的通信机制和自动化的部署机制实现通信与运维。文中列举了微服务的九个核心的业务与技术特征

  • 围绕业务能力构建(Organized around Business Capability)。
  • 分散治理(Decentralized Governance)。开发团队有直接对服务运行质量负责的责任,也应该有着不受外界干预地掌控服务各个方面的权力,譬如选择与其他服务异构的技术来实现自己的服务。
  • 通过服务来实现独立自治的组件(Componentization via Services)。强调通过“服务”(Service)而不是“类库”(Library)来构建组件。
  • 产品化思维(Products not Projects)。避免把软件研发视作要去完成某种功能,而是视作一种持续改进、提升的过程。譬如,在微服务下,要求开发团队中每个人都具有产品化思维,关心整个产品的全部方面是具有可行性的。
  • 数据去中心化(Decentralized Data Management)。微服务明确地提倡数据应该按领域分散管理、更新、维护、存储。
  • 强终端弱管道(Smart Endpoint and Dumb Pipe)。弱管道(Dumb Pipe)反对 SOAP 和 ESB 的那一堆复杂的通信机制。微服务提倡类似于经典 UNIX 过滤器那样简单直接的通信方式,RESTful 风格的通信在微服务中会是更加合适的选择。
  • 容错性设计(Design for Failure)。不再虚幻地追求服务永远稳定,而是接受服务总会出错的现实,要求在微服务的设计中,有自动的机制对其依赖的服务能够进行快速故障检测,在持续出错的时候进行隔离,在服务恢复的时候重新联通
  • 演进式设计(Evolutionary Design)。演进式设计则是承认服务会被报废淘汰。一个设计良好的服务,应该是能够报废的,而不是期望得到长存永生。
  • 基础设施自动化(Infrastructure Automation)。基础设施自动化,如 CI/CD 的长足发展,显著减少了构建、发布、运维工作的复杂性。使用微服务的团队更加依赖于基础设施的自动化,人工是很难支撑成百上千乃至成千上万级别的服务的。

微服务的九个核心特征,是构建微服务系统的指导性原则,但不是技术规范,并没有严格的约束力。但容错性设计是不能妥协的,因为分布式系统的本质是不可靠的。下面我们来看一些常用的容错策略容错设计模式。

2. 容错策略

面对故障,我们该做些什么?

这里列举几种常用容错策略的优缺点、应用场景总结如下表:
容错策略描述优点缺点应用场景
故障转移(Failover)

对于幂等服务,调用出现故障,系统不会立即向调用者返回失败结果,而是自动切换到其他服务副本

尝试其他副本能否返回成功调用的结果,从而保证了整体的高可用性。

系统自动处理,调用者对失败的信息不可见增加调用时间,额外的资源开销调用幂等服务
对调用时间不敏感的场景

快速失败

(Failfast)

对于非幂等的服务,重复调用就可能产生脏数据,引起的麻烦远大于单纯的某次服务调用失败,此时就

应该以快速失败作为首选的容错策略。

调用者有对失败的处理完全控制权
不依赖服务的幂等性

调用者必须正确处理失败逻辑,如果一味只是

对外抛异常,容易引起雪崩

调用非幂等的服务
超时阈值较低的场景

安全失败

(Failsafe)

部分旁路服务失败了也不应该影响核心业务的正确性。旁路逻辑调用失败了,正确返回,并返回一个符

合要求的数据类型的对应零值,然后自动记录一条服务调用出错的日志备查即可。

不影响主路逻辑只适用于旁路调用调用链中的旁路服务

沉默失败

(Failsilent)

当请求失败后,就默认服务提供者一定时间内无法再对外提供服务,不再向它分配请求流量,将错误隔

离开来,避免对系统其他部分产生影响。

控制错误不影响全局出错的能力将在一段时间内不可用频繁超时的服务

故障恢复

(Failback)

故障恢复一般不单独存在,而是作为其他容错策略的补充措施,通常默认会采用快速失败+故障恢复的

策略组合。塞进MQ消息,系统自动异步重试调用。

调用失败后自动重试,也不影响主路逻辑重试任务可能产生堆积,重试仍然可能失败

调用幂等服务,调用链中的旁路服务
对实时性要求不高的主路逻辑也可以使用

并行调用

(Forking)

同时向多个服务副本发起调用,只要有其中任何一个返回成功,那调用便宣告成功,这是一种在关键场

景中使用更高的执行成本换取执行时间和成功概率的策略。

尽可能在最短时间内获得最高的成功率额外消耗机器资源,大部分调用可能都是无用功资源充足且对失败容忍度低的场景

广播调用

(Broadcast)

广播调用与并行调用是相对应的,广播调用则是要求所有的请求全部都成功,这次调用才算是成功

任何一个服务提供者出现异常都算调用失败,

支持同时对批量的服务提供者发起调用资源消耗大,失败概率高

只适用于批量操作的场景,通常会被用于

实现“刷新分布式缓存”这类的操作。

仔细分析这7种常见容错策略,故障转移、快速失败、安全失败、沉默失败比较常见;故障恢复+快速失败经常结合使用,提供一种延迟重试、最终一致性策略,在现代分布式业务中很常见;并行/广播调用几乎很少用,只在特定目的场景使用。

3. 容错设计模式

要实现某种容错策略,我们该如何去做?

为了实现各种各样的容错策略,开发人员总结出了一些被实践证明是有效的服务容错设计模式,譬如微服务中常见的断路器模式、舱壁隔离模式,重试模式,等等,以及将在下一节介绍的流量控制模式,如滑动时间窗模式、漏桶模式、令牌桶模式,等等。

3.1 断路器模式

断路器模式是微服务架构中最基础的容错设计模式。基本思路:通过代理(断路器对象)来一对一地(一个远程服务对应一个断路器对象)接管服务调用者的远程请求。断路器会持续监控并统计服务返回的成功、失败、超时、拒绝等各种结果,当出现故障(失败、超时、拒绝)的次数达到断路器的阈值时,它状态就自动变为“OPEN”,后续此断路器代理的远程访问都将直接返回调用失败,而不会发出真正的远程服务请求。通过断路器对远程服务的熔断,避免因持续的失败或拒绝而消耗资源,因持续的超时而堆积请求,最终的目的就是避免雪崩效应的出现。由此可见,断路器本质是一种快速失败策略的实现方式,它的工作过程可以通过下面图:

3.2 舱壁隔离模式

 舱壁隔离模式是常用的实现服务隔离的设计模式,舱壁这个词是来自造船业的舶来品,它原本的意思是设计舰船时,要在每个区域设计独立的水密舱室,一旦某个舱室进水,也只是影响这个舱室中的货物,而不至于让整艘舰艇沉没。这种思想就很符合容错策略中失败静默策略

1.服务调用维度有两种常见实现:

  1. 线程隔离:为每个服务单独设立线程池,这些线程池默认不预置活动线程,只用来控制单个服务的最大连接数。典型的就是Hystrix的线程隔离设计。缺点是对性能影响较大。(大概会为每次服务调用增加约 3 毫秒至 10 毫秒的延时)原理如下图:
  2. 信号量机制(Semaphore):控制一个服务并发调用最大次数。为每个远程服务维护一个线程安全的计数器即可,当服务开始调用时计数器加 1服务返回结果后计数器减 1,一旦计数器超过阈值就限流。(Semaphore懂点计算机的都知道了,这个linux内核原语;应用层语言Java中也有这个类)。

2.实际上舱壁隔离还可以从其它维度来实现,比如:按功能、按子系统、按用户类型、地域等等。

3.3 重试模式

故障转移和故障恢复策略都需要对服务进行重复调用,差别是同步的/后台异步进行的。这两个策略都需要使用重试模式来实现。重试模式适合解决系统中的瞬时故障,简单的说就是有可能自己恢复(Resilient,称为自愈,也叫做回弹性)的临时性失灵,网络抖动、服务的临时过载(典型的如返回了 503 Bad Gateway 错误)这些都属于瞬时故障。适合做重试的服务调用的条件有:

  1. 仅在主路逻辑的关键服务上进行同步的重试,不是关键的服务,一般不把重试作为首选容错方案,尤其不该进行同步重试。
  2. 仅对由瞬时故障导致的失败进行重试。功能完善的服务治理工具会提供具体的重试策略配置(如 Envoy 的Retry Policy),可以根据包括 HTTP 响应码在内的各种具体条件来设置不同的重试参数。
  3. 仅对具备幂等性的服务进行重试。
  4. 重试必须有明确的终止条件,常用的终止条件有两种:超时终止、次数终止。

本节介绍的容错策略和容错设计模式,最终目的均是为了避免服务集群中某个节点的故障导致整个系统发生雪崩效应,但仅仅做到容错,只让故障不扩散是远远不够的,我们还希望系统或者至少系统的核心功能能够表现出最佳的响应的能力,不受或少受硬件资源、网络带宽和系统中一两个缓慢服务的拖累。下一节,我们将面向如何解决集群中的短板效应,去讨论服务质量、流量管控等话题。

===========参考================

全文学习整理自:凤凰架构:https://icyfenix.cn/distribution/traffic-management/failure.html

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

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

相关文章

MyBatis的基本使用

MyBatis 为啥MyBatis会使用xml 在一个程序中,若需要操作数据表,那么 SQL 语句有两种存放方式:1. 放到 Java 类里面(这个就存在大量的字符串拼接,还有占位符需要处理-----JDBC);2:放…

TypeScript深度剖析: TypeScript 装饰器的理解?应用场景?

面试官:说说你对 TypeScript 装饰器的理解?应用场景? 一、是什么 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上 是一种在不改变原类和使用继承的情况下&#…

程序员中的女性力量——做不被定义的自己

她是office lady,亦是程序媛,程序员界的靓丽色彩,不可或缺。 “只有那些疯狂到以为自己能够改变世界的人——才能真正改变世界。” 女性该如何定义自己?程序媛怎么发挥自己最大的价值。 争取自己做选择,经济和思想都独…

Spring基础与创建

目录 前言 Spring基础与核心概念 Spring是什么 1、什么是容器 2、什么是IoC 3、理解SpringIoC 4、DI(依赖注入) Spring的创建和使用 1、创建Spring项目 1.1、创建一个普通Maven项目 1.2、添加Spring框架支持 1.3、添加启动类和main方法 2、…

【c++】:STL模板中string的使用

文章目录 STL简介一.认识string二.string中基本功能的使用总结STL简介 STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本 原始版本 Alexand…

15_MySQL存储过程与存储函数

MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。1. 存储过程概述1.1 理解含义:存储过程的英文是 Stored Pro…

JDK8新特性宝典

JDK8新特性 ​ Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台 课程内容的介绍 了解Java发展史Lambda表达式…

[深入理解SSD系列 闪存2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…

Apache DolphinScheduler GitHub Star 突破 10000!

点击蓝字 关注我们今天,Apache DolphinScheduler GitHub Star 突破 10000,项目迎来一个重要里程碑。这表明 Apache DolphinScheduler 已经在全球的开发者和用户中获得了广泛的认可和使用。DolphinScheduler 旨在解决公司日常运营中的大数据处理工作流调度…

Redis之持久化操作

目录 一、简介 二、RDB 1、自动触发 2、手动触发 3、RDB 的优点和缺点 三、AOF 1、AOF的工作流程 2、AOF的配置 3、AOF的优点和缺点 4、俩种持久化的方式如何选择? 一、简介 1、什么是持久化? 持久化是指将内存中的数据同步到磁盘中&#xf…

策略模式详解

文章目录策略模式(行为模式)1. 策略模式介绍2. 好处3. 场景案例4. 案例源码1. 代码结构2. 榜单服务接收消息入口3. 基础任务类4. 定义策略模式转发的规范5. 代理的第一层6. 代理的第二层抽象父类:定义视频聊榜单代理规范7. 代理的第二层实现子…

elasticsearch自定义企业词典

我们中文分词用的是ik,但是ik只是对基本的中文词进行了分词,而对于企业或者人名没有进行分词。比如,我搜索中国平安,那么ik只能分成中国、平安如果这样,这肯定是不行滴!接下来,俺就教你&#xf…

历史上被发现的第一个真正的Bug - Grace Hopper

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

【bug】antd全局的主题色样式被覆盖,被修改为`antd`默认的主题色

背景: 项目本身修改了主题色,配置如下: // umi配置文件 export default {theme: {primary-color: #2F54EB, // 全局主色}, };需要对图片上传组件做封装,并在项目中统一引用,如下 import { TdsUpload } from tdsComponents;环境信息 node tiandstiandsdeMacBook…

【JavaEE】前后端分离实现博客系统(页面构建)

文章目录1 效果展示1.1 博客登录页面1.2 博客列表页面1.3 博客详情页面1.4 博客编辑页面2 页面具体实现2.1 博客列表页的实现2.2 博客详情页的实现2.3 博客登录页面的实现2.4 博客编辑页面的实现写在最后1 效果展示 1.1 博客登录页面 用于实现用户的登录功能,并展…

2023年3月西安/杭州/深圳/东莞NPDP产品经理认证考试报名

产品经理国际资格认证NPDP是国际公认的唯一的新产品开发专业认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年…

什么是量子计算?

什么是量子计算? 量子计算机仍处于起步阶段,正在影响已经在经典计算机上运行的新一代模拟,现在使用 NVIDIA cuQuantum SDK 进行加速。 在史蒂夫乔布斯 (Steve Jobs) 推出可以放入口袋的计算机之前 27 年,物理学家保罗贝尼奥夫 (P…

[MySQL核心]2.select单表查询常见操作

MySQL核心--select单表查询常见操作select单表查询常见操作关于通配符*的使用结合MySQL运算符去重distinct空值查询union合并查询带in子查询(重点)limit分页查询排序order by分组group by笔试实践问题(新浪)select单表查询常见操作 关于通配符*的使用 项…

记录实现操作系统互斥锁的一次思考

今天实现操作系统互斥锁的时候遇到一个有趣的问题。 场景 有两个进程分别名为 taskA,taskB,采取时间片轮转的方式交替运行——也即维护了一个 ready_queue,根据时钟中断来 FIFO 地调度任务。它们的任务是无限循环调用 sys_print() 来打印自…

华为OD机试题,用 Java 解【用户调度问题】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…