一文读懂容错机制

本文介绍了分布式、微服务项目中的容错机制,包括隔离机制、补偿机制、熔断机制和重试机制。隔离机制通过业务拆分和服务区分来防止故障蔓延;补偿机制用于保证最终的一致性和可用性,需要设计幂等性方法;熔断机制通过三种状态(关闭、打开、半开)保护下游服务,减少错误影响;重试机制针对暂时性故障进行尝试,防止网络波动带来的影响。这些机制在设计时需结合业务场景和监控系统进行考虑。
部署运行你感兴趣的模型镜像

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/u012482647/article/details/78148447

随着分布式、微服务项目的快速发展,各个服务之间的通讯,难免出现依赖关系,若某一个单元出现故障,就很容易因依赖关系而发生故障的蔓延,为了解决这样的问题,容错作为其中一项很重要的技术也广为人知。

导语

容错机制广义的理解,就是包含了很多处理错误的机制,如:熔断机制、降级机制、补偿机制、隔断机制等等。我们针对经常使用的机制进行讨论,说明这么多容错机制设计的思路,熟悉了这些之后,也许你对设计分布式项目会有所裨益。

隔离机制

隔离机制

  • 隔离设计思路
    如上图所示(图来源于网络),隔离来自单词隔板(Bulkheads),隔板作用就是如果某一边船舱漏水,不会导致整条船装满水而导致整条船下沉于水中。
    分布式项目中,我们通过技术实现隔板的作用,做到故障隔离,一般来说,一种是通过合适的业务线拆分项目,进行业务服务种类隔离,另一种是通过用户群体来区分用户访问哪台服务器,可以是城市划分(北京的访问北京服务器)或其他形式。

  • 隔离设计重点

    1. 定义好需要隔离业务的大小和粒度
    2. 隔离模式需要配置一些高可用、重试、异步、消息中间件等设计的方式配套使用
    3. 设计过程考虑运维的复杂度,要能驾驭的话,考虑自动化运维等
    4. 监控系统(重要、重要、重要)
补偿机制
  • 补偿机制的前提
    针对补偿机制的出现,本质上是解决ACID和BASE理论而设计的一个机制,关于ACID和BASE理论网上有很多知识,可以说是汗牛充栋.

有了对 ACID 和 BASE 的分析,你就可以发现,BASE理论容许系统处于短暂的不可用和不一致的状态,那么在设计的时候怎么去保证最终的可用和一致状态呢?这就需要引入补偿机制。

比如: 如果你如打印东西,电子文件拷入u盘,带到打印店,打印店老板开始打印,但是由于你拷错了文件,导致我们文件打印就是不可用的,那这也不会阻止我们要打印的文件,因为我们可以借用打印店老板电脑登陆邮箱下载下来,退一步来讲,如果邮箱没有,那我就取消本次打印,回家整理好,之后再来.这也就说明了业务流程必须执行回滚操作.

如果一个事务失败了或是超时了,我们需要不断地重试,努力地达到我们想要的结果,然而如果不能达到这个结果, 我们要把整个业务线状态恢复之前的状态, 如果有部分业务变化, 我们要把变化的数据更新回原来的状态.

一个好的补偿机制要做以下几个方面:
1. 要清楚的知道这个机制执行后要达到什么状态
2. 当补偿机制的代码运作起来,我们可以进行并行或串行
3. 对完成的事务进行修改,可以考虑加一个修改事务

看到这里相信你知道补偿机制主要做什么了,补偿机制主要做以下两件事:
1. 努力把一个业务执行完成
2. 如果执行不完成,将会启动一个补偿机制,回滚业务流程

  • 补偿设计重点
    1. 因为补偿机制是为了努力执行一个业务流程,需要这个流程中所设计的方法或接口支持幂等性,并且在上游有重试机制
    2. 如果业务流程有问题,一定要帮我们回滚和补偿
    3. 必须明白,业务补偿和业务逻辑是强业务关联的,很难通用
    4. 针对不同业务考虑不同细节(很多细节上,是根据业务考虑,望大家一定要考虑好再开工)
熔断机制
  • 熔断器设计思路
    设想一个场景,用户的请求调用服务A,服务A调用服务B。我们可以把B称作A的下游服务。服务B前面有负载均衡器。

