More information: https://martinfowler.com/bliki/CircuitBreaker.html
composer require ksaveras/circuit-breaker
Simple circuit check
use \Ksaveras\CircuitBreaker\CircuitBreakerFactory;
use \Ksaveras\CircuitBreaker\Storage\ApcuStorage;
$factory = new CircuitBreakerFactory(
[
'failure_threshold' => 3,
'retry_policy' => 'exponential',
'reset_timeout' => 300,
],
new ApcuStorage()
);
$circuitBreaker = $factory->create('service-api');
if ($circuitBreaker->isAvailable()) {
try {
// call 3rd party service api
$circuitBreaker->success();
} catch (\Exception $exception) {
$circuitBreaker->failure();
}
}
Use callback
use \Ksaveras\CircuitBreaker\Exception\OpenCircuitException;
use \Ksaveras\CircuitBreaker\CircuitBreakerFactory;
use \Ksaveras\CircuitBreaker\Storage\ApcuStorage;
$factory = new CircuitBreakerFactory(
[
'failure_threshold' => 3,
'retry_policy' => 'exponential',
'reset_timeout' => 300,
],
new ApcuStorage()
);
$circuitBreaker = $factory->create('service-api');
try {
$circuitBreaker->call(
function () {
$this->callApi();
}
);
} catch (OpenCircuitException $exception) {
// Open circuit
} catch (\Exception $exception) {
// 3rd party exception
}
composer test
composer phpstan
composer phpcsfix