w dniu
architecture
enterprise
sap
- Pobierz link
- X
- Inne aplikacje
W systemach mikroserwisowych komunikacja między usługami jest kluczowa, ale również narażona na wiele problemów. Jednym z najbardziej efektywnych wzorców projektowych, które pomagają zapewnić stabilność i odporność systemu, jest Circuit Breaker. W tym artykule omówię, czym jest ten wzorzec, jak działa oraz dlaczego warto go stosować w architekturze mikroserwisowej.
Circuit Breaker (z ang. wyłącznik obwodu) to wzorzec, który chroni system przed przeciążeniami i umożliwia szybsze reagowanie na problemy w komunikacji między usługami. Jego działanie można porównać do elektrycznego wyłącznika, który odłącza obwód w przypadku wykrycia problemu, aby uniknąć dalszych uszkodzeń.
W kontekście systemów rozproszonych, Circuit Breaker monitoruje połączenia między usługami i blokuje dalsze próby komunikacji z usługą, która aktualnie nie działa poprawnie. Dzięki temu system nie traci zasobów na wykonywanie bezsensownych żądań.
Circuit Breaker przechodzi przez trzy podstawowe stany:
Closed (zamknięty)
Open (otwarty)
Half-Open (półotwarty)
Ochrona przed przeciążeniami
Chroni usługi przed przeciążeniem, ograniczając liczbę żądań wysyłanych do usługi, która nie działa poprawnie.
Szybsze reagowanie na błędy
Unika oczekiwania na timeouty, ponieważ od razu blokuje żądania do niesprawnej usługi.
Poprawa odporności systemu
Minimalizuje ryzyko kaskadowych awarii w systemie mikroserwisowym.
Efektywne zarządzanie zasobami
Zasoby systemowe nie są marnowane na obsługę żądań, które z góry są skazane na porażkę.
Resilience4j to popularna biblioteka w ekosystemie Javy, która oferuje łatwą implementację wzorca Circuit Breaker.
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import java.time.Duration;
public class CircuitBreakerExample {
public static void main(String[] args) {
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50) // Próg błędów (50%)
.waitDurationInOpenState(Duration.ofSeconds(5)) // Czas oczekiwania w stanie otwartym
.slidingWindowSize(10) // Rozmiar okna (liczba żądań do analizy)
.build();
CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);
CircuitBreaker circuitBreaker = registry.circuitBreaker("example");
// Przykład wywołania usługi z Circuit Breaker
try {
String result = circuitBreaker.executeSupplier(() -> callExternalService());
System.out.println(result);
} catch (Exception e) {
System.out.println("Service is unavailable: " + e.getMessage());
}
}
private static String callExternalService() {
// Logika wywołania usługi zewnętrznej
throw new RuntimeException("Service failed");
}
}
Oto prosty diagram obrazujący przepływ żądań z wykorzystaniem Circuit Breaker:
@startuml participant "Klient" as Client participant "Circuit Breaker" as CB participant "Usługa docelowa" as Target Client -> CB: Wysyła żądanie CB -> Target: Przekazuje żądanie (stan Closed) Target --> CB: Odpowiedź (sukces lub błąd) CB -> Client: Odpowiedź alt Stan Open Client -> CB: Wysyła żądanie CB --> Client: Blokuje żądanie end @enduml
Circuit Breaker to kluczowy wzorzec w systemach mikroserwisowych, który zwiększa odporność i stabilność systemu. Chroni przed przeciążeniami, minimalizuje czas oczekiwania na odpowiedzi i redukuje ryzyko kaskadowych awarii. W połączeniu z innymi wzorcami i narzędziami, takimi jak Resilience4j czy Istio, stanowi fundament nowoczesnych systemów rozproszonych. Jeśli Twój system wymaga wysokiej dostępności, Circuit Breaker powinien znaleźć się w Twoim zestawie narzędzi projektowych.
Komentarze
Prześlij komentarz