Circuit Breaker для Laravel: захист від каскадних збоїв

Перекладено ШІ 0 Laravel News 20 березня, 2026

Пакунок circuit‑breaker від @algoyounes додає в Laravel механізм з трьома станами (closed, open, half‑open), іменовані ланцюги для кожного сервісу та колбеки для відстеження переходів і результатів викликів. Дізнайтеся, як обгорнути виклики через run(), використовувати CircuitManager або Guzzle‑middleware, щоб уникнути каскадних відмов.

Пакет circuit-breaker від @algoyounes додає патерн circuit breaker у Laravel. Він відстежує збої для іменованого сервісу та запобігає каскадним відмовам, коли залежний сервіс недоступний:

  • Відстеження стану у трьох режимах: closed, open і half-open
  • Іменовані circuits, щоб ізолювати стан для кожного сервісу
  • Колбеки життєвого циклу (наприклад, onOpen, onSuccess)
  • Інтеграція з Guzzle через заголовок X-Circuit-Key
  • І ще...

Колбеки зміни стану кола

Кожен сервіс має власне іменоване коло. Можна прив’язати колбеки, щоб реагувати на зміну стану кола або на успішні/неуспішні виклики:

$circuit = $this->circuitManager->forService('payment-service');
 
$circuit->onOpen(function (CircuitTransition $transition) {
    Log::warning('Payment service circuit opened', [
        'state' => $transition->getState(),
    ]);
});
 
$circuit->onSuccess(function (CircuitResult $result, CircuitTransition $transition) {
    // Called when a wrapped call succeeds
});
 
$circuit->onFailure(function (CircuitResult $result, CircuitTransition $transition) {
    // Called when a wrapped call fails
});

Кожен колбек спрацьовує на певну подію: наприклад, onOpen виконується, коли коло переходить у стан open (блокує виклики через помилки), а onSuccess — після успішного обгорнутого виклику. Ключ service-name ізолює стан для кожного сервісу, дозволяючи відстежувати залежності окремо.

Виконання операцій

Після налаштування кола обгорніть виклики сервісу в run(). Circuit breaker вирішить, дозволити, заблокувати або протестувати виклик залежно від поточного стану:

$circuit->run(function () {
    return Http::post('https://payments.example.com/charge', $payload);
});

Також можна використати CircuitManager без створення екземпляра CircuitBuilder:

$this->circuitManager->run('payment-service', function () {
    return Http::post('https://payments.example.com/charge', $payload);
});

Middleware для Guzzle

Якщо ваш проєкт використовує Guzzle напряму, пакет містить middleware, яке читає заголовок X-Circuit-Key, щоб визначити, яке коло застосувати:

use AlgoYounes\CircuitBreaker\Middleware\GuzzleMiddleware;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
 
$stack = HandlerStack::create();
$stack->push(GuzzleMiddleware::create());
 
$client = new Client(['handler' => $stack]);
 
$response = $client->get('https://api.example.com', [
    'headers' => [
        'X-Circuit-Key' => 'external-api',
    ],
]);

Дізнатися більше про пакет можна на GitHub: algoyounes/circuit-breaker.

Популярні

Інше, що варто прочитати

13 Оновлено 01 червня, 2026

Створення CLI-додатка за допомогою Laravel та Docker

Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!

26 Оновлено 01 червня, 2026

"SQLSTATE[HY000] [2002] Connection refused" у Laravel в GitHub Actions

Чи стикалися ви з помилкою «SQLSTATE[HY000] [2002] Connection refused» під час налаштування GitHub Actions для вашого додатку на Laravel? У нашій статті ми розглянемо три поширені причини цієї помилки та надамо рішення для їх усунення. Читайте далі, щоб дізнатися, як ваш CI/CD потік може працювати бездоганно!

15 Оновлено 01 червня, 2026

Випущено Livewire 3.6

Laravel Livewire випустив нову версію 3.6, яка приносить з собою цікаві HTML-директиви для управління видимістю DOM-елементів і JavaScript-діями. Досліджуйте нові можливості Livewire, що допоможуть вам створити ще більш інтерактивні користувацькі інтерфейси!