An open API service indexing awesome lists of open source software.

https://github.com/reneweb/crius

Crius is a simple hystrix-like circuit breaker for rust.
https://github.com/reneweb/crius

circuit-breaker command rust

Last synced: 3 months ago
JSON representation

Crius is a simple hystrix-like circuit breaker for rust.

Awesome Lists containing this project

README

          

# Crius [![Build Status](https://travis-ci.org/reneweb/crius.svg?branch=master)](https://travis-ci.org/reneweb/crius) [![Cargo Version](https://img.shields.io/crates/v/crius.svg)](https://crates.io/crates/crius)

Crius is a simple hystrix-like circuit breaker for rust.

_"In the midst of chaos, there is also opportunity"_

## Usage

### Simple command
```rust
use crius::{command, Config, CriusError};

#[derive(PartialEq, Debug)]
struct ExampleError;
impl From for ExampleError {
fn from(_: CriusError) -> Self { ExampleError }
}

// Define a simple circuit breaker command:
let mut cmd = command(Config::default(), |n| {
if n > 10 {
Err(ExampleError)
} else {
Ok(n * 2)
}}).unwrap();

// and run it with an example input:
let result = cmd.run(10);
assert_eq!(Ok(20), result);
```

### Command with fallback
```rust
use crius::{command_with_fallback, Config, CriusError};

#[derive(PartialEq, Debug)]
struct ExampleError;
impl From for ExampleError {
fn from(_: CriusError) -> Self { ExampleError }
}

let double_if_lt_ten = |n| if n > 10 {
Err(ExampleError)
} else {
Ok(n * 2)
};

// Define a simple circuit breaker command:
let mut cmd = command_with_fallback(
Config::default(),
double_if_lt_ten,

// Define a fallback:
|_err| 4, // It's always four.
).unwrap();

// and run it with an example input:
let result = cmd.run(11);
assert_eq!(Ok(4), result);
```

### Command with custom configuration
```rust
use crius::{command, Config, CriusError};

let config = *Config::default()
.circuit_open_ms(5000)
.error_threshold(10)
.error_threshold_percentage(50)
.buckets_in_window(100)
.bucket_size_in_ms(1000);

let mut cmd = command(config, |n| {
if n > 10 {
Err(ExampleError)
} else {
Ok(n * 2)
}}).unwrap();

// and run it with an example input:
let result = cmd.run(10);
assert_eq!(Ok(20), result);
```

## Configuration

`circuit_open_ms` - Time in ms commands are rejected after the circuit opened - Default 5000

`error_threshold` - Minimum amount of errors for the circuit to break - Default 10

`error_threshold_percentage` - Minimum error percentage for the circuit to break - Default 50

`buckets_in_window` - Rolling window to track success/error calls, this property defines the amount of buckets in a window (buckets_in_window * bucket_size_in_ms is the overall length in ms of the window) - Default 10

`bucket_size_in_ms` - This property defines the ms a bucket is long, i.e. each x ms a new bucket will be created (buckets_in_window * bucket_size_in_ms is the overall length in ms of the window) - Default 1000

`circuit_breaker_enabled` - Defines if the circuit breaker is enabled or not - Default true