ogólnie rzecz biorąc, celem wzoru grodziowego jest uniknięcie usterek w jednej części systemu, aby zniszczyć cały system. Termin pochodzi od statków, w których statek jest podzielony na oddzielne przedziały wodoszczelne, aby uniknąć uszkodzenia pojedynczego kadłuba, aby zalać cały statek; zaleje tylko jedną przegrodę.
implementacje wzoru grodziowego mogą przybierać różne formy w zależności od rodzaju usterek, przed którymi chcesz chronić system. W tej odpowiedzi omówię tylko rodzaj usterek, z którymi Hystrix ma do czynienia.
myślę, że wzór Grodzi został spopularyzowany przez książkę Release It! autor: Michael T. Nygard.
co rozwiązuje Hystrix
implementacja w hystrix ogranicza liczbę jednoczesnych wywołań komponentu. W ten sposób liczba zasobów (zazwyczaj wątków) oczekujących na odpowiedź z komponentu jest ograniczona.
Załóżmy, że masz wielowątkową aplikację opartą na żądaniach (na przykład typową aplikację internetową), która używa trzech różnych komponentów, A, B i C. Jeśli żądania do komponentu C zaczną się zawieszać, ostatecznie wszystkie wątki obsługi żądań będą się zawieszać w oczekiwaniu na odpowiedź od C. spowoduje to, że aplikacja nie będzie reagować. Jeśli żądania do C są obsługiwane powoli, mamy podobny problem, jeśli obciążenie jest wystarczająco wysokie.
implementacja wzorca gródź hystrix ogranicza liczbę równoczesnych wywołań do komponentu i w tym przypadku zapisałaby aplikację. Załóżmy, że mamy 30 wątków obsługi żądań i istnieje limit 10 jednoczesnych wywołań do C. Wtedy co najwyżej 10 wątków obsługi żądań może zawiesić się podczas wywoływania C, pozostałe 20 wątków może nadal obsługiwać żądania i używać komponentów A I B.
hystrix’ podejścia
Hystrix’ ma dwa różne podejścia do Grodzi, izolację wątków i izolację semaforów.
Izolacja wątków
standardowym podejściem jest przekazanie wszystkich żądań do komponentu C do oddzielnej puli wątków o ustalonej liczbie wątków i braku (lub małej) kolejki żądań.
Izolacja semaforów
inne podejście polega na tym, aby wszyscy wywołujący uzyskali pozwolenie (z 0 timeoutem) przed żądaniami do C. Jeśli nie można uzyskać zezwolenia z semafora, wywołania do C nie są przekazywane.
różnice
zaletą podejścia thread pool jest to, że żądania przekazywane do C mogą zostać przekroczone, co nie jest możliwe przy użyciu semaforów.