
Architektura systemów informatycznych podlega ciągłej ewolucji, która zmierza w kierunku poprawy efektywności, bezpieczeństwa i wygody utrzymania rozbudowanych systemów. Obecnym trendem rynkowym jest architektura mikroserwisów, która opiera się na równoległym działaniu wielu aplikacji webowych o ograniczonej funkcjonalności, które komunikują się ze sobą bezpośrednio za pomocą http. Powstały mechanizmy związane ze wspieraniem tej architektury, do których należą:
- Service Discovery – system automatycznego wykrywania aktywnych mikrousług należących do danej sieci (rozwiązaniem w tej dziedzinie proponowanym przez Spring jest Eureka)
- Loadbalancing – pozwala na łatwe skalowanie systemu, poprzez dokładanie kolejnych instancji tej samej mikrousługi bez konieczności zatrzymania pracy całego systemu (rozwiązaniem w tej dziedzinie proponowanym przez Spring jest Ribbon)
- Circuit Breaker – mechanizm zarządzania awariami usług (rozwiązaniem w tej dziedzinie proponowanym przez Spring jest Hystrix).
W tym artykule zamierzam opisać sposób działania Hystrixa, uwzględniając jego najważniejsze cechy i przedstawiając kluczowe korzyści stosowania w architekturze mikroserwisów.
Omawiając temat Hystrixa, musimy bazować na komunikacji pomiędzy niezależnymi aplikacjami webowymi. W architekturze mikroserwisów tych aplikacji może być bardzo wiele. W poniższym przykładzie ograniczę się do minimum – czyli przedstawię sytuację, w której aplikacja webowa z interfejsem graficznym w postaci strony www komunikuje się z serwisem umożliwiającym pobieranie plików muzycznych. Rysunek 1. przedstawia poprawne działanie całego systemu.
Rys. 1. Mechanizm działania uproszczonego systemu opartego o mikroserwisy
Jak widzimy, użytkownicy otrzymali pliki, których potrzebowali. W takiej sytuacji mechanizm CircuitBreaker jest bezużyteczny. Doświadczony programista wie jednak, że świat idealny nie istnieje i każdy, nawet najlepiej zorganizowany system, jest podatny na awarie. Rysunek 2. przedstawia sytuację, w której serwis udostępniający pliki muzyczne uległ awarii. Przyczyn może być wiele – przypuśćmy, że główną przyczyną było przeciążenie serwera zbyt dużą ilością zapytań o pliki.

Rys. 2. Mechanizm działania uproszczonego systemu opartego o mikroserwisy, w którym nastąpiła awaria bez Hystrixa
W przytoczonym przypadku, zarówno użytkownik 1, jak i użytkownik 2 nie byli w stanie uzyskać pożądanych zasobów, a nieprzygotowana na to aplikacja webowa uległa zawieszeniu (użytkownik ma zablokowaną przeglądarkę i komunikat „proszę czekać”). Ponadto każdy następny użytkownik pragnący pobrać plik muzyczny będzie pogarszał sytuację, dodatkowo obciążając serwis dostarczający pliki muzyczne, co utrudni zwalczenie awarii. Każde odświeżenie strony (normalna reakcja końcowego użytkownika) będzie coraz mocniej blokowało działanie systemu.
Aby uniknąć powyższych problemów i blokady całego systemu opartego o mikroserwisy, stosuje się właśnie mechanizm zamknięcia obwodu z angielskiego nazywany Circuit Breaker. Jego przykładem jest Hystrix. Uproszczony sposób działania aplikacji z uwzględnieniem mechanizmu Hystrixa przedstawia Rysunek 3.
Widać na nim, że w momencie wystąpienia awarii, Hystrix odcina możliwość wysyłania nowych zapytań do systemu pobierania plików muzycznych na minutę, a gdy użytkownik spróbuje ponownie pobrać zasób w tym czasie automatycznie otrzymuje ekran błędu. Przeglądarka użytkownika nie uległa zawieszeniu, a serwis plików muzycznych ma szansę zwalczyć awarię – można w tym czasie przykładowo uruchomić kolejną instancję serwisu.


Rys. 3. Mechanizm działania uproszczonego systemu opartego o mikroserwisy, w którym nastąpiła awaria z Hystrixem
Hystrix działa w tym momencie jak bezpiecznik w instalacji elektrycznej, w której nastąpiło przepięcie – odłącza przepływ prądu, aby ograniczyć szkody. Programista ma możliwość szerokiego zarządzania sytuacją kryzysową – każdej metodzie wywołującej usługę zewnętrzną można zaimplementować alternatywną metodę, która wywołuje się w przypadku wystąpienia awarii. Ponadto parametryzowane są:
- czas przerwania obwodu
- czas oczekiwania na odpowiedź z usługi
- procentowy udział błędnych odpowiedzi, jako czynnik aktywujący bezpiecznik
- ilość requestów brana pod uwagę przy wyliczaniu procentu błędnych odpowiedzi
- i inne.
W ten sposób wystąpienie awarii jest w dużym stopniu kontrolowane, co umożliwia zastosowanie środków zapobiegawczych i szybkie wyjście z kryzysu. Dzięki tym możliwościom, stosowanie mechanizmu Circuit Breaker staje się standardem dobrze zaprojektowanego systemu informatycznego opartego o mikrousługi.