更新时间:2025-01-09 GMT+08:00
分享

使用重试功能

clientcontrol提供了重试功能,当目标业务方法执行报错时,会按照用户配置的策略重试目标业务方法,具体使用方式如下:

  1. pom文件添加依赖
  2. 配置文件,参考下面配置样例。

    devspore:
      client-control:
        rules:
          retryTest:  # 此处配置的是一个别名,用户可自定义,具体使用地方是在注解上
            match: ^.*$
            module: RetryFirst
            time-limit:  # 超时功能默认开启,当只使用重试功能时,需要手动关闭超时功能
              enable: false
            retry:
              enable: true
              max-attempts: 3 # 重试次数,算上第一次执行的时候
              wait-duration-ms: 500 # 每次重试的间隔时间
              policy: Randomized  #此处配置的是重试间隔策略,可选值(Exponential/Randomized)
              randomized-wait-factor: 0.5  #随机策略随机因子(选择随机策略生效:基础间隔500,每次间隔为:500-500*0.5~500+500*0.5)
              exponential-backoff-multiplier: 2 #指数退避算法的乘数(选择指数策略生效:基础间隔500,每次间隔为:500,1000,2000.......)
              #不触发重试异常
              ignore-exceptions:
                - com.huaweicloud.devspore.clientcontrol.exception.TestException
            fallback: # 熔断功能默认开启,当只使用重试功能时,需要手动关闭超时功能
              enable: false

  3. 在目标方法上添加@ClientControl注解,且rule属性指定用户在配置文件中自定义的rules名称(本示例使用retryTest)。

    // 在想要使用超时功能的方法上添加 @ClientControl注解, 属性值rule 填写配置文件中自定义的名称
    @ClientControl(rule = "retryTest")
    public User testRetry(Integer id) {
    	int i = 1 / id;
    	return new User(id, "vn", 12);
    }

注意事项

  • 当使用超时功能时,当前方法不能运行在异步线程中,异步会导致超时功能失效。
  • 触发重试的机制是方法抛出异常,不管是什么异常,只要抛出了异常方法就会重试,如果抛出某些异常的时候不想重试,则可以参考配置中的ignore-exceptions,没有的时候此参数可以不配置。
  • 配置中的policy中在提供的两种方式中选择一个即可,当使用Randomized的时候,配置randomized-wait-factor。 当使用Exponential的时候配置exponential-backoff-multiplier。

相关文档