PyBreaker

Python implementation of the Circuit Breaker pattern
Download

PyBreaker Ranking & Summary

Advertisement

  • Rating:
  • License:
  • BSD License
  • Publisher Name:
  • Daniel Fernandes Martins
  • Publisher web site:

PyBreaker Tags


PyBreaker Description

Python implementation of the Circuit Breaker pattern PyBreaker is a Python implementation of the Circuit Breaker pattern, described in Michael T. Nygard's book Release It!.In Nygard's words, "circuit breakers exists to allow one subsystem to fail without destroying the entire system. This is done by wrapping dangerous operations (typically integration points) with a component that can circumvent calls when the system is not healthy".InstallationRun the following command line to download the latest stable version of PyBreaker from PyPI: easy_install -U pybreakerIf you are a Git user, you might want to download the current development version: git clone git://github.com/danielfm/pybreaker.git cd pybreaker python setup.py test python setup.py installUsageThe first step is to create an instance of CircuitBreaker for each integration point:import pybreakerdb_breaker = pybreaker.CircuitBreaker()To allow better customization while keeping the code self contained, it's recommended to create subclasses of CircuitBreaker for each kind of integration point:import pybreakerclass DBCircuitBreaker(pybreaker.CircuitBreaker): def on_state_change(self, old_state, new_state): "Called when the circuit breaker state changes." pass def on_failure(self, exc): "Called when a function invocation raises a system error." pass def on_success(self): "Called when a function invocation succeeds." passdb_breaker = DBCircuitBreaker()These objects should live globally inside the application scope.Note: Integration points to external services (i.e. databases, queues, etc) are more likely to fail, so make sure to always use timeouts when accessing such services if there's support at the API level.Let's say you want to use a circuit breaker on a function that updates a row in the customer database table:@db_breakerdef update_customer(cust): # Do stuff here... pass# Will trigger the circuit breakerupdated_customer = update_customer(my_customer)Or if you don't want to use the decorator syntax:def update_customer(cust): # Do stuff here... pass# Will trigger the circuit breakerupdated_customer = db_breaker.call(update_customer, my_customer)What Does a Circuit Breaker Do?According to the default parameters, the circuit breaker db_breaker will automatically open the circuit after 5 consecutive failures in update_customer.When the circuit is open, all calls to update_customer will fail immediately (raising CircuitBreakerError) without any attempt to execute the real operation.After 60 seconds, the circuit breaker will allow the next call to update_customer pass through. If that call succeeds, the circuit is closed; if it fails, however, the circuit is opened again until another timeout elapses.Excluding ExceptionsBy default, a failed call is any call that raises an exception. However, it's common to raise exceptions to also indicate business exceptions, and those exceptions should be ignored by the circuit breaker as they don't indicate system errors:# At creation timedb_breaker = DBCircuitBreaker(exclude=(CustomerValidationError,))# At a later timedb_breaker.excluded_exceptions += (CustomerValidationError,)In this case, when any function guarded by that circuit breaker raises CustomerValidationError (or any exception derived from CustomerValidationError), that call won't be considered a system failure.Monitoring and ManagementA CircuitBreaker object provides properties you can use to monitor and change its current state:# Get the current number of consecutive failuresprint db_breaker.fail_counter# Get/set the maximum number of consecutive failuresprint db_breaker.fail_maxdb_breaker.fail_max = 10# Get/set the current reset timeout period (in seconds)print db_breaker.reset_timeoutdb_breaker.reset_timeout = 60# Get the current state, i.e., 'open', 'half-open', 'closed'print db_breaker.current_state# Closes the circuitdb_breaker.close()# Half-opens the circuitdb_breaker.half_open()# Opens the circuitdb_breaker.open()So, if you have a web application using circuit breakers around integration points, you can easily write a simple RESTful API to expose these functions to the operations staff.


PyBreaker Related Software