Как правильно обрабатывать ожидаемые ошибки в 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, если вам не дают отката.