moontechs/circuit-breaker

内存中的(默认驱动)断路器实现,具有不同的策略。无依赖。

0.0.3 2023-10-01 20:08 UTC

This package is auto-updated.

Last update: 2024-09-30 01:57:43 UTC


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);
    }
}