超时和重试

1、超时机制
(1)定义
超时机制说的是当一个请求超过指定的时间(比如1s)还没有被处理的话,这个请求就会直接被取消并抛出指定的异常或者错误(比如504GatewayTimeout)。
超时可以简单分为下面2种:
连接超时(ConnectTimeout):客户端与服务端建立连接的最长等待时间。
读取超时(ReadTimeout):客户端和服务端已经建立连接,客户端等待服务端处理完请求的最长时间。实际项目中,我们关注比较多的还是读取超时。
通常情况下,我们建议读取超时设置为1500ms,这是一个比较普适的值。连接超时可以适当设置长一些,建议在1000ms~5000ms之内。
2、重试机制
(1)定义
重试机制一般配合超时机制一起使用,指的是多次发送相同的请求来避免瞬态故障和偶然性故障。由于瞬态故障和偶然性故障是很少发生的,因此,重试对于服务器的资源消耗几乎是可以被忽略的。
重试的次数通常建议设为3次。并且,我们通常还会设置重试的间隔,比如说我们要重试3次的话,第1次请求失败后,等待1秒再进行重试,第2次请求失败后,等待2秒再进行重试,第3次请求失败后,等待3秒再进行重试。
超时和重试机制在实际项目中使用的话,需要注意保证同一个请求没有被多次执行。
(2)简单实例
启动类加上注解@EnableRetry

@EnableRetry
@SpringBootApplication
public class TestApplication {

	public static void main(String[] args) {
		SpringApplication.run(TestApplication.class, args);
	}
	
}

方法加上注解@Retryable,其中value表示抛出指定异常才会重试,maxAttempts表示最大重试次数(默认3次)
方法加上注解@Recover,该注解定义一个方法来处理在达到最大重试次数后仍然失败的情况

@Slf4j
@Service
public class RetryService {

	@Retryable(value= IllegalArgumentException.class, maxAttempts = 4)
	public void test(int age) {
		log.info("Age={}", age);
		if (age <= 0) {
			throw new IllegalArgumentException("Illegal Data");
		}
	}
	
	@Recover
    public void recover(IllegalArgumentException e) {
		log.info("Message={}", e.getMessage());
    }
	
}

运行结果

2023-08-03 15:39:39 [http-nio-8080-exec-7] INFO  cn.hwd.service.RetryService - Age=-13 
2023-08-03 15:39:40 [http-nio-8080-exec-7] INFO  cn.hwd.service.RetryService - Age=-13 
2023-08-03 15:39:41 [http-nio-8080-exec-7] INFO  cn.hwd.service.RetryService - Age=-13 
2023-08-03 15:39:42 [http-nio-8080-exec-7] INFO  cn.hwd.service.RetryService - Age=-13 
2023-08-03 15:39:42 [http-nio-8080-exec-7] INFO  cn.hwd.service.RetryService - Message=Illegal Data 
2023-08-03 15:39:46 [http-nio-8080-exec-9] INFO  cn.hwd.service.RetryService - Age=0 
2023-08-03 15:39:47 [http-nio-8080-exec-9] INFO  cn.hwd.service.RetryService - Age=0 
2023-08-03 15:39:48 [http-nio-8080-exec-9] INFO  cn.hwd.service.RetryService - Age=0 
2023-08-03 15:39:49 [http-nio-8080-exec-9] INFO  cn.hwd.service.RetryService - Age=0 
2023-08-03 15:39:49 [http-nio-8080-exec-9] INFO  cn.hwd.service.RetryService - Message=Illegal Data 
2023-08-03 15:39:52 [http-nio-8080-exec-8] INFO  cn.hwd.service.RetryService - Age=7 
2023-08-03 15:39:58 [http-nio-8080-exec-10] INFO  cn.hwd.service.RetryService - Age=9 

你可能感兴趣的:(其他,java)