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

为什么需要熔断

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

在这里插入图片描述

熔断设计

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

在这里插入图片描述

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

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

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

熔断设计的重点

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

在这里插入图片描述

小结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

酷雷曼无人机技能培训考试圆满举办

2023年7月18日、19日,以“向云端起航,让技术落地”为主题的酷雷曼无人机技能提升培训会在酷雷曼北京运营中心隆重举行,来自全国各地的众多合作商参加了本次培训,通过系统、全面的学习成功取得了专业无人机飞行员执照,为…

django跨域设置

1.安装 (venv) ***\data_analyse_web>pip install django-cors-headers 2.添加应用 :在settings.py中添加应用,放到任意位置都行 INSTALLED_APPS {# ...corsheaders,# ... } 3. 设置中间层,在settings.py中添加中间层,放到最前面 MIDDLEWARE [c…

mac m1 触控栏TouchBar功能栏异常

电脑可能在高温下运行时间过长,导致TouchBar之前正常显示的调整屏幕亮度与调整声音等功能的按钮均丢失,然后看了一眼键盘设置,设置也是正常的,已勾选显示功能栏 下面请看 如何在MacBook Pro(macOS Monterey&#xff0…

PHP百度小程序rtc-room组件token获取经历

【前言】 目前就职盘古网络集团,一名PHPer程序员。我们的主营业务是百度产品相关,所以最近有了一个百度小程序项目,涉及其音视频组件做直播。 开发文档 百度智能小程序文档 鉴权token 百度智能小程序文档 嗯,很好的功能。结果测…

【Redis学习】01Redis基础

Redis(B站黑马)学习笔记 01Redis基础 文章目录 Redis(B站黑马)学习笔记前言01Redis基础初始Redis认识NoSQL认识Redis安装RedisLinux版安装官网压缩包下载使用yum下载(个人不推荐,找不到安装目录&#xff0…

golang+layui提升界面美化度--[推荐]

一、背景 golanglayui提升界面美化度--[推荐]; golang后端写的页面很难看,如何好看点呢,那就是layui https://layui.dev/ 也是一个简单上手容易使用的框架,类似jquery,对于后端开发来说满足使用需求 二、使用注意点…

Python 逻辑回归:理论与实践

文章目录 1. 介绍1.1 什么是逻辑回归?1.2 逻辑回归的应用领域 2. 逻辑回归的原理2.1 Sigmoid 函数2.2 决策边界2.3 损失函数 3. 逻辑回归的实现3.1 数据准备3.2 创建逻辑回归模型3.3 模型训练3.4 模型预测3.5 模型评估 4. 可视化决策边界4.1 绘制散点图4.2 绘制决策…

TortoiseGit安装

1、TortoiseGit简介 TortoiseGit是基于TortoiseSVN的Git版本的Windows Shell界面。它是开源的,可以完全免费使用。 TortoiseGit 支持你执行常规任务,例如commit、显示日志、区分两个版本、创建分支和标签、创建补丁等。 2、TortoiseGit下载 (1)Tortois…

RocketMQ第一课-快速实战以及集群架构搭建

一、RocketMQ产品特点 1、RocketMQ介绍 ​ RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。 ​ 早期阿里使用Act…

【如何训练一个中译英翻译器】LSTM机器翻译seq2seq字符编码(一)

系列文章 【如何训练一个中译英翻译器】LSTM机器翻译seq2seq字符编码(一) 【如何训练一个中译英翻译器】LSTM机器翻译模型训练与保存(二) 【如何训练一个中译英翻译器】LSTM机器翻译模型部署(三) 训练一个…

手机变局2023:一场瞄准产品和技术的“思维革命”

以折叠屏冲高端,已成为中国手机厂商们的共识。 在这个苹果未涉足的领域,国产手机厂商们加快脚步迭代推新,积极抢占机遇。但平心而论,虽然国产折叠屏机型众多,但市场上始终缺乏一款突破性的产品作为标杆,为…

Spring Boot 中的日志

一、日志有什么用? 日志是程序的重要组成部分,想象一下,如果程序报错了,不让你打开控制台看日志,那么你能找到报错的原因吗? 答案是否定的,写程序不是买彩票,不能完全靠猜&#xf…

【前端知识】React 基础巩固(三十一)——store数据的订阅和Redux的优化

React 基础巩固(三十一)——store数据的订阅和Redux的优化 一、store数据的订阅 store/index.js const { createStore } require("redux");// 初始化数据 const initialState {name: "test",title: "hello redux", };function reducer(state …

Mybatis的基本操作--增删改查

目录 查看数据 无参数 一个参数 多个参数 添加数据 修改数据 删除数据 查看数据 分三种情况:无参,有一个参数,有多个参数的情况。 (这里的详细操作步骤是博主的上一篇博客写的:初识Mybatis,并创建第…

QT【day1】

登录框: #include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {//窗口设置this->setFixedSize(600,600); //大小this->setWindowTitle("MUMU"); //文本内容this->setWindowOpacity(0.8); //透…

ArgoCD结合Gitlab交付项目到kubernetes集群

ArgoCD结合Gitlab交付项目到kubernetes集群 作者:行癫(盗版必究) 一:环境准备 1.kubernetes集群环境 2.HA_Argocd环境 3.Gitlab集群环境 二:项目配置 1.配置Gitlab 创建仓库,并写入yaml文件,利用yaml构建application;此案例结合了NFS实现持久化存储

前端随笔:HTML/CSS/JavaScript和Vue

前端随笔 1:HTML、JavaScript和Vue 最近因为工作需要,需要接触一些前端的东西。之前虽然大体上了解过HTML、CSS和JavaScript,也知道HTML定义了内容、CSS定义了样式、JavaScript定义了行为,但是却没有详细的学习过前端三件套的细节…

linux驱动开发入门(学习记录)

2023.7.6及7.7 概述了解 一 1.驱动框架 2. 字符设备 块设备,存储相关 网络设备驱动 不一定属于某一种类型二 1.获取外设或传感器数据,控制外设,数据会提交给应用程序 2.编写一个驱动,及测试应用程序 app。驱动和应用完全分开 3.驱…

Vue中TodoLists案例_底部交互

与上一篇Vue中TodoList案例_底部统计有俩个文件变化了 App.vue&#xff1a;定义了一个方法checkAllTodo&#xff0c;实现全选和取消全选&#xff0c;并将方法传给儿子组件MyFooter <template><div id"root"><div class"todo-container">…

springboot使用

ResponseBody ResponseBody 相当于调用 HttpServletResponse 的 getWriter() 输出&#xff0c; // 中文会乱码 response.getWriter().write("中文");ResponseBody 不仅仅简化写入到 response 中的过程&#xff0c;还将编码的问题解决了 response默认返回 字符串 的…