Tripp
In-house Circuit Breaker
A Presentation
by Ronak Raithatha
Roadmap
1. Circuit Breaker Pattern
2. Opossum Library
3. Tripp
Circuit breaker
A pattern to improve the resiliency of your application by encapsulating failure-prone dependencies with robust fallback options
Failure-prone dependencies:
- External API calls
- Database connections
- Fragile inter-service operations
Alternative use Cases
- Singular location to cache responses
- Rate limiting
- Performance monitoring
Opossum
A circuit breaker library written in node
const CircuitBreaker = require('opossum');
function asyncFunctionThatCouldFail (x, y) {
return new Promise((resolve, reject) => {
// Do something, maybe on the network or a disk
});
}
const options = {
timeout: 3000, // If our function takes longer than 3 seconds, trigger a failure
errorThresholdPercentage: 50, // When 50% of requests fail, trip the circuit
resetTimeout: 30000 // After 30 seconds, try again.
};
const breaker = new CircuitBreaker(asyncFunctionThatCouldFail, options);
// if asyncFunctionThatCouldFail starts to fail, firing the breaker
// will trigger our fallback function
breaker.fallback(() => 'Sorry, out of service right now');
breaker.fire(params)
.then(console.log)
.catch(console.error);
Event logging
const circuit = new CircuitBreaker(() => axios.get(route), circuitBreakerOptions);
circuit.fallback(() => ({ body: `${route} unavailable right now. Try later.` }));
circuit.on('success',
(result) => console.log(`SUCCESS: ${JSON.stringify(result)}`));
circuit.on('timeout',
() => console.log(`TIMEOUT: ${route} is taking too long to respond.`));
circuit.on('reject',
() => console.log(`REJECTED: The breaker for ${route} is open. Failing fast.`));
circuit.on('open',
() => console.log(`OPEN: The breaker for ${route} just opened.`));
circuit.on('halfOpen',
() => console.log(`HALF_OPEN: The breaker for ${route} is half open.`));
circuit.on('close',
() => console.log(`CLOSE: The breaker for ${route} has closed. Service OK.`));
circuit.on('fallback',
(data) => console.log(`FALLBACK: ${JSON.stringify(data)}`));
opossum
Fairly simple API for what it achieves
For the most part, this fit our needs, but we decided to go bigger.
Create something that can be used across multiple streams.
Augmenting Opossum
To better fit our need
Common logging pattern
Ability to get metrics without custom code from each stream
Modularize how features were added and shared among streams
Create a separation between CB and external call being made
TRIPP
A piece of Pegasus
Is a set of tooling encapsulating Opossum
Extensibility through Redux-like middleware API
Built-in wrappers for Apollo and Axios to promote good DX by exposing underlying API.
Made with ❤️ by MyAudi
This is Tripp* of house MyAudi,
the First in Audi-toolbox,
Breaker of Circuits,
Preserver of Good DX and
Propagator of Extensibility Through Robust Middleware API
* Now available in a Toolbox near you
External Links
Tripp
By Ronak Raithatha
Tripp
- 1,030