This is an Implementation of the 2-state (Open and Closed) CircuitBreaker pattern that we use at HolidayPirates.
Unlike the 3-state CircuitBreaker proposed by Fowler, this implementation has only two states, "Open" and "Closed".
Via Composer
$ composer require holidaypirates/pirate-circuit-breaker
- PHP 7.3
- An implementation of the
\Psr\SimpleCache\CacheInterface
to store the services failures and circuit state OR your own storage implementation of\HolidayPirates\CircuitBreaker\Storage\StorageInterface
- For development only : Docker and 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);
}
Please note that
HolidayPirates\CircuitBreaker\Service\DummyService
is just an implementation of\HolidayPirates\CircuitBreaker\Service\ServiceInterface
.
You must create your own implementations of\HolidayPirates\CircuitBreaker\Service\ServiceInterface
for each service that you want the CircuitBreaker to operate in.
For more examples of usage please see \HolidayPirates\Tests\Integration\CircuitBreaker\CircuitBreakerTest
$ docker-compose run php vendor/bin/phpunit
The MIT License (MIT). Please see License File for more information.