Spring BackOff退避算法(一)

1、按照固定时间间隔重试,比如100毫秒;这种方式在网络不稳定时重连可能造成某一时间点流量同时发送,阻塞网络;或者造成发送一些无意义的请求;

2、按照指数时间间隔重试,比如刚开始100毫秒,下一次200毫秒等;比如支付宝和第三方集成时就是类似方式。



固定时间间隔重试:

Java代码   收藏代码
  1. @Test  
  2. public void testFixedBackOff() {  
  3.     long interval = 100;  
  4.     long maxAttempts = 10;  
  5.     BackOff backOff = new FixedBackOff(interval, maxAttempts);  
  6.     BackOffExecution execution = backOff.start();  
  7.   
  8.     for(int i = 1; i <= 10; i++) {  
  9.         //每次重试时间是100毫秒  
  10.         System.out.println(execution.nextBackOff());  
  11.     }  
  12.     Assert.assertEquals(BackOffExecution.STOP, execution.nextBackOff());  
  13. }  

interval是重试间隔,maxAttempts是最大重试次数,如果重试到了maxAttempts,则execution.nextBackOff()=BackOffExecution.STOP。

 

指数时间间隔重试:

Java代码   收藏代码
  1. @Test  
  2. public void testExponentialBackOff() {  
  3.     long initialInterval = 100;//初始间隔  
  4.     long maxInterval = 5 * 1000L;//最大间隔  
  5.     long maxElapsedTime = 50 * 1000L;//最大时间间隔  
  6.     double multiplier = 1.5;//递增倍数(即下次间隔是上次的多少倍)  
  7.     ExponentialBackOff backOff = new ExponentialBackOff(initialInterval, multiplier);  
  8.     backOff.setMaxInterval(maxInterval);  
  9.     //currentElapsedTime = interval1 + interval2 + ... + intervalN;  
  10.     backOff.setMaxElapsedTime(maxElapsedTime);  
  11.   
  12.     BackOffExecution execution = backOff.start();  
  13.   
  14.     for(int i = 1; i <= 18; i++) {  
  15.         System.out.println(execution.nextBackOff());  
  16.     }  
  17.     Assert.assertEquals(BackOffExecution.STOP, execution.nextBackOff());  
  18. }  

initialInterval是初始重试间隔,maxInterval是最大的重试间隔, multiplier是递增倍数,maxElapsedTime是重试的最大时长。


你可能感兴趣的:(jsse)