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;
use \Ksaveras\CircuitBreaker\Policy\ExponentialRetryPolicy;
$failureThreshold = 3;
$resetTtl = 300;
$factory = new CircuitFactory($failureThreshold);
$storage = new Apcu();
$retryPolicy = new ExponentialRetryPolicy($resetTtl);
$circuitBreaker = new CircuitBreaker('service-api', $storage, $factory, $retryPolicy);
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;
use \Ksaveras\CircuitBreaker\Policy\ExponentialRetryPolicy;
$failureThreshold = 3;
$resetTtl = 300;
$factory = new CircuitFactory($failureThreshold);
$storage = new Apcu();
$retryPolicy = new ExponentialRetryPolicy($resetTtl);
$circuitBreaker = new CircuitBreaker('service-api', $storage, $factory, $retryPolicy);
try {
$circuitBreaker->call(
function () {
$this->callApi();
}
);
} catch (OpenCircuitException $exception) {
// Open circuit
} catch (\Exception $exception) {
// 3rd party exception
}
composer test
composer phpstan
composer phpcsfix