周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

37 | 要实现某种容错策略,我们该怎么做?

你好,我是周志明。今天,我们继续学习服务容错的实现方法。
在上一讲,我们首先界定了容错策略和容错设计模式这两个概念:容错策略,指的是“面对故障,我们该做些什么”;而容错设计模式,指的是“要实现某种容错策略,我们该如何去做”。
然后,我们讲了 7 种常见的容错策略,包括故障转移、快速失败、安全失败、沉默失败、故障恢复、并行调用和广播调用。
那么为了实现各种各样的容错策略,开发人员总结出了一些被实践证明有效的服务容错设计模式。这些设计模式,包括了这一讲我们要学习的,微服务中常见的断路器模式、舱壁隔离模式和超时重试模式等,以及我们下一讲要学习的流量控制模式,比如滑动时间窗模式、漏桶模式、令牌桶模式,等等。
我们先来学习断路器模式。

断路器模式

断路器模式是微服务架构中最基础的容错设计模式,以至于像 Hystrix 这种服务治理工具,我们往往会忽略了它的服务隔离、请求合并、请求缓存等其他服务治理职能,直接把它叫做微服务断路器或者熔断器。这下你明白断路器模式为啥是“最基础”的容错设计模式了吧,也明白为啥我们要首先学习这种模式了吧。
断路器模式最开始是由迈克尔 · 尼加德(Michael Nygard)在“Release It!”这本书中提出来的,后来又因为马丁 · 福勒(Martin Fowler)的文章“Circuit Breaker”而广为人知。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

舱壁隔离模式是微服务架构中常见的设计模式,通过将服务隔离为独立的水密舱室,实现局部失败不影响全局的容错策略。本文介绍了舱壁隔离模式的原理和实现方式,包括使用线程池和信号量机制来控制单个服务的最大连接数,以及在不同层面应用舱壁隔离模式的方法。同时,文章还强调了舱壁隔离模式在微服务架构中的重要性,以及与断路器模式、服务熔断和服务降级的联系与差别。总的来说,舱壁隔离模式是实现静默失败策略的重要手段,对于保障系统稳定性具有重要意义。 此外,文章还介绍了重试模式的应用范畴和实现方式,强调了重试模式适合解决系统中的瞬时故障,并提出了判断是否应该对一个服务进行重试的四个条件。同时,文章指出了重试模式的滥用风险,并提出了避免滥用的建议。最后,文章总结了熔断、隔离、重试、降级、超时等概念在建立具有韧性的微服务系统中的必要性,并探讨了自动扩缩和动态调整容错策略的重要性。 总的来说,本文全面介绍了微服务架构中常见的安全策略实现方式,为读者提供了全面的技术视角和实践经验。文章内容涵盖了舱壁隔离模式和重试模式的原理、应用和风险,以及对于建立具有韧性的微服务系统的必要性和未来发展方向的展望。

该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • Jxin
    这些东西都懂。但周大佬这一波讲解,第一次感觉这么清晰。除了知识,也得学习周大佬对知识整理能力,对讲好一个东西的基本步奏。牛逼死了。周大佬新年快乐。

    作者回复: 谢谢,也祝您新年快乐。

    2021-02-14
    2
    5
  • 杨迪
    老师今天还在更新课程,提前祝您新年快乐了

    作者回复: 谢谢,也祝您新年快乐

    2021-02-10
    2
    5
  • zhanyd
    断路器通过对远程服务进行熔断,就可以避免因为某个服务持续的失败或拒绝而不断地消耗资源,来保护整个系统,就像我们家里的保险丝,当电器短路时熔断保险丝,来保护整条线路。 舱壁隔离模式的关键词是隔离,通过隔离故障模块,把损失限制在局部范围内,不影响全局。 在实现重试模式时要注意:1.是否有必要重试;2.是否应该重试;3.是否能够(幂等性)重试;4.什么时候应该终止重试。
    2021-02-10
    10
  • Helios
    在错误处理中,最简单的也是最难的,我认为就是重试了。 什么说简单,因为随便一个开发人员都会用,就是加个条件判断呗,但是如果上升到整个分布式系统那就不是简单的事情了。 如果A调用B,B调用C,C调用D 1、 如果调用D触发了重试,每一个调用都是三次的话,那就会增加九次调用,A才能感知到失败 2、 如果A的超时时间是100ms,如果B或者到C执行超过了100ms,B,C本身是不知道的,还会继续往下调用。 其实上面两个问题最好都是在架构,或者是框架层面解决,如果能够把上层的上下文传递下去就能解决上面的两个问题了。
    2021-02-16
    8
  • 李二木
    容错实现方案: 1 断路器模式 通过代理(断路器对象)来一对一(一个远程服务对应一个断路器对象)地接管服务调用者的远程请求,本质上是快速失败策略 的一种实现方式 2 舱壁隔离模式 服务隔离,就是避免某一个远程服务的局部失败影响到全局 2.1 类型 1)线程池隔离 2)信号量机制 3 重试 自己恢复的临时性失灵请求 3.1 重试需要满足下面4个要求 1)仅在主路逻辑的关键服务上进行同步的重试 2)仅对由瞬时故障导致的失败进行重试 3)仅对具备幂等性的服务进行重试 4)重试必须有明确的终止条件 3.2 重试终止条件: 1)超时终止 2)次数终止
    2021-02-23
    6
  • 瑶老板的小弟
    限流方案线程池和信号量对比 线程池隔离性更强,但是资源消耗更多,可以响应中断,对与异步RPC调用更友好。 信号量更轻量,但是隔离性不完整。 例子:WEB容器线程进来以后,RPC调用如果可以并行处理,则使用线程池可以提高请求响应速度,用线程池隔离更好。如果RPC调用必须要同步返回结果,也用信号量更好,但是线程还是属于容器请求线程。
    2023-02-03归属地:北京
  • null
    如果按用户等级,或vip进行隔离, 那如何在接入层,流量转发前,判别用户等级和vip。 这部分数据应该是在业务数据库里吖
    2021-09-17
    1
  • 李二木
    Retry Policy 链接 报404
    2021-02-23
  • 郭毅
    老师我想问一下,假设我一个订单服务有下单方法和订单报表导出方法,服务隔离指的是订单服务和别的服务隔离还是下单和报表这俩隔离呢
    2021-02-19
    1
  • walnut
    重试模式中的异步重试对于put方法是不是可能存在时序问题?两次put调用信息不同,结果以最后调用的为准。 静态限制服务调用并发数有可能存在问题,用户调用链路可能调用了20个服务,因为最后一个服务调用受限导致整个调用失败。
    2021-02-10
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部