您现在的位置是:网站首页 > 心得笔记
微服务架构中的熔断、限流与降级
假设我们正在开发一个电商系统,其中包含以下服务:
订单服务 :负责创建和管理订单。 库存服务 :负责查询和扣减商品库存。 支付服务 :负责处理支付请求。
在秒杀活动中,订单服务需要调用库存服务和支付服务。由于秒杀活动期间流量激增,库存服务和支付服务可能会出现响应缓慢甚至不可用的情况。为了确保订单服务的稳定性,我们需要引入 熔断、限流与降级 机制。
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进行限流
下一篇:分布式锁