熔断需实现三状态可控:关闭、打开、半开;Laravel可通过中间件拦截式或缓存门面增强式落地,配合动态阈值与可验证降级策略。

高并发下接口熔断不是加个包就能起效的,关键在于状态可控、触发精准、降级可用。Laravel本身不内置熔断器,但通过组合中间件、自定义类和缓存驱动,可以快速构建轻量、可维护的熔断逻辑。
明确熔断核心三状态
所有有效熔断机制都围绕三个状态运转,不能跳过或合并:
- 关闭(Closed):正常转发请求,持续统计失败次数与响应时间
- 打开(Open):拒绝所有新请求,直接返回降级数据,不发起远程调用
- 半开(Half-Open):在重置超时后允许少量试探请求,成功则切回关闭,失败则延长打开时间
推荐两种落地方式
根据项目阶段和复杂度选择,避免过度设计:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
中间件拦截式(适合接口级保护):新建
php artisan make:middleware ApiCircuitBreaker,在handle()中检查当前服务健康标识(例如 Redis 中的health:payment键是否存在且值为ok),若连续 3 次读取失败或超时,则标记为不可用并跳过后续逻辑,直接调用$this->fallbackForPayment() -
缓存门面增强式(适合数据读取链路):创建
App\Cache\ResilientCacheManager继承原CacheManager,重写resolve()方法,返回一个包装了 Redis store 的ResilientStore。该 store 在get()抛出连接异常时,自动记录失败并切换至本地array缓存或静态默认值,调用方无需修改一行业务代码
配置关键参数要贴合真实压测结果
硬编码阈值是常见陷阱。应基于线上监控或压测数据设定:
- 失败阈值建议设为5~10次连续失败(非单次错误),避免偶发网络抖动误触发
- 重置超时初始设为60秒,上线后根据故障恢复平均耗时动态调整
- 超时时间必须小于业务接口整体超时,例如接口总超时 3s,则熔断内 HTTP 调用设为 1.5s,留出处理余量
- 半开状态下只放行1~2个请求,验证成功后再全面恢复,防止试探流量引发二次雪崩
降级策略必须提前准备且可验证
熔断只是“断”,降级才是“活”。没有可用降级,熔断等于拒服:
- 对用户列表接口,降级可返回最近 5 分钟缓存数据(带
Cache::get('user_list_fallback', fn() => User::latest()->take(20)->get())) - 对支付回调接口,降级可记录日志+返回「处理中」状态,并异步轮询结果,而非直接报错
- 所有降级逻辑需单独单元测试,确保
isOpen()为 true 时能稳定输出预期内容

















