我试过修复延迟和退避,似乎是一样的。。。那么它们的区别和用法是什么呢。
static AtomicInteger retryTime = new AtomicInteger();
public static void main(String[] args) throws InterruptedException {
generate()
.retryWhen(Retry.fixedDelay(5, Duration.ofSeconds(1))
.filter(e -> e instanceof Exception)
.doBeforeRetry(res -> System.out.println("retry begin"))
.doAfterRetry(res -> System.out.println("try finished")))
.onErrorContinue((throwable, o) -> System.out.println(throwable))
.subscribe(System.out::println);
Thread.sleep(5000);
}
private static Mono<String> generate() {
return Mono.fromCallable(() -> {
if (retryTime.get() == 3) {
return "Hello";
}
System.out.println("i am called" + retryTime.getAndAdd(1));
throw new IllegalArgumentException("exception test");
});
}
1条答案
按热度按时间fgw7neuy1#
似乎是来自
Mono.retryBackoff()
比以前好多了:随机指数退避很好地防止了其他更简单退避策略的两个典型问题,即:
具有指数增长的退避延迟和一个小的初始延迟可以在不使服务器崩溃和尽可能快地为客户机提供服务之间进行最佳权衡
有一个抖动,或随机退避延迟,有利于避免“重试风暴”,如许多客户机将击中服务器在同一时间,导致它显示短暂的失败,这将导致所有客户机在相同的退避时间重试,最终节省服务器上没有负载。