# Circuit Breaker Pattern

> The circuit breaker pattern as a runnable model: closed, open and half-open states, checked so the circuit is never closed once failures reach the threshold.

Canonical: https://fizzbee.io/design/patterns/circuit-breaker/
Source: https://github.com/fizzbee-io/fizzbee/tree/main/examples/references/13-06-01-circuit-breaker


Prevents cascading failures with circuit states

**Demonstrates:** circuit breaker, failure threshold, state transitions

```fizz
# Example 0074: Circuit Breaker Pattern
# Prevents cascading failures with circuit states
# Demonstrates: circuit breaker, failure threshold, state transitions

State = enum('CLOSED', 'OPEN', 'HALF_OPEN')
FAILURE_THRESHOLD = 2

action Init:
    circuit_state = State.CLOSED
    failure_count = 0
    success_count = 0
    requests = 0

atomic action RequestSuccess:
    require requests < 5
    require circuit_state != State.OPEN  # Reject when open

    requests = requests + 1
    success_count = success_count + 1

    # Reset failures on success in half-open
    if circuit_state == State.HALF_OPEN:
        failure_count = 0
        circuit_state = State.CLOSED

atomic action RequestFailure:
    require requests < 5
    require circuit_state != State.OPEN  # Reject when open

    requests = requests + 1
    failure_count = failure_count + 1

    # Open circuit on threshold
    if failure_count >= FAILURE_THRESHOLD:
        circuit_state = State.OPEN

atomic action TryReset:
    require circuit_state == State.OPEN

    # Try half-open after timeout
    circuit_state = State.HALF_OPEN

# Safety: circuit opens after threshold
always assertion CircuitOpensOnFailures:
    if failure_count >= FAILURE_THRESHOLD:
        return circuit_state == State.OPEN or circuit_state == State.HALF_OPEN
    return True

atomic action NoOp:
    if requests >= 5:
        pass
```
Run it in the FizzBee playground: https://fizzbee.io/play


**Expected result** (from `fizz`):

```
StateSpaceOptions: options:{max_actions:100 max_concurrent_actions:2}
Nodes: 42, queued: 0
Valid Nodes: 42 Unique states: 42
IsLive: true
PASSED: Model checker completed successfully
```

[Source on GitHub](https://github.com/fizzbee-io/fizzbee/tree/main/examples/references/13-06-01-circuit-breaker)

## Language features used

[Assertions](/reference/language/assertions/), [Flow Modifiers](/reference/language/flow-modifiers/), [Data Structures](/reference/language/data-structures/)

