← Назад ко всем вопросам

Как работает паттерн Circuit Breaker

1️⃣ Как кратко ответить

Паттерн Circuit Breaker предотвращает постоянные попытки выполнения неудачных операций в распределенных системах, временно блокируя вызовы к нестабильным сервисам. Он работает в трех состояниях: Closed (замкнуто), Open (разомкнуто) и Half-Open (полуразомкнуто), переключаясь между ними в зависимости от успешности или неуспешности вызовов.

2️⃣ Подробное объяснение темы

Паттерн Circuit Breaker используется для повышения устойчивости и надежности распределенных систем, особенно когда они взаимодействуют с внешними сервисами, которые могут быть ненадежными или перегруженными. Этот паттерн помогает избежать избыточной нагрузки на систему и улучшает время отклика, предотвращая постоянные попытки выполнения неудачных операций.

Основные состояния Circuit Breaker

  1. Closed (Замкнуто): В этом состоянии все вызовы к сервису проходят без ограничений. Если количество ошибок превышает заданный порог, Circuit Breaker переходит в состояние Open.

  2. Open (Разомкнуто): В этом состоянии все вызовы к сервису блокируются и немедленно завершаются с ошибкой. Это состояние предотвращает дальнейшие попытки взаимодействия с нестабильным сервисом. Через определенный интервал времени Circuit Breaker переходит в состояние Half-Open.

  3. Half-Open (Полуразомкнуто): В этом состоянии разрешается выполнение ограниченного количества вызовов к сервису. Если эти вызовы успешны, Circuit Breaker возвращается в состояние Closed. Если же они завершаются ошибкой, он снова переходит в состояние Open.

Пример реализации Circuit Breaker

Рассмотрим пример реализации Circuit Breaker на языке Go с использованием библиотеки github.com/sony/gobreaker.

package main
​
import (
	"fmt"
	"net/http"
	"time"
​
	"github.com/sony/gobreaker"
)
​
func main() {
	// Конфигурация Circuit Breaker
	settings := gobreaker.Settings{
		Name:        "HTTP GET",
		MaxRequests: 3, // Максимальное количество разрешенных запросов в состоянии Half-Open
		Interval:    60 * time.Second, // Интервал времени для сброса счетчиков ошибок в состоянии Closed
		Timeout:     30 * time.Second, // Время ожидания перед переходом из состояния Open в Half-Open
		ReadyToTrip: func(counts gobreaker.Counts) bool {
			// Условие перехода в состояние Open: более 5 ошибок
			return counts.ConsecutiveFailures > 5
		},
	}
​
	// Создание нового Circuit Breaker
	cb := gobreaker.NewCircuitBreaker(settings)
​
	// Пример использования Circuit Breaker для HTTP-запроса
	for i := 0; i < 10; i++ {
		_, err := cb.Execute(func() (interface{}, error) {
			// Выполнение HTTP GET запроса
			resp, err := http.Get("http://example.com")
			if err != nil {
				return nil, err
			}
			defer resp.Body.Close()
			return resp.StatusCode, nil
		})
​
		if err != nil {
			fmt.Println("Request failed:", err)
		} else {
			fmt.Println("Request succeeded")
		}
​
		time.Sleep(5 * time.Second) // Пауза между запросами
	}
}

Объяснение кода

  • Конфигурация Circuit Breaker: Настройки включают максимальное количество запросов в состоянии Half-Open, интервал для сброса счетчиков ошибок и таймаут для перехода из состояния Open в Half-Open. Условие ReadyToTrip определяет, когда Circuit Breaker должен перейти в состояние Open.

  • Создание Circuit Breaker: Используется библиотека gobreaker для создания нового Circuit Breaker с заданными настройками.

  • Использование Circuit Breaker: Метод Execute оборачивает вызов HTTP-запроса. Если запрос завершится ошибкой, Circuit Breaker увеличивает счетчик ошибок и может изменить свое состояние в зависимости от настроек.

  • Обработка результата: Если запрос успешен, выводится сообщение об успехе. В случае ошибки выводится сообщение о неудаче.

Паттерн Circuit Breaker помогает управлять отказами в распределенных системах, минимизируя влияние нестабильных сервисов на общую производительность и надежность системы.

Тема: GO: Архитектура
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки