More information: https://martinfowler.com/bliki/CircuitBreaker.html
composer require ksaveras/circuit-breaker
Simple circuit check
use \Ksaveras\CircuitBreaker\Storage\Apcu;
use \Ksaveras\CircuitBreaker\CircuitBreaker;
use \Ksaveras\CircuitBreaker\Factory\CircuitFactory;
$storage = new Apcu();
$period = 300;
$circuitBreaker = new CircuitBreaker('service-api', $storage, new CircuitFactory($period));
$circuitBreaker->setFailureThreshold(3);
if ($circuitBreaker->isAvailable()) {
try {
// call 3rd party service api
$circuitBreaker->success();
} catch (\Exception $exception) {
$circuitBreaker->failure();
}
}
Use callback
use \Ksaveras\CircuitBreaker\Storage\Apcu;
use \Ksaveras\CircuitBreaker\CircuitBreaker;
use \Ksaveras\CircuitBreaker\Exception\OpenCircuitException;
use \Ksaveras\CircuitBreaker\Factory\CircuitFactory;
$storage = new Apcu();
$period = 300;
$circuitBreaker = new CircuitBreaker('service-api', $storage, new CircuitFactory($period));
$circuitBreaker->setFailureThreshold(3);
try {
$circuitBreaker->call(
function () {
$this->callApi();
}
);
} catch (OpenCircuitException $exception) {
// Open circuit
} catch (\Exception $exception) {
// 3rd party exception
}
composer test
composer phpstan
composer phpcsfix