2016-02-15 13 views
7

Abbiamo un comando di Hystrix (1.4.x) che assomiglia a questo (utilizzando Spring):Come gestire correttamente gli errori previsti in hystrix fallback?

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

Noi in realtà non vogliamo restituire un (vuoto) List dal metodo di ripiego, ma piuttosto un'eccezione cosicché il nostro chiamante di findXs sa che lo externalService non funziona e può agire di conseguenza. Ma allo stesso tempo vorremmo sfruttare le funzionalità offerte da Hystrix. Nel nostro caso vogliamo che il chiamante restituisca un messaggio di errore invece di restituire una lista. In primavera un ripiego è implementata in questo modo:

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

un'eccezione da myFallback "funziona", ma Hystrix ci avvertono che:

commandKey fallito e fallito di ripiego.

I.e. interpreterà questo come un errore di fallback. Nel nostro caso l'eccezione dovrebbe non essere interpretata come errore di fallback ma piuttosto come comportamento previsto. Abbiamo anche provato a racchiudere l'eccezione generata in un HystrixBadRequestException ma non sembra funzionare per fallback (in base allo docs ciò funzionerebbe per il metodo "run").

Come implementare un metodo di fallback di lancio di eccezioni in Hystrix? Possiamo tranquillamente ignorare l'avviso o Hystrix non è stato progettato in questo modo?

risposta

9

Perché stai impostando il fallback se non vuoi usarlo? Hystrix non richiede di impostarne uno. Il fallback viene utilizzato quando si preferisce restituire qualcosa come dati obsoleti da una cache invece di generare un'eccezione. Entrambi i casi contano come un fallimento di Hystrix. Se si dovesse lanciare un'eccezione dal metodo fallback, si confonderebbe solo Hystrix, il quale potrebbe pensare che vi fosse un errore con il proprio fallback oltre al servizio stesso. Hystrix dovrebbe lanciare una HystrixBadRequestException che avvolge l'eccezione generata dal metodo findXs se non si fornisce un fallback.

+0

Ma come si differenzia da dove proviene HystrixRuntimeException, se si dispone di più metodi annotati con @HystrixCommand? Ho il problema che mi piacerebbe comportarmi diversamente a seconda del cliente, ad es. un timeout, ma l'unica cosa che so è che si è verificata una HystrixRuntimeException. – woezelmann

+0

C'è un attributo chiamato ** commandKey ** nell'annotazione. Puoi cancellarlo. L'ho appena testato impostandolo come ** ckey **, e qui c'è il messaggio che era nell'eccezione ... ** ckey fallito e fallback fallito **. Probabilmente ci sono ancora più metodi dentro l'eccezione stessa, provalo e vedi di persona – hyness

Problemi correlati