深入浅出分布式技术原理
陈现麟
伴鱼技术中台负责人,前小米工程师
21241 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
深入浅出分布式技术原理
15
15
1.0x
00:00/00:00
登录|注册

09 | 雪崩(一):熔断,让故障自适应地恢复

限流错误
响应超时
资源消耗可控
小误伤范围
高敏感度
服务间调用、服务与数据库等
解决过载问题的场景
重试:提高可用性,重发请求
熔断:快速失败,避免雪崩
存活关注服务是否活着
过载关注服务状态
不关心应用层错误
过载错误
推荐“实例的接口”粒度
服务、实例、接口维度
半打开状态 (Half-Open)
断开状态 (Open)
闭合状态 (Closed)
故障沿调用链路逆向传播
内存、CPU、线程、文件描述符耗尽
机器宕机
突发流量
性能下降
判断服务过载的其他方法?
掌握熔断机制的关键点
实现熔断器避免雪崩
理解雪崩原因
熔断机制的适应范围
熔断与重试的关系
过载与存活的区别
错误类型
粒度控制
错误比例作为阈值
状态机维护
避免服务间调用导致的雪崩
类比电路保险丝
正反馈循环
资源耗尽导致不可用
服务处理能力过载
系统过载的直接表现
由小问题引起的连锁全局故障
局部故障正反馈循环放大
思考题
总结
熔断机制关键点
熔断机制
雪崩原因
雪崩现象
分布式系统中的雪崩与熔断机制

该思维导图由 AI 生成,仅供参考

你好,我是陈现麟。
通过学习重试幂等的内容,让我们在网络故障和部分失败的分布式系统中,也有办法确保程序之间的调用实现 Exactly-once 的效果,这样当系统出现临时故障的时候,用户依然能正常购买,我们的系统又健壮了一点。
在日常运维极客时间服务端系统的过程中,你一定碰到过大规模故障的情况,可是事后复盘时,却发现故障的起因,大多都是一些局部的小问题引起的,比如因为一个接口响应时间变长,使相关实例的协程或线程数暴涨,让系统的负载进一步增加,最终导致实例所有接口的响应时间都变长,这就从一个接口的局部故障演变成了一个全局的故障。
在一个分布式系统中,局部故障是不可避免的,但是如果不能将局部故障控制好,导致其演变成一个全局的系统故障,这对我们来说是不可以接受的,那么我们应该如何解决这个问题呢?
其实这就是分布式系统中的雪崩场景问题,那么从这节课开始,我们将用四节课的时间来解决,如何让一个分布式系统避免发生雪崩的问题。这一节课,我们先讨论雪崩现象出现的原因,然后再分析如何通过熔断机制来避免雪崩,最后一起总结熔断机制应该注意的关键点。

为什么会出现雪崩

雪崩是由于局部故障被正反馈循环,从而导致的不断放大的连锁故障,正如我们上文的例子所说,雪崩通常是由于整个系统中,一个很小的部分出现故障,进而导致系统其他部分也出现故障而引发的。但是,一个正常运行的服务为什么会发生雪崩呢?我认为在实际工作中,出现雪崩一般会经历以下三个阶段,如下图。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