后端服务可能因为各种原因出问题。例如:数据库慢查询,网络波动,或者内存争用。在这个情况下,如果服务A超时或者报错,用户很可能会重试。在如此混乱的情况下我们可以做什么来保护下游服务呢?

熔断机制目的是为了解决资源和失败率提供更多的控制,这个机制最重要的部分是熔断器能够快速对下游服务作出一些响应。线程池不会因为慢请求而阻塞,没有超时,而且也可能会给终端用户更有意义的返回数据。熔断器也给了下游服务足够的时间恢复正常。完全避免报错是很困难的,但是减少错误的影响完全可行。

在熔断机制中有3种主要的状态:

  1. 关闭(closed):让请求通过的默认状态。如果请求成功/失败但低于阈值,则状态保持不变。可能出现的错误是超过最大并发数和超时错误。
  2. 打开(open):当熔断器打开的时候,所有的请求都会被标记为失败;这是故障快速失败机制,而不需要等待超时时间完成。
  3. 半开(half-open):定期的尝试发起请求来确认系统是否恢复。如果恢复了,熔断器将转为关闭状态或者保持打开。
  • 熔断器设计重点
    1. 错误的类型 (针对不同的错误,开启不同的容错机制,有时候需要多个机制配合使用)
    2. 测试服务是否可用(利用心跳来检测远程服务的健康接口)
    3. 并发问题(针对同一时刻断路器请求调用的负担,一般来说会有一个共享数据结构,会导致有锁情况,我们需要改成无所的数据接口,这样会更好)
    4. 手动重制(失败操作的恢复很难确定,如果断路器保护的服务长时间不能用,管理员能够强制改成断开状态)
    5. 资源分区(针对下游数据层,我们可能做多库多表,我们要对根据那些数据区域进行熔断,而不是整条业务线)
    6. 监控系统(日志监控系统,重要的性质不用多强调)
重试机制
  • 重试机制的思路
    对上面的熔断器模型,如果B服务减小它的实例数量,将发生什么?许多A发起的请求可能遇到5XX报错。这将触发熔断器的失败报警。这就是为什么我们需要重试以避免间歇性网络抽风。
    所以,我们需要一个重试的机制。但是,我们需要明白的是,“重试”的语义是我们认为这个故障是暂时的,而不是永久的,所以我们会去重试.

  • 重试机制设计重点

    1. 要缺点错误类型,再做是否需要重试
    2. 重试的抖动数要根据业务缺点,不同的业务有不同的考量
    3. 如果超过指定次数和时间,重试机制就失去了意义
小结

好了,关于容错机制的多种机制就简单介绍到这里了,还有很多机制需要大家去通过业务场景进行使用,比如:降级机制、限流机制等等,针对容错技术上,可以选容错框架(比如:hystrix,虽然已经不再维护,但足够业务场景使用)或者是其他的容错框架.你应该明白了容错机制的重要性和必要性,之后再探讨其他技术切入点.

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

注意力机制(Attention Mechanism),尤其是自注意力(Self-Attention)机制,在自然语言处理(NLP)领域如Transformer模型中扮演了核心角色。它是一种计算模型对输入序列中每个位置的重要性的方式,允许模型集中关注相关的部分,而不是对所有信息等同对待。 传统的RNNs或CNNs只能依赖于固定长度的上下文窗口或局部信息。而注意力机制通过计算查询(query)、键(key)和值(value)之间的相似度,生成了一个注意力权重向量,这个向量表明了哪些输入部分应该被赋予更高的权重。具体来说: 1. **Query、Key和Value**:每个输入序列的位置都有一个对应的查询、键和值向量。通常查询用于寻找对应的信息,键用于评估查询的相关性,值则包含了原始的信息内容。 2. **注意力得分**:通过计算查询和每个键的点积,然后除以键的平方根,我们得到的是一个分数,表示每个位置对于当前查询的重要程度。 3. **加权和**:将这些得分转换为概率分布,然后用这个分布去乘以所有的值,得到加权后的“注意力”向量。这个向量只包含对当前位置最相关的部分。 4. **多头注意力**:为了捕捉不同类型的依赖,注意力机制可以有多个“头”(heads),每个头负责关注序列的不同方面。 注意力机制极大地提高了模型对长距离依赖的理解能力,并在机器翻译、文本摘要、情感分析等各种任务上取得了显著效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值