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ąć.
Odpowiedzi:
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.
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 .
Hystrix ma dwa różne podejścia do przegrody: izolację wątków i izolację semaforów.
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ń.
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.
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.
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.