首页 > 其他分享 >服务器雪崩的应对策略之----熔断机制

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

时间:2024-06-20 11:30:23浏览次数:10  
标签:std 状态 请求 int ---- failure 熔断 服务器

熔断机制(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 milliseconds
    std::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 time
    return counter % 2 == 0;
}

int main() 
{
    CircuitBreaker breaker(3, 5000);  // Allow 3 failures before opening circuit, 5 seconds recovery timeout

    for (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函数:模拟一系列请求,并展示熔断机制如何工作。

结论

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

标签:std,状态,请求,int,----,failure,熔断,服务器
From: https://blog.csdn.net/weixin_44046545/article/details/139815722

相关文章

  • 服务器雪崩的应对策略之----降级处理
    降级处理(FallbackHandling)是一种在系统出现故障或压力过大的情况下,通过提供简化或备用服务来维持系统基本功能的技术。降级处理可以帮助系统在部分功能失效时依然能够提供基本的服务,从而提高系统的可用性和用户体验。常见的降级处理方法一、降级处理策略二、不同策略的......
  • 服务器雪崩的应对策略之----异步处理
    异步处理(AsynchronousProcessing)是提高系统并发性和性能的重要技术。在异步处理模式下,任务可以在等待其他操作(如I/O操作、网络请求等)完成时继续执行其他任务,从而避免阻塞,提高资源利用率和系统响应速度。以下介绍几种在C++中实现异步处理的方法,并提供示例代码。常见的异......
  • 【总线】AXI4第二课时:深入AXI4总线的基础事务
                    大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣,那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者,AXI4以其高性能和高度可扩展性,成为了现代电子系统中不可或缺的通信桥梁。......
  • 基于单片机的太阳能智能充电器、储能器设计系统
    **单片机设计介绍,基于单片机的太阳能智能充电器、储能器设计系统文章目录一概要二、功能设计设计思路三、软件设计原理图五、程序六、文章目录一概要  基于单片机的太阳能智能充电器、储能器设计系统概要如下:一、系统概述本系统以单片机为核心,结合太阳......
  • 基于单片机 K 型热电偶冷端补偿的温度检测及报警装置设计
    **单片机设计介绍,基于单片机K型热电偶冷端补偿的温度检测及报警装置设计文章目录一概要二、功能设计设计思路三、软件设计原理图五、程序六、文章目录一概要  基于单片机K型热电偶冷端补偿的温度检测及报警装置设计概要如下:一、设计背景与意义随着工......
  • 【C++修行之道】C/C++内存管理
    目录一、C/C++内存分布 1.选择题: 2.填空题: 3.sizeof和strlen区别? 二、C语言中动态内存管理方式:malloc/calloc/realloc/free 1.malloc/calloc/realloc的区别是什么?2.这里需要free(p2)吗?三、C++内存管理方式3.1new/delete操作内置类型3.2new和delete操作......
  • 录屏神器Camtasia 2024中文永久激活授权版(附安装教程+汉化补丁) 喀秋莎(屏幕录制剪辑
    录屏&剪辑软件Camtasia如期发布最新版,带来的新功能非常实用!我们今天带来的是CamtasiaStudio2024最新版,附带crack破解程序(注册机)和激活码。可让你不花一分钱永久使用。写在前面:破解版仅供个人使用,请勿随意传播或商用。激活码使用后请勿频繁换机。频繁换机易导致禁码。......
  • 2748. 美丽下标对的数目(Rust暴力枚举)
    题目给你一个下标从0开始的整数数组nums。如果下标对i、j满足0≤i<j<nums.length,如果nums[i]的第一个数字和nums[j]的最后一个数字互质,则认为nums[i]和nums[j]是一组美丽下标对。返回nums中美丽下标对的总数目。对于两个整数x和y,如......
  • 计算几何【Pick定理】
    Pick定理Pick定理:给定顶点均为整点的简单多边形,皮克定理说明了其面积A{\displaystyleA}A和内部格点数目......
  • IDEA报错:Cannot invoke(class=Package]sonListener,method=after,topic=BulkFileListe
    1.问题描述安装IDEA23年版本后创建.java文件失败并报错无法创建类无法解析模板"Class",措误消息:Cannotinvoke(class=Package]sonListener,method=after,topic=BulkFileListener)2.解决方式按如下图片检查以下设置2.1检查文件类型2.2检查文件和代码模板2.3检......