当前位置:首页 > PHP

php 实现熔断

2026-01-29 16:03:38PHP

熔断机制简介

熔断是一种系统保护机制,当服务调用失败率达到阈值时,自动停止请求并快速失败,避免雪崩效应。常见实现方式包括计数器、滑动窗口等。

php 实现熔断

基于计数器的熔断实现

通过记录失败请求次数,当达到阈值时触发熔断:

php 实现熔断

class CircuitBreaker {
    private $failureThreshold = 3;
    private $failureCount = 0;
    private $state = 'CLOSED';

    public function callService(callable $service) {
        if ($this->state === 'OPEN') {
            throw new Exception("Service unavailable (Circuit Breaker Open)");
        }

        try {
            $result = $service();
            $this->reset();
            return $result;
        } catch (Exception $e) {
            $this->failureCount++;
            if ($this->failureCount >= $this->failureThreshold) {
                $this->state = 'OPEN';
                // 可添加定时器自动恢复
            }
            throw $e;
        }
    }

    private function reset() {
        $this->failureCount = 0;
        $this->state = 'CLOSED';
    }
}

基于时间窗口的熔断改进

记录最近N秒内的失败率,更精准判断熔断状态:

class TimeWindowBreaker {
    private $windowSize = 10; // 秒
    private $failureRateThreshold = 0.5;
    private $failures = [];
    private $state = 'CLOSED';

    public function callService(callable $service) {
        $this->cleanOldFailures();

        if ($this->state === 'OPEN') {
            throw new Exception("Service unavailable");
        }

        try {
            $result = $service();
            return $result;
        } catch (Exception $e) {
            $this->failures[] = time();
            $this->evaluateState();
            throw $e;
        }
    }

    private function cleanOldFailures() {
        $currentTime = time();
        $this->failures = array_filter(
            $this->failures,
            fn($t) => $currentTime - $t <= $this->windowSize
        );
    }

    private function evaluateState() {
        $totalCalls = count($this->failures) + 1; // +1 for current call
        $failureRate = count($this->failures) / $totalCalls;

        if ($failureRate >= $this->failureRateThreshold) {
            $this->state = 'OPEN';
            // 可设置延迟恢复逻辑
        }
    }
}

熔断状态恢复策略

  • 自动恢复:通过定时器定期尝试重置状态
  • 半开状态:允许部分请求通过测试稳定性
// 半开状态示例代码片段
if ($this->state === 'OPEN' && time() - $this->lastFailure > $this->cooldownPeriod) {
    $this->state = 'HALF_OPEN';
    try {
        $testResult = $service();
        $this->reset();
    } catch (Exception $e) {
        $this->lastFailure = time();
    }
}

集成建议

  1. 结合Guzzle等HTTP客户端实现远程服务熔断
  2. 使用Redis共享熔断状态(分布式场景)
  3. 监控系统记录熔断事件以便分析

关键参数需根据实际业务调整:

  • 失败阈值(如5次/10秒)
  • 冷却时间(如30秒自动恢复)
  • 采样窗口大小(如60秒滚动统计)

标签: php
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaS…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HT…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT A…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…