Как понять разницу между reactor.util.retry.Повторите попытку #backoff и reactor.util.retry.Повторите попытку#fixedDelay?

#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() были немного лучше:

Рандомизированный экспоненциальный откат хорош для предотвращения двух типичных проблем с другими более простыми стратегиями отката, а именно:

  • экспоненциально растущая задержка возврата с небольшой начальной задержкой дает наилучший компромисс между тем, чтобы не перегружать сервер и обслуживать клиента как можно быстрее
  • наличие дрожания или случайной задержки возврата полезно для предотвращения «повторных попыток», где, например. многочисленные клиенты будут одновременно обращаться к серверу, вызывая временные сбои, которые заставят всех клиентов повторять попытки с одинаковым временем отката, в конечном итоге не снижая нагрузку на сервер.