--- name: acc-create-circuit-breaker description: Generates Circuit Breaker pattern for PHP 8.5. Creates resilience component protecting against cascading failures with state management, fallback support, and metrics. Includes unit tests. --- # Circuit Breaker Generator Creates Circuit Breaker pattern infrastructure for resilience and fault tolerance. ## When to Use | Scenario | Example | |----------|---------| | External service calls | API integrations, payment gateways | | Database connections | Prevent connection exhaustion | | Cascading failures | Stop failure propagation | | Service degradation | Graceful fallback when service unavailable | ## Component Characteristics ### CircuitState Enum - **Closed**: Normal operation, requests pass through - **Open**: Failing, requests rejected immediately - **HalfOpen**: Testing recovery, limited requests allowed ### CircuitBreaker - Wraps external service calls - Tracks failures and successes - Automatic state transitions - Configurable thresholds and timeouts ### CircuitBreakerConfig - Failure threshold count - Success threshold for recovery - Open state timeout duration --- ## Generation Process ### Step 1: Generate Core Components **Path:** `src/Infrastructure/Resilience/CircuitBreaker/` 1. `CircuitState.php` — Enum with state transitions 2. `CircuitBreakerConfig.php` — Configuration value object 3. `CircuitBreakerException.php` — Exception for open circuit ### Step 2: Generate Circuit Breaker **Path:** `src/Infrastructure/Resilience/CircuitBreaker/` 1. `CircuitBreaker.php` — Main implementation with state management ### Step 3: Generate Factory and Registry **Path:** `src/Infrastructure/Resilience/CircuitBreaker/` 1. `CircuitBreakerFactory.php` — Creates configured breakers 2. `CircuitBreakerRegistry.php` — Per-service breaker management ### Step 4: Generate Tests 1. `CircuitStateTest.php` — State transition tests 2. `CircuitBreakerTest.php` — Breaker behavior tests --- ## File Placement | Component | Path | |-----------|------| | All Classes | `src/Infrastructure/Resilience/CircuitBreaker/` | | Unit Tests | `tests/Unit/Infrastructure/Resilience/CircuitBreaker/` | --- ## Naming Conventions | Component | Pattern | Example | |-----------|---------|---------| | State Enum | `CircuitState` | `CircuitState` | | Config | `CircuitBreakerConfig` | `CircuitBreakerConfig` | | Main Class | `CircuitBreaker` | `CircuitBreaker` | | Factory | `CircuitBreakerFactory` | `CircuitBreakerFactory` | | Registry | `CircuitBreakerRegistry` | `CircuitBreakerRegistry` | | Exception | `CircuitBreakerException` | `CircuitBreakerException` | | Test | `{ClassName}Test` | `CircuitBreakerTest` | --- ## Quick Template Reference ### CircuitState ```php enum CircuitState: string { case Closed = 'closed'; case Open = 'open'; case HalfOpen = 'half_open'; public function allowsRequest(): bool; public function canTransitionTo(self $next): bool; } ``` ### CircuitBreakerConfig ```php final readonly class CircuitBreakerConfig { public function __construct( public int $failureThreshold = 5, public int $successThreshold = 3, public int $openTimeoutSeconds = 30, public int $halfOpenMaxAttempts = 3 ) {} public static function default(): self; public static function aggressive(): self; public static function lenient(): self; } ``` ### CircuitBreaker ```php final class CircuitBreaker { public function execute(callable $operation, ?callable $fallback = null): mixed; public function canExecute(): bool; public function getState(): CircuitState; public function forceOpen(): void; public function forceClose(): void; } ``` --- ## Usage Example ```php $breaker = $circuitBreakers->get('payment-gateway'); try { $result = $breaker->execute( operation: fn() => $paymentClient->charge($request), fallback: fn() => PaymentResult::deferred($request->id) ); } catch (CircuitBreakerException $e) { // Circuit is open return PaymentResult::serviceUnavailable($request->id); } ``` --- ## State Transitions ``` CLOSED ─────failure threshold reached────→ OPEN ↑ │ │ │ timeout elapsed │ ↓ success threshold reached HALF-OPEN └────────────────────────────────────────┘ │ failure in half-open │ ↓ OPEN ``` --- ## Anti-patterns to Avoid | Anti-pattern | Problem | Solution | |--------------|---------|----------| | Global Circuit Breaker | One breaker for all services | Per-service breakers | | No Fallback | Hard failure on open | Provide fallback strategy | | Immediate Retry | Hammering failed service | Use timeout before HalfOpen | | No Metrics | Can't monitor health | Log state transitions | | Static Thresholds | Can't tune per service | Configurable per service | | No Manual Override | Can't force open/close | Add force methods | --- ## References For complete PHP templates and examples, see: - `references/templates.md` — CircuitState, CircuitBreakerConfig, CircuitBreaker, Factory, Registry templates - `references/examples.md` — HTTP client, payment gateway examples and tests