【弹力设计篇】聊聊熔断设计

news2024/12/23 1:38:53

为什么需要熔断

熔断这个词一听从生活中就是保险丝超过一定的温度后自动断开,以此来保护家用电器,属于电路中自我保护装置。如果没有熔断,那么家用电器一定会损坏的。
进一步再来分析一下,在分布式系统中,各个系统之间其实会经常出现故障问题,如果能够自动检测到下游系统故障之后,直接断开请求,可以很好的保护系统。
那么重试和熔断的区别是什么,重试是在一定的时间内,系统可以恢复后进行重试,如果超过一定时间没有恢复,那么就需要熔断设计。

在这里插入图片描述

熔断设计

熔断设计可以保证频繁的调用下游系统而一直返回错误,造成CPU的资源浪费以及长时间的超时等待,二是可以保证在下游系统恢复之后,可以切换到系统正常调用状态。所以这么分析看的话,其实就是几种状态。系统正常、系统故障、系统恢复。所以非常适合采用状态机去实现。
熔断设计一般都是采用类似AOP的模式,对于业务代码无侵入。所以非常像一个代理模式。会自动记录某个时间段错误次数,决定是否返回继续还是错误。

在这里插入图片描述

  • 闭合状态 (Close)
    代表当前下游后段服务是正常的,但是会开启一个计数器来记录失败的次数,当在一定的时间内超过失败次数的阈值,则将状态切换到断开状态。然后会开始一个超时时钟,当该时钟超过了该时间,则切换到半断开状态。超时时间的设定可以给系统一次修正调用失败的错误,回复到系统正常状态。
  • 断开状态
    该状态下代表系统不可用,对于请求过来的请求可以直接返回错误,但是更好的方式是cache住本次请求数据,然后对于整个系统用户来说返回一样的数据。
  • 半开状态
    允许系统一定的请求量调用服务,如果这些请求都调用成功,那么可以认为之前导致失败的错误已经修正,熔断器切到闭合状态。

半断开状态可以有效防止正在恢复中的服务被突然而来的大量请求拖垮。

在这里插入图片描述
实现熔断器模式可以使得系统更加稳定和有弹性,系统可以从错误中恢复,并且减少错误对系统的影响。可以快速地拒绝哪些试图可能导致错误的服务调用,避免等待超时或者永远不会返回结果来提高系统的响应时间。
具体的开源框架就是 Netflix 的开源项目Hystrix

熔断设计的重点

  • 错误类型 。请求失败的原因可能很多,需要不同的情况采用不同的策略,熔断和重试一样,一般先走重试的策略,之后在打开熔断,有的是服务挂掉,这种就直接打开熔断。先重试后熔断。
  • 日志监控。日志应该记录所有失败的情况,使得管理员能够监控使用熔断器保护的服务的执行情况
  • 测试服务可用。如果服务宕机,使用熔断模式需要使用真实的用户进行测试服务可用。其实熔断器可以定时的去ping一下 服务的将康检测端口,来判断服务是否恢复。 比如机器对外的网络端口或者本级的port。之前就遇到 不小心把检测端口的API删除,导致服务正常启动但是就是没有用户流量进来。
  • 手动重制。如果出现系统故障或者系统已经恢复,可以通过后台进行人工介入使系统进行恢复或者熔断器断开。
  • 并发问题 一般来说,相同的熔断器可能会同时多个请求进行处理,所以不应该阻塞并发请求,尤其对结果进行统计的时候,应该成为一个共享的数据结构,一般使用无锁 atomic原子操作性能更好。
  • 资源分区 对于有量级的系统来说,数据会进行分区,分库分表等操作,所以单一的熔断器可能会把所有分区进行标记不可用,这样就可能导致一会可用 一会不可用,所以需要对有问题的分区进行熔断,而不是对整体。
  • 重试错误的请求,有些请求可能是参数错误的问题导致的,所以一般在设计的时候最好记录下出错的请求参数,并且需要被调用端支持幂等调用。

在这里插入图片描述

小结

本篇主要介绍了 熔断设计的解决的问题,其实主要还是实现系统调用层面的高可用,以此提升系统的稳定性。然后主要说了下熔断设计的几种状态,并且介绍了熔断设计的重点问题。最终我们都是在经过几次重试之后,然后进一步升级到熔断。

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

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

相关文章

建立TCP连接的各个系统调用

TCP 连接的过程图 服务器 socket() 函数 socket() 返回的 sockfd 是一个描述符。socket()对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识…

PX4仿真jMAVSim没有界面

切换java版本,使用java-8 sudo update-alternatives --config java删除旧文件 rm -rf Tools/jMAVSim/out编辑accessibility.properties 文件: sudo gedit /etc/java-8-openjdk/accessibility.properties注释掉下面这行 #assistive_technologiesorg.GNOME.Acessi…

笔试题:统计字符串中某字符串在其出现的字符个数

笔试题:统计字符串中某一子串的字符个数:例如字符串aabbcd,有aabb:4,ab:2 哈哈,这道题是小编面试音视频龙头企业的笔试题,以下是我写的代码:如果有错误,希望可以指正!!! 解题思路:利用双指针i和…

一刷总结篇

