disyuntor
所属分类:硬件设计
开发工具:TypeScript
文件大小:0KB
下载次数:0
上传日期:2023-08-10 15:13:56
上 传 者:
sh-1993
说明: node.js的断路器实现,
(A circuit-breaker implementation for node.js,)
文件列表:
.npmignore (774, 2023-08-10)
.travis.yml (69, 2023-08-10)
LICENSE (1108, 2023-08-10)
jest.config.js (771, 2023-08-10)
opslevel.yml (75, 2023-08-10)
package-lock.json (274173, 2023-08-10)
package.json (971, 2023-08-10)
src/ (0, 2023-08-10)
src/Config.ts (4367, 2023-08-10)
src/Disyuntor.ts (5366, 2023-08-10)
src/DisyuntorError.ts (253, 2023-08-10)
src/Options.ts (1675, 2023-08-10)
src/Timeout.ts (1280, 2023-08-10)
test/ (0, 2023-08-10)
test/Config.test.ts (6814, 2023-08-10)
test/disyuntor.promise.test.ts (5843, 2023-08-10)
test/disyuntor.test.ts (15355, 2023-08-10)
test/no_timeout_issue.test.ts (1134, 2023-08-10)
test/timeout.test.ts (688, 2023-08-10)
tsconfig.json (584, 2023-08-10)
[![Build Status](https://travis-ci.org/auth0/disyuntor.svg?branch=master)](https://travis-ci.org/auth0/disyuntor)
A [circuit-breaker](http://martinfowler.com/bliki/CircuitBreaker.html) implementation for node.js with exponential backoff.
**Disyuntor** is the Spanish word used for circuit-breaker.
The purpose of this pattern is to detect errors and prevent cascading failures across multiple systems.
Disyuntor wraps an async (errback) function and returns a new function with the same signature.
During normal behavior of the system the circuit remains in its `closed` state. This means that every call to the wrapper is forwarded to the protected function.
Once the protected function returns more than `maxFailures`, the breaker trips and every call made during the `cooldown` interval will immediately return an error preventing resource depletion. This is known as the `open` state.
Once the system has settled it will allow one call to go to the protected function. If the call succeeds the breaker will be reset to its `closed` state otherwise it will continue `open`. This state is known as `half open`
A call is considered to have failed if the callback is not called before the `timeout` or if it is called with the first (error) parameter.
## Installation
```
npm i disyuntor
```
## Basic usage
```javascript
const disyuntor = require('disyuntor');
const dnsSafeLookup = disyuntor.wrapCallbackApi({
//This is used in error messages.
name: 'dns.lookup',
//Timeout for the protected function.
// timeout: '2s',
//The number of consecutive failures before switching to open mode
//and stop calling the underlying service.
// maxFailures: 5,
//The minimum time the circuit remains open before doing another attempt.
// cooldown: '15s',
//The maximum amount of time the circuit remains open before doing a new attempt.
// maxCooldown: '60s',
//optionally log errors
onTrip: (err, failures, cooldown) => {
console.log(`dns.lookup triped because it failed ${failures} times.
Last error was ${err.message}! There will be no more attempts for ${cooldown}ms.`);
},
onClose: (cooldown) => {
console.log(`dns.lookup circuit closed after ${cooldown}ms.`;
}
// //optional callback to prevent some errors to trigger the disyuntor logic
// //in this case ENOTFOUND is passed to the callback and will
// //not trigger the breaker eg:
// trigger: (err) => err.code !== 'ENOTFOUND'
}, dns.lookup);
//then use as you will normally use dns.lookup
dnsSafeLookup('google.com', (err, ip) => {
if (err) { return console.error(err.message); }
console.log(ip);
})
```
Timeouts can be expressed either by strings like '15s' or by milliseconds.
Defaults values are:
- `timeout`: 2s
- `maxFailures`: 5
- `cooldown`: 15s
- `maxCooldown`: 60s
## Protecting Promise APIs
```javascript
const lookup = Promise.promisify(require('dns').lookup);
const protectedLookup = disyuntor.wrapPromise({
name: 'dns.lookup',
timeout: '2s',
maxFailures: 2
}, lookup);
protectedLookup('google.com')
.then((ip) => console.log(ip),
(err) => console.error(err));
```
## Complex scenarios
You can create an instance of Disyuntor to have more control as follows:
```javascript
const Disyuntor = require('disyuntor').Disyuntor;
const disyuntor = new Disyuntor({
name: 'dns.lookup',
timeout: '2s',
maxFailures: 2
});
await disyuntor.protect(() => dns.lookupAsync('google.com'));
```
Note: this api only supports promise-returning functions.
## License
Copyright (c) 2015 Auth0, Inc. (http://auth0.com)
近期下载者:
相关文件:
收藏者: