2016-02-15 10 views
7

Mamy (1.4.x) polecenie hystrix że wygląda następująco (przy użyciu wiosna):Jak prawidłowo obsłużyć oczekiwane błędy w cofnięciu hystrix?

@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback") 
public List<X> findXs(long xId) { 
    return externalService.findXsExternally(xId); 
} 

My faktycznie nie chce powrócić a (pusty) List od sposobu awaryjnej ale raczej wyjątek abyśmy zadzwonili pod numer findXs wie, że externalService nie działa i może podjąć odpowiednie działania. Ale jednocześnie chcielibyśmy skorzystać z funkcjonalności, jaką zapewnia Hystrix. W naszym przypadku chcemy, aby wywołujący zwrócił komunikat o błędzie zamiast zwracania listy. Na wiosnę awaryjna jest realizowany tak:

public List<X> myFallback(long xId) { 
    // What to do?? Throw exception!? 
} 

Throwing wyjątek od myFallback „działa”, ale Hystrix nas ostrzec, że:

commandKey zawiodły i awaryjnej nie powiodło się.

tj. zinterpretuje to jako awarię awaryjną. W naszym przypadku wyjątek powinien być interpretowany jako niepowodzenie awaryjne, ale raczej jako oczekiwane zachowanie. Próbowaliśmy także zawinąć wyrzucony wyjątek w HystrixBadRequestException, ale nie działa on w przypadku błędów zwrotnych (zgodnie z docs działałoby to w przypadku metody "uruchom").

W jaki sposób można wdrożyć metodę awaryjną polegającą na odrzuceniu w Hystrix? Czy możemy bezpiecznie zignorować ostrzeżenie lub czy Hystrix nie jest zaprojektowana w ten sposób?

Odpowiedz

9

Dlaczego ustawiasz awarię w ogóle, jeśli nie chcesz jej używać? Hystrix nie wymaga ustawiania. Opcja ta jest używana, gdy wolisz zwracać coś w postaci nieaktualnych danych z pamięci podręcznej, niż wrzucać wyjątek. Obie sprawy liczą się jako niepowodzenie Hystrix. Jeśli miałbyś rzucić wyjątek od metody awaryjnej, mógłbyś tylko pomylić Hystrix, która by pomyślała, że ​​wystąpił błąd z twoją rezerwą oprócz samej usługi. Hystrix powinien rzucić wyjątek HystrixBadRequestException zawijający wyjątek wyrzucony z metody findXs, jeśli nie zapewnisz rezerwowego.

+0

Ale jak odróżnić, skąd pochodzi wyjątek HystrixRuntimeException, biorąc pod uwagę fakt, że masz wiele metod opatrzonych komentarzem @HystrixCommand? Mam problem, że chciałbym zachowywać się inaczej w zależności od tego, który klient ma np. limit czasu, ale jedyne co wiem to to, że wystąpił wyjątek HystrixRuntimeException. – woezelmann

+0

W adnotacji znajduje się atrybut ** commandKey **. Możesz wyłączyć to. Właśnie przetestowałem go, ustawiając go jako ** ckey **, a tutaj jest wiadomość, która była w wyjątku ... ** Ckey nie powiodło się i nie powiodło się awarie **. Prawdopodobnie jest jeszcze więcej metod wewnątrz samego wyjątku, wypróbuj go i przekonaj się sam – hyness

Powiązane problemy