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. Він відстежує збої для іменованого сервісу та запобігає каскадним відмовам, коли залежний сервіс недоступний:

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

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

$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.

Популярні

Logomark Logotype

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

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

Logomark Logotype

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

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

Logomark Logotype

Випущено Livewire 3.6

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