Автоматический выключатель Hystrix не размыкает цепь - PullRequest
0 голосов
/ 08 июля 2020

Я использую автоматический выключатель с помощью Hystrix в моем загрузочном приложении Spring, мой код выглядит примерно так:

@service
public class MyServiceHandler {

    @HystrixCommand(fallbackMethod="fallback")
    
    public String callService() {
       // if(remote service is not reachable
       // throw ServiceException
    }
    
    public String fallback() {
       // return default response
    }
}
// In application.properties, I have below properties defined:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
hystrix.command.default.circuitBreaker.requestVolumeThreshold=3
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=30000
hystrix.threadpool.default.coreSize=4
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=200000

Я вижу, что функция fallback () вызывается при каждом сбое callService(). Однако после 3 сбоев цепь не размыкается. После 3 сбоев я ожидал, что он напрямую вызовет fallback() и пропустит callService(). Но этого не происходит. Может кто-нибудь посоветовать, что я здесь делаю не так?

Спасибо, B Jagan

Отредактировано 26 июля, чтобы добавить дополнительную информацию ниже:

Ниже приведен фактический код. Я немного поиграл с этим. Я вижу, что схема открывается должным образом при повторном сбое, когда я вызываю удаленную службу непосредственно в методе RegistrationHystrix.registerSeller (). Но когда я помещаю вызов удаленной службы в шаблон повторной попытки Spring, он продолжает переходить в резервный метод, но цепь никогда не открывается.

@Service
public class RegistrationHystrix {
    Logger logger = LoggerFactory.getLogger(RegistrationHystrix.class);
    private RestTemplate restTemplate;
    private RetryTemplate retryTemplate;

    public RegistrationHystrix(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
        retryTemplate = new RetryTemplate();
        FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
        fixedBackOffPolicy.setBackOffPeriod(1000l);
        retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(3);
        retryTemplate.setRetryPolicy(retryPolicy);
    }

    @HystrixCommand(fallbackMethod = "fallbackForRegisterSeller", commandKey = "ordermanagement")
    public String registerSeller(SellerDto sellerDto)  throws Exception {
        String response = retryTemplate.execute(new RetryCallback<String, Exception>() {
                   @Override
                   public String doWithRetry(RetryContext context) {
                           logger.info(String.format("Retry count %d", context.getRetryCount()));
                          return restTemplate.postForObject("/addSeller", sellerDto, String.class);
                   }
       });
       return response;
    }

    public List<SellerDto> getSellersList() {
        return restTemplate.getForObject("/sellersList", List.class);
    }

    public String fallbackForRegisterSeller(SellerDto sellerDto, Throwable t) {
        logger.error("Inside fall back, cause - {}", t.toString());
        return "Inside fallback method. Some error occured while calling service for seller registration";
    }
}

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

@Service
public class RegistrationServiceImpl implements RegistrationService {

    Logger logger = LoggerFactory.getLogger(RegistrationServiceImpl.class);
    private RegistrationHystrix registrationHystrix;


    public RegistrationServiceImpl(RegistrationHystrix registrationHystrix) {
        this.registrationHystrix = registrationHystrix;
    }

    @Override
    public String registerSeller(SellerDto sellerDto)  throws Exception {
        long start = System.currentTimeMillis();
        String registerSeller = registrationHystrix.registerSeller(sellerDto);
        logger.info("add seller call returned in - {}", System.currentTimeMillis() - start);
        return registerSeller;

    }

Итак, я пытаюсь понять, почему автоматический выключатель не работает должным образом при использовании его вместе с Spring RetryTemplate.

1 Ответ

0 голосов
/ 20 июля 2020

Вы должны использовать metrics.healthSnapshot.intervalInMilliseconds во время тестирования. Я предполагаю, что вы выполняете все 3 запроса в течение 500 мс по умолчанию, и, следовательно, цепь не открывается. Вы можете либо уменьшить этот интервал, либо поставить sleep между 3 запросами.

...