holidaypirates/pirate-circuit-breaker

我们在HolidayPirates中使用的2状态CircuitBreaker模式的实现

v1.0.0 2019-07-18 13:09 UTC

README

Codacy Badge Quality Score Software License Build Status

这是HolidayPirates中使用的2状态(开启和关闭)CircuitBreaker模式的实现。
与Fowler提出的3状态CircuitBreaker不同,这个实现只有两个状态,“开启”和“关闭”。

安装

通过Composer

$ composer require holidaypirates/pirate-circuit-breaker

要求

  • PHP 7.3
  • 用于存储服务故障和电路状态的\Psr\SimpleCache\CacheInterface实现,或者你的\HolidayPirates\CircuitBreaker\Storage\StorageInterface存储实现
  • 仅用于开发:Docker和Docker-Compose

用法

<?php declare(strict_types=1);

use HolidayPirates\CircuitBreaker\CircuitBreaker;
use HolidayPirates\CircuitBreaker\Service\DummyService;
use HolidayPirates\CircuitBreaker\Storage\Adapter\SimpleCacheAdapter;

// Setup:
$pool = new YourCachePool(); // Any implementation of \Psr\SimpleCache\CacheInterface
$storageAdapter = new SimpleCacheAdapter($pool);
$circuitBreaker = new CircuitBreaker($storageAdapter);

$service = new DummyService(5, 60); //After 5 failed attempts it will wait 60 seconds before allowing more requests.

$circuitBreaker->registerService($service);

// Usage:
$dummyApiClient = new DummyApiClient(); // This will be any service you want to protect with the CB

if (false == $circuitBreaker->isServiceAvailable(DummyService::class)) {
    throw new \Exception('Service unavailable');
}

try {
    $response = $dummyApiClient->sendRequest();
    $circuitBreaker->reportSuccess(DummyService::class);
} catch (Exception $exception) {
    $circuitBreaker->reportFailure(DummyService::class);
       
    throw new \Exception('Service unavailable',0, $exception);
}

请注意,HolidayPirates\CircuitBreaker\Service\DummyService只是\HolidayPirates\CircuitBreaker\Service\ServiceInterface的一个实现。
你必须为每个你希望CircuitBreaker运行的服务创建自己的\HolidayPirates\CircuitBreaker\Service\ServiceInterface实现。

有关用法示例,请参阅\HolidayPirates\Tests\Integration\CircuitBreaker\CircuitBreakerTest

测试

$ docker-compose run php vendor/bin/phpunit

致谢

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件