Jaki jest wzór grodzi używany przez Hystrix?

104

Hystrix, interfejs API Netflix dla opóźnień i odporności na błędy w złożonych systemach rozproszonych, wykorzystuje technikę Bulkhead Pattern do izolacji wątków. Czy ktoś mógłby to rozwinąć.

Sashank
źródło

Odpowiedzi:

193

Generał

Ogólnie rzecz biorąc, celem wzoru przegrody jest uniknięcie błędów w jednej części systemu i wyłączenie całego systemu. Termin pochodzi od statków, w których statek jest podzielony na oddzielne wodoszczelne przedziały, aby uniknąć pojedynczego uszkodzenia kadłuba, które mogłoby zalać cały statek; zaleje tylko jedną przegrodę.

Implementacje wzoru przegrody mogą przybierać różne formy, w zależności od rodzaju usterek, przed którymi chcesz chronić system. Omówię tylko rodzaj usterek, które Hystrix obsługuje w tej odpowiedzi.

Myślę, że wzór grodzi został spopularyzowany przez książkę Release It! Michael T. Nygard.

Co rozwiązuje Hystrix

Implementacja przegrody w Hystrix ogranicza liczbę jednoczesnych wywołań komponentu . W ten sposób liczba zasobów (zwykle wątków) oczekujących na odpowiedź z komponentu jest ograniczona.

Załóżmy, że na podstawie żądania mają multi gwintowany aplikacji (na przykład typowych aplikacji WWW), które wykorzystywane są trzy różne komponenty, A , B oraz C . Jeśli wnioski do składnika C zaczyna się powiesić, ostatecznie wszystkie żądania obsługi wątków zawiśnie na czekając na odpowiedź C . Spowodowałoby to, że aplikacja całkowicie nie reagowała. Jeśli żądania do C są obsługiwane powoli, mamy podobny problem, jeśli obciążenie jest wystarczająco duże.

Implementacja schematu przegrody przez Hystrix ogranicza liczbę jednoczesnych wywołań komponentu i w tym przypadku uratowałaby aplikację. Załóżmy, że mamy 30 żądanie obsługi wątki i istnieje limit jednoczesnych połączeń do 10 ° C . Wtedy co najwyżej 10 żądań obsługi wątków może zawisnąć podczas wywoływania C , pozostałe 20 wątki mogą nadal obsługiwać żądania i komponentów użytkowania A i B .

Podejście Hystrixa

Hystrix ma dwa różne podejścia do przegrody: izolację wątków i izolację semaforów.

Izolacja wątku

Standardowe podejście polega na przekazywaniu wszystkich żądań do komponentu C do oddzielnej puli wątków ze stałą liczbą wątków i brakiem (lub małą) kolejką żądań.

Izolacja semaforów

Innym podejściem jest umieszczenie wszystkich rozmówcy uzyskania pozwolenia (gdzie 0 timeout) przed żądań dla C . Jeśli nie można uzyskać zezwolenia z semafora, wywołania do języka C nie są przekazywane.

Różnice

Zaletą podejścia z pulą wątków jest to, że żądania przekazywane do języka C mogą mieć przekroczony limit czasu, co nie jest możliwe w przypadku korzystania z semaforów.

K Erlandsson
źródło
10
Dodatkowo, w oryginalnej wiki Hystrix jest teraz szczegółowy opis obu podejść: github.com/Netflix/Hystrix/wiki/How-it-Works
Dmitry
1
Jaka jest różnica między wyłącznikiem a przegrodą?
voipp,
4
Wyłączniki @voipp to zupełnie inna sprawa. Wykrywają, kiedy usługa jest w złym stanie i przenosi abonentów do stanu „szybkiej awarii”, w którym nie wywołują usługi w złej kondycji, ale zamiast tego zwracają kod błędu, dopóki usługa nie będzie w porządku. Pozwala to uniknąć przeciążania usługi w złej kondycji, aby można ją było odzyskać, i zapobiega kaskadowym awariom, ponieważ wywołujące nie są spowolnione.
K Erlandsson
1

Oto dobry przykład z wyjaśnieniem środowiska wykonawczego dla przegrody w Resilience4j, który jest inspirowany przez Netflix Hystrix.

Poniższe przykładowe konfiguracje mogą dać pewną przejrzystość użytkowania.

Przykładowe konfiguracje: Zezwalaj na maksymalnie 5 jednoczesnych połączeń w danym momencie. Pozostaw inne połączenia oczekujące do zakończenia jednego z 5 jednoczesnych połączeń w toku lub do maksymalnie 2 sekund.

Chodzi o to, aby nie obciążać żadnego systemu obciążeniem większym, niż może zużywać. Jeśli przychodzące obciążenie jest większe niż zużycie, poczekaj na rozsądny czas lub po prostu przekrocz limit czasu i przejdź do alternatywnej ścieżki.

Ravi K
źródło