Рубрики
Без рубрики

С помощью fault tolerance на Quarkus, потому что ошибаться-это umano, но имеет границ!

Сталкивались с фактами, в какой-то момент ваше приложение будет сбой. Однако, это не потому, что ошибся, что мы будем… Помеченные кварками, явой, бразилией и евами.

Сталкивались с фактами, в какой-то момент ваше приложение будет сбой.

Однако, это не потому, что мы допускаем ошибки, что мы должны плакать в положении плода, потому и не удается. Мы можем легко восстановить и Quarkus, который поможет нам в этом процессе.

Поэтому, если вы знаете, как ошибаться или, как исправить эту ошибку, ваше приложение будет хорошо. O Quercus trazuma extensão batuta para lidar com essas situações: a отказоустойчивость . В сегодняшнем посте, мы будем знать это расширение.

Мы будем строить microsserviço с некоторых конечных точек REST. Эти конечные точки будут работать по-разному. После этого, мы будем осуществлять простых и элегантных решений, чтобы обойти эти недостатки.

Давайте получить собирается в code.quarkus.io , установите расширение SmallRye Fault Tolerance послать загрузить примеры кода. Это создаст службу rest простой, который возвращает Строку hello . Давайте немного изменить класс, созданный и создавая несколько конечных точек, которые simularão различных ситуациях ошибки и которые мы будем лечить. Код этих ситуаций будет выглядеть следующим образом:

package org.acme;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

import java.time.LocalDateTime;

@Path("/")
public class ExampleResource {
  int contador = 0;

  @GET
  @Path("/timeout")
  public String helloComTimeout() throws Exception {
      return tentativaComSleep();
  }

  String tentativaComSleep() throws Exception {
    Thread.sleep(5_000);
    return "hello com timeout";
  }

  @GET
  @Path("/retries")
  public String helloComRetry() throws Exception {
    tentativaComRetentativas();
    return "hello com retry";
  }

  private void tentativaComRetentativas() {
    contador++;
    System.out.println("Tentativa número: " + contador + " às " + LocalDateTime.now());
    throw new RuntimeException();
  }

  @GET
  @Path("/fallback")
  public String helloComFallback() throws Exception {
    return tentativaComFallback();
  }

  String tentativaComFallback() {
    throw new RuntimeException();
  }  
}

Мы создали 3 endpoints. Первый отвечает, но она занимает некоторое время для этого, второй и третий не в состоянии ответить из-за некоторых исключений. Теперь мы будем обходить эти ситуации с поддержки нашей библиотеке отказоустойчивости.

Тайм-аут

Состояние ожидания активизируется, когда система занимает слишком много времени, чтобы ответить. План его опирается на создание поток чтобы следить, как время начала выполнения и поп exception, если это время будет превышено.

Но не нужно писать много, чтобы иметь все это. Просто добавьте заметки @Timeout с время ожидания, что мы хотим. Если этот способ не завершить работы в срок, будет сгенерировано исключение типа TimeoutException.

После этого он просто будет обработать это исключение с поведение, нужное. Десса форма, о кварках, контролирующих тоду, часть управления темпом, потоки и т.д…

Изменив код, реквизиции, будет выглядеть следующим образом:

  @GET
  @Path("/timeout")
  public String helloComTimeout() throws Exception {
    try {
      return tentativaComSleep();
    } catch (TimeoutException e) {
      return "Tentativa com timeout tratado, seu serviço responderá rápido";
    }
  }

  @Timeout(value = 2000)
  private String tentativaComSleep() throws Exception {
    Thread.sleep(5_000);
    return "hello com timeout";
  }

Наш код будет реагировать быстрее (хотя и с различным поведением), что делает пользовательский опыт более гладкой.

Retentativas

Иногда проблема не может быть, что услуга потребуется слишком много, чтобы ответить, возможно, проблема может быть решена, если мы пытаемся снова спустя некоторое время.

С аннотацией @ “Retry”, если происходит какое-либо исключение, приложение пытается запустить тот же код несколько раз (количество ограничено). Если вы не можете выполнить, таким образом, что она действительно будет взрыв исключение. Код с повторной попытки выглядит так:

  @Retry(maxRetries = 5)
  void tentativaComException() {
    contador++;
    System.out.println("Tentativa número: " + contador + " às " + LocalDateTime.now());
    throw new RuntimeException();
  }

Наш код все еще возвращает исключение, но мы в журнале мы увидим, что раз система попытался запустить метод.

Tentativa número: 1 às 2021-05-18T10:24:37.996164
Tentativa número: 2 às 2021-05-18T10:24:38.000239
Tentativa número: 3 às 2021-05-18T10:24:38.101461
Tentativa número: 4 às 2021-05-18T10:24:38.292833
Tentativa número: 5 às 2021-05-18T10:24:38.338367
Tentativa número: 6 às 2021-05-18T10:24:38.338657

Обратите внимание, что только за эту заметку, мы получаем поведение retentativas и у нас также есть несколько видов управления, как во времени между retentativas максимальное время, чтобы сделать все операции, какие исключения будут rentativa, etc…

Возврат

Метод резервирования-это метод, который вызывается в случае исключения. Если в повторной попытки система выполняла несколько раз тот же метод, с резервированием будет работать-то другая логика. Podemos pensar nele como uma forma mais limpa de fazer um попробуй|поймай/| . Код изменен, таким образом, получает:

  @Fallback(fallbackMethod = "tratamentoComFallback")
  String tentativaComFallback() {
    throw new RuntimeException();
  }

  String tratamentoComFallback() {
    return "Hello com fallback tratado";
  }

Запустив код, возврат будет:

Важно, что метод fallback имеет ту же подпись, что и метод начальной или даст плохой.

Другая вещь, а часть правовой метод резервирования является то, что он работает очень хорошо с других заметок. Таким образом, вы можете retentar сделать операцию, и, если вы не можете или займет слишком много времени, метод резервирования запускается. Находится topzeira.

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

Был очень рад вернуться, чтобы написать о Quarkus, в основном, говорить об этом расширении что было удобно в последние недели. Num post futuro, quero falar sobre автоматический выключатель .

Я надеюсь, что все больше и больше людей могут использовать и влюбиться в этой удивительной технологии. Да, и код, сегодня можно найти нет github .

Оригинал: “https://dev.to/lucasscharf/usando-o-fault-tolerance-no-quarkus-porque-errar-e-umano-mas-tem-limites-4n2l”