Как правильно обрабатывать ожидаемые ошибки в Hystrix fallback?
у нас есть Hystrix (1.4.x) команда, которая выглядит так (с использованием Spring):
@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback")
public List<X> findXs(long xId) {
return externalService.findXsExternally(xId);
}
мы на самом деле не хотят возвращать (пусто) List
из резервного метода, но скорее выбросить исключение, чтобы мы вызывалиfindXs
знает, что externalService
вниз и может принять меры соответственно. Но в то же время мы хотели бы воспользоваться преимуществами, которые предоставляет хистрикс. В нашем случае мы хотим, чтобы вызывающий абонент вернул сообщение об ошибке вместо возврата списка. В Весенний резерв реализован следующим образом:
public List<X> myFallback(long xId) {
// What to do?? Throw exception!?
}
исключение из myFallback
"работает", но Hystrix предупредит нас, что:
CommandKey не удалось и резервное копирование не удалось.
т. е. он будет интерпретировать это как ошибку резервирования. В нашем случае исключение должно не интерпретируется как резервный сбой, а скорее как ожидаемое поведение. Мы также попытались обернуть исключение thrown в HystrixBadRequestException
но это не кажется для работы в резерве (согласно docs это будет работать для метода "run").
как реализовать метод резервного копирования исключений в Hystrix? Можем ли мы безопасно игнорировать предупреждение или Hystrix не предназначена для работы таким образом?
1 ответов
Почему вы устанавливаете запасной вариант вообще, если вы не хотите его использовать? Hystrix не требует, чтобы вы его устанавливали. Резервный вариант используется, когда вы предпочитаете возвращать что-то вроде устаревших данных из кэша, а не создавать исключение. Оба случая считаются неудачей Hystrix. Если бы вы должны были выбросить исключение из метода резервного копирования, вы бы только путали Hystrix, который думал бы, что была ошибка с вашим резервным вариантом в дополнение к самому сервису. Hystrix должен бросить HystrixBadRequestException оборачивать исключение из метода findXs, если вам не дают отката.