EA SAP HANA: Instalacja

Wzorce MSA: Circuit Breaker

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.



Czym jest Circuit Breaker?

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

Jak działa Circuit Breaker?

Circuit Breaker przechodzi przez trzy podstawowe stany:

  1. Closed (zamknięty)

    • Domyślny stan, w którym wszystkie żądania są przepuszczane do usługi docelowej.
    • Jeśli żądania są realizowane poprawnie, Circuit Breaker pozostaje zamknięty.
  2. Open (otwarty)

    • Gdy liczba błędów przekroczy określony próg, Circuit Breaker przechodzi w stan otwarty.
    • W tym stanie żadne nowe żądania nie są wysyłane do usługi docelowej.
  3. Half-Open (półotwarty)

    • Po pewnym czasie Circuit Breaker przechodzi w stan półotwarty, aby sprawdzić, czy usługa docelowa zaczęła działać poprawnie.
    • Jeśli testowe żądania zakończą się sukcesem, Circuit Breaker wraca do stanu zamkniętego. W przeciwnym razie pozostaje w stanie otwartym.

Dlaczego warto stosować Circuit Breaker?

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

  2. Szybsze reagowanie na błędy
    Unika oczekiwania na timeouty, ponieważ od razu blokuje żądania do niesprawnej usługi.

  3. Poprawa odporności systemu
    Minimalizuje ryzyko kaskadowych awarii w systemie mikroserwisowym.

  4. Efektywne zarządzanie zasobami
    Zasoby systemowe nie są marnowane na obsługę żądań, które z góry są skazane na porażkę.

Przykład implementacji Circuit Breaker w Javie z użyciem Resilience4j

Resilience4j to popularna biblioteka w ekosystemie Javy, która oferuje łatwą implementację wzorca Circuit Breaker.

Przykład konfiguracji


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"); } }

Diagram działania Circuit Breaker

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



Narzędzia wspierające implementację Circuit Breaker

  • Resilience4j: Biblioteka dla Javy, wspierająca także inne wzorce odpornościowe.
  • Hystrix: Popularna biblioteka od Netflixa (obecnie nie jest już rozwijana).
  • Istio: Service mesh, który wspiera zarządzanie Circuit Breaker na poziomie sieciowym.

Podsumowanie

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