也养成了记录博客的好习惯吧,不过一刷有时也偷懒没跟上,但总体而言是比没刷代码随想录之前的状态要好。还是要记得当前目标是什么(深抓主要矛盾)。二刷代码随想录时每题要充分思考并且刷之前放过的题(如扩展提等&#…

单相导轨电表支持双路双控吗?

单相导轨电表是一种电子式电能表,它采用导轨式安装结构,体积小、安装方便,适用于城市、农村或工厂企业的单相电能计量和集中式安装。单相导轨电表可以支持双路双控,也就是可以同时测量两个电路的电能消耗并进行控制。 双路双控是指…

图形编辑器开发:是否要像 Figma 一样上 wasm

大家好,我是前端西瓜哥。 wasm 拿来做 Web 端的图形编辑器貌似是不错的选择。 因为图形处理会有相当多无法利用到 WebGL GPU 加速的 CPU 密集的计算。比如对一条复杂贝塞尔曲线进行三角化,对多个图形进行复杂图形的布尔运算。 图形编辑器性能天花板 F…

TypeChat,用TypeScript快速接入AI大语言模型

TypeChat是C# 和 TypeScript 之父 Anders Hejlsberg全新的开源项目。使用AI在自然语言和应用程序和API之间建立桥梁,并且使用TypeScript。 现在出现了很多大型语言模型,但是如何将这些模型最好地集成到现有的应用程序中,如何使用人工智能来接…

设计模式||工厂模式(含有代码样例)

什么是工厂模式? 工厂模式(Factory Pattern)是一种常见的创建型设计模式,它提供了一种封装对象创建过程的方式。工厂模式通过定义一个创建对象的接口,但具体的对象创建在子类中实现,这样可以将对象的实例化…

Docker系列 1 - 镜像和容器

Docker系列 1 - 镜像和容器 1、关于 Docker2、镜像 image3、容器 container 1、关于 Docker docker官网:http://www.docker.com docker中文网站:https://www.docker-cn.com/ Docker Hub 仓库官网: https://hub.docker.com/ Docker 的基本组成&#…

【C++】多态原理剖析,Visual Studio开发人员工具使用查看类结构cl /d1 reportSingleClassLayout

author:&Carlton tag:C topic:【C】多态原理剖析,Visual Studio开发人员工具使用查看类结构cl /d1 reportSingleClassLayout website:黑马程序员C tool:Visual Studio 2019 date:2023年7月24日 目…

电脑记事本在哪里?电脑桌面显示记事本要怎么设置?

绝大多数上班族在使用电脑办公时,都需要随手记录一些琐碎或重要的事情,例如工作注意事项、常用的文案、某项工作的具体要求、多个平台的账号和密码等。于是就有不少小伙伴想要使用电脑记事本软件来记录,那么电脑记事本在哪里呢?想…

VM虚拟机网络配置桥接模式方法步骤

VM虚拟机配置桥接模式,可以让虚拟机和物理主机一样存在于局域网中,可以和主机相通,和互联网相通,和局域网中其它主机相通。 vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式&…

C# | [极坐标] 与 [平面直角系坐标] 的相互转换

极坐标与平面直角系坐标的相互转换方法及C#代码实现 文章目录 极坐标与平面直角系坐标的相互转换方法及C#代码实现前言极坐标转换为平面直角系坐标计算公式示例代码运行结果 平面直角系坐标转换为极坐标计算公式示例代码运行结果 结束语 前言 极坐标和平面直角系坐标是常见的坐…

细胞生物学试剂UAMC1110,FAP-IN-1,相关数据特点说明

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ UAMC1110,FAP-IN-1,(S)-N-[2-(2-氰基-4,4-二氟-1-吡咯烷基)-2-氧代乙基]喹啉-4-甲酰胺 Product structure: Product specifications: 1.CAS No:N/A 2.Molecular f…

[Cotex-M3学习教程]-0.1-Cortex-M3概述

目录 1 Cortex-M3概述 1.1 ARM 处理器 1.2 cortex-M3介绍 1.3 cortex-M3结构概览图 1.4 cortex-M3组件 1.4.1 内核系统 1.4.2 NVIC 1.4.3 寄存器组 控制寄存器(CONTROL) 程序计数寄存器(PC:R15) 堆栈指针寄存器&#xf…

基于Javaweb实现ATM机系统开发实战(十四)交易记录分页实现

还是老规矩&#xff0c;先看前端页面查看需要传递哪些参数&#xff0c;并且把逻辑有问题的部分进行修改~ <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri&qu…

智能照明的特点及控制系统的实际案例分享

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 智能照明控制系统是利用先进电磁调压及电子感应技术&#xff0c;以公共照明统一格智能为平台&#xff0c;对供电进行实时监控与跟踪&#xff0c;自动平滑地调节电路的电压和电流幅度&#xff0c;改善照明电路中不平衡负荷所带来的额外功…

c++11/c++98动态规划入门第5课,经典DP问题 --- 区间

第1题 取数问题 查看测评数据信息 有一排N个数&#xff0c;你和小明2个人玩游戏&#xff0c;每个人轮流从2端取数&#xff0c;每次可以从左或右取&#xff0c;不能从中间取。你取的所有的数的和是你的得分&#xff0c;小明取的所有的数的和是小明的得分。如果你先取&#x…

【MySQL】MySQL HeatWave 介绍

HeatWave是一个分布式、可扩展、无共享、内存中、混合柱状的查询处理引擎&#xff0c;专为获得极致性能而设计。可以通过向MySQL数据库系统添加一个HeatWave集群来启用它。 HeatWave 是一种大规模并行、高性能内存查询加速器&#xff0c;可将分析工作负载、混合工作负载和机器…

5.string变量-读取一行

C里面的读一行的用法。getline&#xff08;cin,addr&#xff09;; 从标准输入设备cin&#xff0c;读取一行字符串保存到字符串变量addr中 如果用户直接回车什么都不读取就没有任何数据输入 读一行直到遇到回车符&#xff0c;注意不包括回车符。 判断字符串是不是空的 addr.em…