ExMCP.Transport.Beam.CircuitBreaker (ex_mcp v0.9.2)

View Source

Circuit breaker implementation for MCP service protection in BEAM transport clustering.

Implements the circuit breaker pattern to protect services from cascading failures. Tracks failure rates and automatically opens circuits when thresholds are exceeded, preventing requests from reaching failing services.

Circuit States

  • :closed - Normal operation, requests flow through
  • :open - Circuit is open, requests are failed fast
  • :half_open - Testing if service has recovered

Configuration Options

  • failure_threshold - Number of failures before opening circuit
  • success_threshold - Number of successes needed to close circuit from half-open
  • timeout - Time to wait before transitioning from open to half-open
  • failure_rate_threshold - Percentage of failures that triggers circuit opening
  • minimum_throughput - Minimum requests before considering failure rate

Example Usage

# Create a circuit breaker
circuit_breaker = CircuitBreaker.new(%{
  failure_threshold: 5,
  timeout: 60000,
  success_threshold: 3
})

# Record failures and successes
updated_cb = CircuitBreaker.record_failure(circuit_breaker)
updated_cb = CircuitBreaker.record_success(circuit_breaker)

# Check if requests should be allowed
case CircuitBreaker.allow_request?(updated_cb) do
  true -> # Make request
  false -> # Fail fast
end

Summary

Functions

Checks if a request should be allowed based on the current circuit state.

Checks if a request should be allowed and returns both the result and updated circuit breaker.

Forces the circuit breaker to a specific state.

Gets the current state of the circuit breaker.

Gets circuit breaker statistics.

Creates a new circuit breaker with the given configuration.

Records a failed operation and updates the circuit breaker state.

Records a successful operation and updates the circuit breaker state.

Resets the circuit breaker to its initial state.

Types

config()

@type config() :: %{
  failure_threshold: non_neg_integer(),
  success_threshold: non_neg_integer(),
  timeout: non_neg_integer(),
  failure_rate_threshold: float(),
  minimum_throughput: non_neg_integer(),
  reset_timeout: non_neg_integer()
}

state()

@type state() :: :closed | :open | :half_open

t()

@type t() :: %ExMCP.Transport.Beam.CircuitBreaker{
  config: map(),
  failure_count: non_neg_integer(),
  last_failure_time: integer() | nil,
  last_success_time: integer() | nil,
  opened_at: integer() | nil,
  state: state(),
  stats: map(),
  success_count: non_neg_integer()
}

Functions

allow_request?(circuit_breaker)

@spec allow_request?(t()) :: boolean()

Checks if a request should be allowed based on the current circuit state.

allow_request_with_state?(circuit_breaker)

@spec allow_request_with_state?(t()) :: {boolean(), t()}

Checks if a request should be allowed and returns both the result and updated circuit breaker.

force_state(circuit_breaker, new_state)

@spec force_state(t(), state()) :: t()

Forces the circuit breaker to a specific state.

get_state(circuit_breaker)

@spec get_state(t()) :: state()

Gets the current state of the circuit breaker.

get_stats(circuit_breaker)

@spec get_stats(t()) :: map()

Gets circuit breaker statistics.

new(config \\ %{})

@spec new(config() | map()) :: t()

Creates a new circuit breaker with the given configuration.

record_failure(circuit_breaker)

@spec record_failure(t()) :: t()

Records a failed operation and updates the circuit breaker state.

record_success(circuit_breaker)

@spec record_success(t()) :: t()

Records a successful operation and updates the circuit breaker state.

reset(circuit_breaker)

@spec reset(t()) :: t()

Resets the circuit breaker to its initial state.