当前位置: 首页 > news >正文

服务器雪崩的应对策略之----熔断机制

熔断机制(Circuit Breaker)是一种保护系统稳定性的重要手段。它的主要目的是防止系统在依赖的服务出现问题时,继续发送请求,从而保护系统免受进一步的影响。熔断机制通过监控请求的成功和失败率,在检测到故障率超过预设阈值时,自动切换到熔断状态,停止对故障服务的请求。熔断状态一段时间后,再尝试恢复服务的调用。

常见的熔断机制

  • 熔断机制的三种状态
  • 示例代码
  • 代码解读
  • 结论

熔断机制的三种状态

  1. Closed(闭合状态)

    • 正常状态下,所有请求都会被发送到依赖服务。
    • 监控请求的成功和失败情况。
  2. Open(断开状态)

    • 当故障率超过阈值时,熔断器进入断开状态。
    • 此时,所有请求都会立即失败或返回备用方案,而不会发送到依赖服务。
  3. Half-Open(半开状态)

    • 在断开状态保持一段时间后,熔断器尝试恢复部分请求。
    • 如果部分请求成功,则恢复到闭合状态;如果仍然失败,则回到断开状态。

示例代码

下面的示例代码展示了一个简单的熔断机制实现:

#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>enum class CircuitBreakerState 
{Closed,Open,HalfOpen
};class CircuitBreaker 
{
public:CircuitBreaker(int failure_threshold, int recovery_timeout): state(CircuitBreakerState::Closed),failure_count(0),failure_threshold(failure_threshold),recovery_timeout(recovery_timeout) {}bool allow_request() {std::lock_guard<std::mutex> lock(mutex);auto now = std::chrono::steady_clock::now();if (state == CircuitBreakerState::Open) {if (std::chrono::duration_cast<std::chrono::milliseconds>(now - last_failure_time).count() > recovery_timeout) {state = CircuitBreakerState::HalfOpen;return true;  // Allow a limited number of requests to test recovery} else {return false;}}return true;}void record_success() {std::lock_guard<std::mutex> lock(mutex);failure_count = 0;state = CircuitBreakerState::Closed;}void record_failure() {std::lock_guard<std::mutex> lock(mutex);failure_count++;if (failure_count >= failure_threshold) {state = CircuitBreakerState::Open;last_failure_time = std::chrono::steady_clock::now();}}private:CircuitBreakerState state;int failure_count;int failure_threshold;int recovery_timeout;  // in millisecondsstd::chrono::steady_clock::time_point last_failure_time;std::mutex mutex;
};bool mock_service_call() 
{static int counter = 0;counter++;// Simulate a service that fails 50% of the timereturn counter % 2 == 0;
}int main() 
{CircuitBreaker breaker(3, 5000);  // Allow 3 failures before opening circuit, 5 seconds recovery timeoutfor (int i = 0; i < 20; ++i) {if (breaker.allow_request()) {if (mock_service_call()) {std::cout << "Request " << i << " succeeded\n";breaker.record_success();} else {std::cout << "Request " << i << " failed\n";breaker.record_failure();}} else {std::cout << "Request " << i << " blocked by circuit breaker\n";}std::this_thread::sleep_for(std::chrono::milliseconds(500));  // Simulate time between requests}return 0;
}

代码解读

  1. CircuitBreaker类:封装熔断器的状态管理逻辑。

    • allow_request():决定是否允许请求通过熔断器。
    • record_success():记录成功的请求,重置失败计数,并将状态恢复为闭合状态。
    • record_failure():记录失败的请求,增加失败计数,并在失败计数达到阈值时将状态设置为断开状态。
  2. mock_service_call():模拟依赖服务的请求。这里简单地模拟了一个服务,它有50%的概率失败。

  3. main函数:模拟一系列请求,并展示熔断机制如何工作。

结论

熔断机制是一种有效的保护系统的方法,尤其是在依赖外部服务时。通过合理的熔断配置,可以避免系统因为外部服务故障而陷入崩溃状态,从而提升系统的稳定性和可靠性。

相关文章:

  • PXE批量装机
  • Flink DataSource介绍
  • 【html】用html+css实现银行的账户信息表格
  • Java面试——认证与授权
  • 【ARMv8/ARMv9 硬件加速系列 2 -- ARM NEON 加速运算介绍】
  • 浔川AI社宣布正式开创“浔川AI助手”——浔川AI社
  • 矩阵补全IGMC 学习笔记
  • ubuntu中如何使用supervisor管理进程
  • 毕业设计——可视化实验仿真平台
  • 【Ruby简单脚本01】查看wifi密码
  • 产品Web3D交互展示有什么优势?如何快速制作?
  • 构建 Linux 内核指南
  • 给wordpress添加限制游客浏览数量功能
  • 分布式事务在Java中的实现与优化
  • 密码(6)
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • docker容器内的网络抓包
  • echarts花样作死的坑
  • Effective Java 笔记(一)
  • Java编程基础24——递归练习
  • java第三方包学习之lombok
  • mysql innodb 索引使用指南
  • Mysql5.6主从复制
  • OSS Web直传 (文件图片)
  • rc-form之最单纯情况
  • React组件设计模式(一)
  • session共享问题解决方案
  • 基于Android乐音识别(2)
  • 深度学习中的信息论知识详解
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我这样减少了26.5M Java内存!
  • AI算硅基生命吗,为什么?
  • const的用法,特别是用在函数前面与后面的区别
  • #include<初见C语言之指针(5)>
  • #图像处理
  • $(function(){})与(function($){....})(jQuery)的区别
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • ******之网络***——物理***
  • .NET CLR基本术语
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET开发不可不知、不可不用的辅助类(一)
  • /etc/sudoers (root权限管理)
  • :中兴通讯为何成功
  • @Builder用法
  • @RequestParam详解
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [.NET]桃源网络硬盘 v7.4
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——