重试机制用法与实现

在RPC外部调用,如果网络不稳定的情况下,重试功能是比较重要的必备项。

解决方案例如:

  • 根据失败重试时间,创建延迟队列,如果请求失败,入队列,消费,
  • spring retry,
  • guava retrying,
  • sisyphus

本文使用最简单的方式springboot+spring retry,其他的阔以自己去看看

spring retry实现

  1. 首先导入相关pom依赖
 		<dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
            <version>1.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
  1. 启动类上加上@EnableRetry
  2. 基于相关注解使用
@Service
public class LocalWfExampleService {
 	@Autowired
    private WorkflowExampleService workflowExampleServiceRpc;
    @Autowired
   private WorkflowTask workflowTask;
   
@Retryable(value= {RemoteAccessException.class},maxAttempts = 3,backoff = @Backoff(delay = 1000l,multiplier = 1))
public void doWfExample(WorkflowExampleDto workflowExampleDto) throws 	Exception {
      List<WorkFlowExample> list= 	workflowExampleServiceRpc.getWfExample(workflowExampleDto);
      if(CollectionUtils.isBlank(list)){
              throw new RemoteAccessException("RPC调用无数据");
		}
	workflowTask.createFlow(list);	
		
}	
@Recover
public void recover(RemoteAccessException e) {
        log.err(e.getMessage());
}
}
  1. 测试
 @Test
    public void test() throw Exception{
        localWfExampleService.doWfExample(new WorkflowExampleDto(1,2,3));
    }

参数说明

value:抛出指定异常才会重试
include:和value一样,默认为空,当exclude也为空时,默认所以异常
exclude:指定不处理的异常
maxAttempts:最大重试次数,默认3次
backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L,我们设置为其他;multiplier(指定延迟倍数) 默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1,则第一次重试为1秒,第二次为2秒,第三次为3秒。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Python 中使用 requests 库进行网络请求时,可以通过实现重试机制来处理请求失败的情况。以下是一个简单的实现示例: ```python import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry def requests_retry_session( retries=3, backoff_factor=0.3, status_forcelist=(500, 502, 504), session=None, ): session = session or requests.Session() retry = Retry( total=retries, read=retries, connect=retries, backoff_factor=backoff_factor, status_forcelist=status_forcelist, ) adapter = HTTPAdapter(max_retries=retry) session.mount('http://', adapter) session.mount('https://', adapter) return session # 使用示例 response = requests_retry_session().get('https://www.example.com') print(response.status_code) ``` 上述代码中,我们定义了一个名为 `requests_retry_session` 的函数来创建一个带有重试机制的 requests.Session 对象。在该函数中,我们使用了 `Retry` 类来配置重试策略,其中 `retries` 参数指定了最大重试次数,`backoff_factor` 参数指定了重试之间的延迟时间的乘数因子,`status_forcelist` 参数指定了需要触发重试的状态码列表。 然后,我们创建了一个 `HTTPAdapter` 对象,并将其与 `requests.Session` 对象进行关联,最后通过 `session.get()` 方法来发送请求并获取响应。 这样,在网络请求失败时,会自动进行重试,直到达到最大重试次数或成功获取到响应为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值