分布式系统中的雪崩问题是由于局部故障被正反馈循环,导致不断放大的连锁故障。本文介绍了雪崩现象出现的原因,并提出了利用熔断机制来避免雪崩的方法。熔断机制通过监控错误比例来感知被调用服务的过载情况,一旦过载,立即将调用请求返回错误,从而防止雪崩的发生。此外,文章还讨论了熔断机制的关键点,包括粒度控制、错误类型、存活与过载的区别、重试和熔断的关系以及熔断机制的适应范围。通过熔断机制的应用,可以有效避免分布式系统出现雪崩问题,保障系统的稳定性和可靠性。文章深入探讨了熔断机制的实现细节和适用范围,为读者提供了解决分布式系统雪崩问题的实用方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出分布式技术原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 不吃辣👾
    由于单点过载导致单点机器故障,为了避免全局故障引入了熔断机制。一台机器熔断了,流量打到其他机器上,也会触发其他机器熔断机制,最后还不是整个系统对外不可用。和雪崩有啥区别呢?

    作者回复: 熔断后,请求会快速失败,不会将请求转发到其他节点的

    2022-03-30
    2
    5
  • 不吃辣👾
    老师 如果有两个相同的服务接口,因其保障等级,性能,可用性都不同,是不是将他们分开部署比较合适。同时也避免了雪崩发生。

    作者回复: 这个是可以的。 可用性是成本和收益之间的平衡。

    2022-04-07
    1
  • 墨龙
    根据基准环境下对接口的压测数据,提前设定一个阈值,如果队列中的等待数量大于这个数字,就简单认为是过载了。

    作者回复: 这个方式可行 不过更好的指标是“等待时间”,“等待数量”在突发流量的时候,会出现过载,但是可能系统并没有过载

    2022-03-08
  • 啊树
    请求在队列中的平均等待时间这个指标 -其中的队列是指请求方中准备请求接口的请求么?这个队列是由什么维护的?是tomcat么? 一般怎么计算这个平均等待时间?

    作者回复: 这个是和实现方式相关的,如果内部实现是生产者消费者模型,可以通过埋点统计来实现,如果不是这种模型是不好统计的,对于这个问题,在“雪崩(四)”中还有进一步的讨论。

    2022-02-18
    2
  • peter
    请教老师两个问题: Q1: “在熔断机制的模式下,服务调用方需要为每一个调用对象,可以是服务、实例和接口,维护一个状态机,在这个状态机中有三种状态:”根据这句话,需要具体的服务来维护状态机,这不合适吧。如果是这样,业务代码岂不是要写很多代码来描述被调用对象?应该是熔断器维护吧。 Q2: 粒度控制部分: A “熔断的敏感度高”,敏感度怎么理解? B “如果熔断器的阈值大于 10 %,那么将。。。。但是这个结果明显不是我们期待的。”,这段话想说明什么? 是不是想说“所以,熔断器的阈值不能大于 10 %”

    作者回复: Q1:你的理解是对的,前面就是描述在服务的调用方实现断路器的逻辑,熔断一般都是由框架来实现的。 Q2: A:熔断的敏感度高:可以这样来理解,假设熔断的粒度是服务,错误率超过 20% 就熔断,这个服务有非常多的实例和接口,如果一个接口异常了,但是其他的接口都是正常的,错误率就很难到 20%,也就不能触发熔断;如果粒度是一个实例的接口,阈值还是 20%,那么这个接口出现问题就能触发熔断了,敏感度高很多。 B:和 A 是同一个问题,是因为粒度粗,其他的接口是正常的,导致错误率很难道 10%。不是指熔断器的阈值不能大于 10 %。

    2022-02-16
  • 小叶
    在断开状态下,会启动一个超时计时器,当计时器超时后,状态切换到半打开状态。什么意思啊

    作者回复: 是指在断开状态下,因为所有的请求都会直接熔断,但是熔断的服务可能慢慢会好的,所以一次断开是一个比较小的时候,比较 60 秒,然后进入半打开状态,半打开状态的逻辑在文中有描述的,主要是确认后端服务是否恢复了。

    2022-02-16
  • 上杉夏香
    我在《Native Cloud Go》这本书上看到的熔断简单示例,Go 语言实现的,大家可以参考一下 type Circuit func(ctx context.Context) (string, error) func Breaker(circuit Circuit, failerThreshold int) Circuit { var ( consecutiveFailers int lastAttempt = time.Now() mu sync.RWMutex ) return func(ctx context.Context) (string, error) { mu.RLock() d := consecutiveFailers - failerThreshold if d >= 0 { // 重新尝试的时间点,以上一次尝试的时间点为基础 shouldRetryAt := lastAttempt.Add(time.Second * 2 << d) // exponential backoff algorithm if shouldRetryAt.After(time.Now()) { mu.RUnlock() return "", errors.New("service is unreachable") } } mu.RUnlock() resp, err := circuit(ctx) mu.Lock() defer mu.Unlock() lastAttempt = time.Now() if err != nil { consecutiveFailers++ return "", err } consecutiveFailers = 0 // reset failures counter return resp, nil } }
    2023-04-04归属地:北京
  • 无情
    可否再介绍下业界先进的实现熔断机制的中间件?
    2022-06-23
    1
  • Jxin
    答题 1.每次请求带上健康检测请求,实时获取服务端资源使用情况。 高并发场景无效,请求本身都返回不了,更别说追加的健康检测了。 疑问 2.实例接口的熔断,与rpc的故障转移,在作用上存在重复。仔细想想似乎熔断来做更合适。如此一来rpc应该只关注服务是否存活的场景(更新路由列表),而不是接口是否有故障。不知栏主怎么看?
    2022-02-25
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部