2017 © Pedro Peláez
 

library circuit-breaker

A php Circuit Breaker

image

eljam/circuit-breaker

A php Circuit Breaker

  • Friday, December 22, 2017
  • by eljam
  • Repository
  • 3 Watchers
  • 12 Stars
  • 6,120 Installations
  • PHP
  • 1 Dependents
  • 0 Suggesters
  • 7 Forks
  • 1 Open issues
  • 6 Versions
  • 14 % Grown

The README.md

Circuit Breaker

Circuit breaker is heavily used in microservice architecture to find issues between microservices calls., (*1)

The main idea is to protect your code from making unnecessary call if the microservice you call is down., (*2)

Features

  • Automatic update. (i.e you don't have to manually add success or failure method like other library)
  • Return result from the protected function
  • Retry timeout
  • Exclude some exceptions from being throwned, return null instead.
  • Multiprocess updates handled with a cache library. Supports all cache provider from (doctrine cache library).
  • Event powered

Build Status Code Quality Code Coverage SensioLabsInsight Latest Unstable Version Latest Stable Version Downloads license, (*3)

Full Example:, (*4)

<?php

use Doctrine\Common\Cache\FilesystemCache;
use Eljam\CircuitBreaker\Breaker;
use Eljam\CircuitBreaker\Event\CircuitEvents;
use Symfony\Component\EventDispatcher\Event;

require_once __DIR__.'/vendor/autoload.php';

$fileCache  = new FilesystemCache('./store', 'txt');

//Create a circuit for github api with a file cache and we want to exclude all exception.
$breaker = new Breaker('github_api', ['ignore_exceptions' => true], $fileCache);

$breaker->addListener(CircuitEvents::SUCCESS, function (Event $event) {
    $circuit = $event->getCircuit();
    echo "Success:".$circuit->getFailures()."\n";
});

$breaker->addListener(CircuitEvents::FAILURE, function (Event $event) {
    $circuit = $event->getCircuit();
    echo "Increment failure:".$circuit->getFailures()."\n";
});

$breaker->addListener(CircuitEvents::OPEN, function (Event $event) {
    $circuit = $event->getCircuit();
    echo sprintf("circuit %s is open \n", $circuit->getName());
});

$breaker->addListener(CircuitEvents::CLOSED, function (Event $event) {
    $circuit = $event->getCircuit();
    echo sprintf("circuit %s is closed \n", $circuit->getName());
});

$breaker->addListener(CircuitEvents::HALF_OPEN, function (Event $event) {
    $circuit = $event->getCircuit();
    echo sprintf("circuit %s is half-open \n", $circuit->getName());
});

$result = $breaker->protect(function () {
    throw new \Exception("An error as occured");
    // return 'ok';
});

The Versions