您现在的位置是:网站首页 > 心得笔记

微服务架构中的熔断、限流与降级

盛悦2025-02-25135人围观
简介在微服务架构中,随着系统规模的扩大和服务数量的增加,服务之间的依赖关系变得更加复杂。一旦某个服务出现问题(如响应缓慢或不可用),可能会引发连锁反应,导致整个系统崩溃。为了应对这些问题,我们需要引入 熔断、限流与降级 等机制,确保系统的稳定性和高可用性。

假设我们正在开发一个电商系统,其中包含以下服务:

  • 订单服务 :负责创建和管理订单。
  • 库存服务 :负责查询和扣减商品库存。
  • 支付服务 :负责处理支付请求。

在秒杀活动中,订单服务需要调用库存服务和支付服务。由于秒杀活动期间流量激增,库存服务和支付服务可能会出现响应缓慢甚至不可用的情况。为了确保订单服务的稳定性,我们需要引入 熔断、限流与降级 机制。


1.熔断机制

  • 熔断机制的核心思想 :在微服务架构中,当某个服务出现故障或响应超时时,熔断器会切断对该服务的调用,避免故障扩散到其他服务。一段时间后,熔断器会尝试恢复调用,如果服务恢复正常,则关闭熔断;否则继续保持熔断状态。

  • 实际案例 :在秒杀活动中,库存服务可能因为流量过大而变得不可用。如果订单服务继续调用库存服务,会导致线程池耗尽,最终影响整个系统。因此,我们需要对库存服务进行熔断保护。

php实现熔断机制

在php中实现熔断机制,可以使用一些开源库来帮助完成这一功能。

使用PHP-CircuitBreaker库

1.使用Composer安装库
composer require ejsmont-artur/php-circuit-breaker

2.创建熔断器实例并使用
创建一个熔断器实例,并在你的应用程序中使用它。

class CircuitBreaker
{
    use Ejsmont\CircuitBreaker\CircuitBreaker;
    use Ejsmont\CircuitBreaker\Storage\Adapter\InMemoryAdapter;
    
    $storage = new InMemoryAdapter();
    $circuitBreaker = new CircuitBreaker($storage, 'my_service', 5, 1000);
    
    // 远程调用
    function rpcCall($service, $method, $params) {
        global $circuitBreaker;
        if ($circuitBreaker->isAvailable()) {// 调用服务可用
            try {
                // 实现 RPC 调用
                $result = call_user_func_array([$service, $method], $params);
                $circuitBreaker->reportSuccess();
                return $result;
            } catch (Exception $e) {
                $circuitBreaker->reportFailure();
                // 服务降级处理
                return handleServiceDegradation($service, $method, $params);
            }
        } else {// 调用服务不可用
            // 熔断器已打开,服务降级处理
            return handleServiceDegradation($service, $method, $params);
        }
    }
    
    function handleServiceDegradation($service, $method, $params) {
        // 根据需要进行服务降级处理
        // 例如,返回默认值或者重试其他服务节点
        return defaultValue();
    }

}

在这个示例中,我们创建了一个熔断器实例,并在 RPC 调用过程中使用它。当熔断器打开时,会自动进行服务降级处理,以防止整个系统因单个服务故障而崩溃。


还有一种熔断机制比较随意,就是在RPC调用后检测返回结果,若响应结果异常,比如返回504,直接进行降级处理。


2.降级机制

  • 降级机制的核心思想 :降级是指在系统压力过大时,关闭非核心功能,保证核心功能正常进行。通过降级,我们可以确保系统在极端情况下依然能够提供基本的服务。

  • 实际案例在秒杀活动中,推荐服务并不是核心功能。当系统资源不足时,我们可以选择关闭推荐服务,以确保订单服务和支付服务的正常运行。

3.限流机制

  • 限流机制的核心思想 :限流是指对服务的访问频率进行限制,防止因突发流量导致系统过载。通过限流,我们可以保护核心服务,避免因流量过大而导致系统崩溃。

  • 实际案例 :在秒杀活动中,支付服务可能因为大量用户同时下单而被压垮。为了保护支付服务,我们需要对其设置限流策略。

  • 具体限流算法在之前的文章里已有整理,主要整理了我项目中用到的计数器法和令牌桶算法。


上一篇:PHP对API进行限流

下一篇:分布式锁