Тайм-аути й повтори допомагають від короткочасних збоїв. Але якщо залежний сервіс лежить хвилинами, кожен запит усе одно чекає тайм-аут, а повтори лише збільшують навантаження на сервіс, що намагається піднятися.
Circuit Breaker (запобіжник) - обгортка над викликом, що відстежує помилки й перестає надсилати запити, коли сервіс явно несправний. Три стани:
- закритий (closed) - запити проходять, помилки рахуються;
- відкритий (open) - після N помилок поспіль чи частки помилок понад поріг виклики одразу відхиляються без звернення до сервісу. Застосунок отримує миттєву помилку й використовує запасний варіант;
- напіввідкритий (half-open) - після паузи пропускається кілька пробних запитів. Успіх - назад у закритий стан; помилка - знову відкритий.
Що це дає:
- швидкий збій замість очікування тайм-ауту - потоки й воркери застосунку не блокуються;
- сервіс, що відновлюється, отримує паузу від лавини запитів;
- запасна поведінка: показати кешовані дані, приховати блок рекомендацій, поставити операцію в чергу на пізніше.
Bulkhead (перегородка) - ізоляція ресурсів, щоб проблема в одній частині не «затопила» всю систему (назва - від перегородок у корпусі корабля):
- окремі пули з'єднань і воркерів для різних залежностей: повільний сервіс звітів не вичерпує з'єднання, потрібні для оплат;
- окремі черги для різних типів джоб: тисяча повільних генерацій PDF не блокує відправку листів підтвердження;
- ліміти паралельності на виклики конкретного сервісу.
У Laravel-застосунку:
- окремі черги й супервізори Horizon для різних типів робіт - найпростіший bulkhead;
- middleware джоб
ThrottlesExceptions- фактично запобіжник для джоб: після кількох винятків джоби відкладаються на час замість безперервних спроб; - запобіжник для HTTP реалізують через кеш (лічильник помилок і прапорець «відкрито» в Redis) чи бібліотеки;
- короткі тайм-аути - основа: без них жоден з патернів не допоможе.
Що важливо налаштувати: пороги (скільки помилок і за який час), тривалість відкритого стану, що вважається помилкою (тайм-аути й 5xx - так, 404 і 422 - ні), і моніторинг: запобіжник, що відкрився, - подія, про яку має дізнатися команда.