Как создать динамический hystrixcommand threadPoolKey

Я использую hystrix для реализации концепции автоматического выключателя в моем сервисе springboot. Аннотация HystrixCommand, которую я использую для метода, который должен регулировать вызовы внешних служб в случае порогового количества сбоев, выглядит следующим образом:

 @HystrixCommand(commandKey = "myCommandKey",
            groupKey = "myGroupKey",
            threadPoolKey = "myThreadPoolKey")
    public String myHystrixMethod(String someParam) { ....}

Теперь служба, в которой находится myHystrixMethod, вызывается разными клиентами. В зависимости от типа клиента, который вызывает службу, существует логика вызова серверной службы, предназначенной для этого конкретного клиента.

Я хотел бы зарегистрировать все потоки (запросы), вызываемые конкретным клиентом, в его собственном пуле потоков hystrix. Это означает, что запросы от клиента A будут регистрироваться в пуле потоков hystrix для клиента A, а для клиента B - в пуле потоков hystrix только для клиента B. Это гарантирует, что запросы клиента B к моей службе не будут задушены из-за сбоев в клиенте A.

Для этого я могу создать отдельные методы обслуживания (показанный выше) для каждого клиента и соответствующим образом назвать пул потоков hystrix. Однако при таком подходе всякий раз, когда появляется новый клиент, мне придется изменить исходный код, чтобы добавить его сервисный метод.

Есть ли способ динамически создавать параметры внутри аннотации @HystrixCommand на основе параметра, которым в данном случае является идентификатор клиента?


person Hary    schedule 14.09.2017    source источник
comment
Я не думаю, что это возможно. посмотри. github.com/Netflix/Hystrix/issues/350   -  person pvpkiran    schedule 14.09.2017
comment
Похоже, с hystrix это невозможно. Есть ли какое-либо другое решение для автоматического выключателя, такое как hystriix, у которого есть хорошая возможность динамически создавать такие свойства на лету?   -  person Hary    schedule 14.09.2017
comment
есть и другие библиотеки, такие как drugged и resilience4j. Но я не думаю, что вы найдете там эту функцию. посмотрите и дайте нам знать. :)   -  person pvpkiran    schedule 14.09.2017


Ответы (1)


Я не знаю, как это сделать с помощью библиотеки Hystrix, но, поскольку вы просили предоставить любую другую реализацию автоматического выключателя, которая может это сделать, вот решение, основанное на библиотеке Resilience4J.

В контексте вашего приложения вы можете зарегистрировать CircuitBreakerRegistry bean-компонент с конфигурацией по умолчанию для ваших клиентов.

@Bean
public CircuitBreakerRegistry circuitBreakerRegistry() {
    CircuitBreakerConfig config = CircuitBreakerConfig.custom()
            .failureRateThreshold(35)
            .ringBufferSizeInClosedState(1000)
            .ringBufferSizeInHalfOpenState(100)
            .waitDurationInOpenState(Duration.ofMinutes(1))
            .build();
    return CircuitBreakerRegistry.of(config);
}

Затем вы просто вставляете этот реестр в свою службу, и внутри своего защищенного метода вы можете получить CB для любого клиента, который вам нужен.

CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("ClientA");

Эта операция найдет уже зарегистрированный автоматический выключатель или при необходимости создаст новый, используя конфигурацию реестра по умолчанию.

И теперь вы можете использовать любой CircuitBreaker метод выбора: isCallPermitted() или executeRunnable() или любой другой.

Для получения дополнительной информации см. Руководство пользователя.

person bstorozhuk    schedule 05.12.2017