Circuit breaker — патерн проєктування, який використовується для виявлення відмов та надає логіку запобіганню постійних повторів.
Проблема
Нехай, дано два сервіси, які взаємодіють між собою. Результат роботи одного сервісу напряму залежить від іншого.
Основний сервіс дізнається про несправність допоміжного із певною затримкою. Однак на момент очікування, основний сервіс витрачає свої ресурси, такі як пам'ять, процесорний час, кількість доступних потоків виконання, тощо. Якщо кількість запитів на основний сервіс перевищує затримку очікування відповіді про несправність допоміжного сервісу, із часом основний сервіс вичерпає свої ресурси й також вийде із ладу.
Вирішення
Необхідно додати проміжний сервіс, який заздалегідь перериватиме невдалі запити, а також слідкуватиме за відновленням роботи допоміжного сервісу.
Алгоритм
Closed (з'єднаний зв'язок)
Система перебуває у з'єднаному стані тоді коли допоміжний сервіс успішно відповідає на запити основного сервісу.
Проміжний сервіс пересилає запити від основного до допоміжного сервісу. Проміжний сервіс веде кількість невдалих запитів. Якщо допоміжний сервіс відповів із помилкою, то проміжний сервіс збільшує значення в лічильнику. Якщо кількість невдалих спроб перевищує максимальну протягом певного періоду часу, то проміжний сервіс переходить в стан Open.
Open (зв'язок із розривами)
Система перебуває у стані розриву. Задача цього стану не навантажувати допоміжний сервіс запитами та дати йому час на відновлення. При цьому основний сервіс отримує відповідь про несправність без жодних затримок.
Проміжний сервіс отримує запити від основного сервісу та миттєво завершує їх із помилкою. Проміжний сервіс запускає таймер (час необхідний допоміжному сервісу для відновлення), і по завершені цього часу переходить в стан Half Open. Перехід в цей стан можна реалізувати також іншим чином, наприклад, від кількості запитів, тощо.
Half Open (відновлення зв'язку)
На цьому етапі ми не знаємо напевно чи допоміжний сервіс відновився, чи досі перебуває в аварійному стані.
Дозволяємо запит від основного сервісу до допоміжного. Якщо запит успішний, то переходимо в стан Close. Якщо запит завершився помилкою, то переходимо в стан Open.
Опис мовою C#
Нехай, дано сервіси які взаємодіють між собою.
У той час, як один із сервісів успішно виконує свою операцію. Інший має шанс аварійного завершення. При цьому присутня затримка, що впливає на роботу основного сервісу.
Таким чином несправності в допоміжному сервісі блокують основний.
Додамо сервіс, який корегуватиме стан систему.
Проміжний сервіс матиме наступний вигляд:
Реалізація
C#
Див. також Шаблони проєктування програмного забезпечення
Джерела Circuit Breaker