Как справиться с нетерпеливым поведением с помощью Hystrix: пример из реальной жизни

Вот пример использования Hystrix для борьбы с нетерпеливым поведением в реальных условиях.

Hystrix – это библиотека, разработанная Netflix для реализации шаблона автоматического выключателя. Это помогает предотвратить каскадные сбои и обеспечивает отказоустойчивость распределенных систем. Шаблон автоматического выключателя позволяет вам контролировать поток запросов к службе, защищая ее от перегрузки или отсутствия ответа.

В контексте борьбы с нетерпеливым поведением Hystrix можно использовать для установки тайм-аутов и механизмов возврата для операций, которые могут занять больше времени, чем ожидалось. Например, давайте рассмотрим веб-приложение, которое отправляет HTTP-запросы к внешней службе. Если ответ от внешней службы занимает слишком много времени, мы хотим предоставить пользователю резервный ответ, а не заставлять его ждать бесконечно.

Вот пример того, как вы можете использовать Hystrix для реализации такого поведения в Java:

  1. Сначала добавьте зависимость Hystrix в свой проект. Если вы используете Maven, вы можете добавить в свой pom.xmlследующее:
<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.18</version>
</dependency>
  1. Создайте класс, расширяющий класс HystrixCommand, и переопределите метод run(). Этот метод будет содержать логику выполнения HTTP-запроса к внешней службе. Вы можете установить таймаут для запроса с помощью метода withExecutionTimeoutInMilli Seconds().
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
public class ExternalServiceCommand extends HystrixCommand<String> {
    private final String url;
    public ExternalServiceCommand(String url) {
        super(HystrixCommandGroupKey.Factory.asKey("ExternalServiceGroup"));
        this.url = url;
    }
    @Override
    protected String run() throws Exception {
        // Make the HTTP request to the external service
        // Return the response
    }
    @Override
    protected String getFallback() {
        // Provide a fallback response in case of timeout or failure
    }
}
  1. В коде вашего приложения создайте экземпляр класса ExternalServiceCommandи вызовите его с помощью метода execute().
ExternalServiceCommand command = new ExternalServiceCommand("https://example.com/api");
String response = command.execute();
  1. Вы также можете настроить резервное поведение, переопределив метод getFallback()в классе ExternalServiceCommand. Этот метод будет вызван, если время HTTP-запроса истечет или произойдет сбой.
@Override
protected String getFallback() {
    return "Fallback response";
}

Используя таким образом Hystrix, вы можете быть уверены, что ваше приложение предоставляет пользователям резервный ответ, когда ответ внешним службам занимает слишком много времени. Это помогает улучшить взаимодействие с пользователем и предотвращает нетерпеливое поведение.