#java #spring #spring-webflux #project-reactor
#java #весна #spring-webflux #проект-реактор
Вопрос:
я попробовал fixedDelay и backoff, похоже, то же самое… итак, в чем разница между ними и их использованием.
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:
Похоже, устаревшие документы из Mono.retryBackoff()
были немного лучше:
Рандомизированный экспоненциальный откат хорош для предотвращения двух типичных проблем с другими более простыми стратегиями отката, а именно:
- экспоненциально растущая задержка возврата с небольшой начальной задержкой дает наилучший компромисс между тем, чтобы не перегружать сервер и обслуживать клиента как можно быстрее
- наличие дрожания или случайной задержки возврата полезно для предотвращения «повторных попыток», где, например. многочисленные клиенты будут одновременно обращаться к серверу, вызывая временные сбои, которые заставят всех клиентов повторять попытки с одинаковым временем отката, в конечном итоге не снижая нагрузку на сервер.