https://github.com/delvedor/easy-breaker
A simple and low overhead circuit breaker utility.
https://github.com/delvedor/easy-breaker
circuit-breaker nodejs
Last synced: about 1 month ago
JSON representation
A simple and low overhead circuit breaker utility.
- Host: GitHub
- URL: https://github.com/delvedor/easy-breaker
- Owner: delvedor
- License: mit
- Created: 2018-02-08T22:38:48.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2018-02-13T15:22:17.000Z (over 7 years ago)
- Last Synced: 2024-12-30T13:42:45.067Z (10 months ago)
- Topics: circuit-breaker, nodejs
- Language: JavaScript
- Homepage:
- Size: 40 KB
- Stars: 20
- Watchers: 5
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# easy-breaker
[](http://standardjs.com/) [](https://travis-ci.org/delvedor/easy-breaker) [](https://coveralls.io/github/delvedor/easy-breaker?branch=master)
A simple and low overhead [circuit breaker](https://martinfowler.com/bliki/CircuitBreaker.html) utility.
## Install
```
npm i easy-breaker
```
## Usage
Require the library and initialize it with the function you want to put under the Circuit Breaker.
```js
const EasyBreaker = require('easy-breaker')
const simpleGet = require('simple-get')const get = EasyBreaker(simpleGet)
get('http://example.com', function (err, res) {
if (err) throw err
console.log(res.statusCode)
})
```If the function times out, the error will be a `TimeoutError`.
If the threshold has been reached and the circuit is open the error will be a `CircuitOpenError`.You can access the errors constructors with `require('easy-breaker').errors`.
You can access the state constants with `require('easy-breaker').states`.### Options
You can pass some custom option to change the default behavior of `EasyBreaker`:
```js
const EasyBreaker = require('easy-breaker')
const simpleGet = require('simple-get')// the following options object contains the default values
const get = EasyBreaker(simpleGet, {
threshold: 5
timeout: 1000 * 10
resetTimeout: 1000 * 10
context: null,
maxEventListeners: 100
promise: false
})
```- `threshold`: is the maximum numbers of failures you accept to have before opening the circuit.
- `timeout:` is the maximum number of milliseconds you can wait before return a `TimeoutError` *(read the caveats section about how the timeout is handled)*.
- `resetTimeout`: time before the circuit will move from `open` to `half-open`
- `context`: a custom context for the function to call
- `maxEventListeners`: since this library relies on events, it can happen that you reach the maximum number of events listeners before the *memory leak* warn. To avoid that log, just set an higher number with this property.
- `promise`: if you need to handle promised API, see below.
### Promises
Promises and *async-await* are supported as well!
Just pass the option `{ promise: true }` and you are done!
*Note the if you use the promise version of the api also the function you are wrapping should return a promise.*```js
const EasyBreaker = require('easy-breaker')
const got = require('got')const get = EasyBreaker(got, { promise: true })
get('http://example.com')
.then(console.log)
.catch(console.log)
```
## Events
This circuit breaker is an event emitter, if needed you can listen to its events:
- `open`
- `half-open`
- `close`
- `result`
- `tick`
## Caveats
Run a timer for every function is pretty expensive, especially if you are running the code in a heavy load environment.
To fix this problem and get better performances, `EasyBreaker` uses an atomic clock, in other words uses an interval that emits a `tick` event every `timeout / 2` milliseconds.
Every running functions listens for that event and if the number of ticks received is higher than `3` it will return a `TimeoutError`.## Acknowledgements
Image curtesy of [Martin Fowler](https://martinfowler.com/bliki/CircuitBreaker.html).
## License
**[MIT](https://github.com/delvedor/easy-breaker/blob/master/LICENSE)**Copyright © 2018 Tomas Della Vedova