moontechs / circuit-breaker
内存中的(默认驱动)断路器实现,具有不同的策略。无依赖。
0.0.3
2023-10-01 20:08 UTC
Requires
- php: >=8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.30
- phpunit/phpunit: ^10.3
README
内存中的(默认驱动)断路器实现,具有不同的策略。如果您有一个执行大量HTTP请求的长循环任务,这将非常有用。请查看示例部分。
无依赖。
安装
composer require moontechs/circuit-breaker
使用方法
选择一个策略
- 计数器策略 - 简单失败计数增加。当达到限制时,
isAvailable
函数返回 false。调用success
函数将重置计数器(将设置为 0)。limit
- 默认值为 5。使用setLimit(int)
方法进行更改。
use Moontechs\CircuitBreaker\CircuitBreaker; use Moontechs\CircuitBreaker\Drivers\InMemoryDriver; use Moontechs\CircuitBreaker\Strategies\CounterStrategy; $circuitBreaker = new CircuitBreaker( new CounterStrategy( new InMemoryDriver() ) );
- 时间范围策略 - 在指定的时间范围内增加失败次数。当时间范围内达到限制时,
isAvailable
函数返回 false。调用success
函数将重置计数器(将设置为 0)。limit
- 默认值为 5。使用setLimit(int)
方法进行更改。timeFrame
- 默认值为 300 秒。使用setTimeFrame(int)
方法进行更改。
use Moontechs\CircuitBreaker\CircuitBreaker; use Moontechs\CircuitBreaker\Drivers\InMemoryDriver; use Moontechs\CircuitBreaker\Strategies\TimeFrameStrategy; $circuitBreaker = new CircuitBreaker( new TimeFrameStrategy( new InMemoryDriver() ) );
默认驱动是 InMemoryDriver
。它不会在进程之间共享数据。
示例
真实世界使用示例。
use Moontechs\CircuitBreaker\CircuitBreaker; use Moontechs\CircuitBreaker\Drivers\InMemoryDriver; use Moontechs\CircuitBreaker\Strategies\CounterStrategy; $circuitBreaker = new CircuitBreaker( new CounterStrategy( new InMemoryDriver() ) ); foreach ($data as $datum) { try { exampleHttpRequest($datum); // This is optional. In case if you want to reset the failures counter. $circuitBreaker->success('example'); } catch (\Exception $exception) { $circuitBreaker->failure('example'); // The following condition could be used to throw an exception or repeat a request later. if (!$circuitBreaker->isAvailable('example')) { throw $exception; } // This is optional. In case you want to prevent another service from spamming and give it some time to recover. sleep($circuitBreaker->getFailuresCount() * 10); } }