Разбираемся: прерыватель цепи в реактивных микросервисах

Привет! Сегодня мы собираемся погрузиться в мир реактивных микросервисов и поговорить о важной концепции построения устойчивых и отказоустойчивых систем: автоматическом выключателе. Итак, берите чашечку кофе, садитесь поудобнее и давайте разберемся!

Прежде чем мы углубимся в детали, давайте кратко вспомним, что такое реактивные микросервисы. Короче говоря, реактивные микросервисы — это архитектурный подход, который подчеркивает оперативность, эластичность и устойчивость перед лицом сбоев. Они предназначены для обработки больших рабочих нагрузок, легко масштабируются и справляются с непредсказуемыми моделями трафика.

Теперь перейдем к звезде нашего шоу: автоматическому выключателю. В сфере распределенных систем сбои неизбежны. Службы могут перестать отвечать на запросы, снизить производительность или даже вообще выйти из строя. Здесь в игру вступает схема автоматического выключателя. Он действует как система безопасности, предотвращая каскадные сбои и обеспечивая изоляцию неисправностей.

Итак, как же работает автоматический выключатель? Итак, представьте, что у вас есть микросервис, который отправляет запрос к другому сервису. Автоматический выключатель контролирует состояние этой службы. Если служба начинает плохо себя вести или перестает отвечать на запросы, автоматический выключатель срабатывает и начинает перенаправлять запросы на резервный механизм, например кеш или ответ по умолчанию. Это предотвращает распространение сбоя и влияние на другие части системы.

Теперь давайте рассмотрим несколько примеров кода, чтобы проиллюстрировать различные методы реализации автоматического выключателя в реактивных микросервисах:

  1. Hystrix от Netflix: Hystrix — популярная библиотека для реализации автоматических выключателей. Он предоставляет простой в использовании API и хорошо интегрируется с реактивными платформами, такими как Spring WebFlux. Вот простой пример:
@GetMapping("/example")
@HystrixCommand(fallbackMethod = "fallback")
public Mono<Response> getExample() {
    return webClient.get()
        .uri("/service")
        .retrieve()
        .bodyToMono(Response.class);
}
public Mono<Response> fallback() {
    return Mono.just(new Response("Fallback response"));
}

В этом примере, если конечная точка /serviceперестает отвечать, будет вызван метод fallback(), возвращающий резервный ответ.

  1. Resilience4j: Еще одна мощная библиотека для реализации автоматических выключателей — Resilience4j. Он предлагает расширенные функции, такие как ограничение скорости и политики повторных попыток. Вот фрагмент, демонстрирующий его использование:
CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults("example");
Supplier<Response> supplier = CircuitBreaker.decorateSupplier(circuitBreaker, () -> {
    // Call the service here
    return service.getResponse();
});
Response response = Try.ofSupplier(supplier)
    .recover(throwable -> {
        // Fallback logic here
        return new Response("Fallback response");
    })
    .get();

В этом примере CircuitBreakerотслеживает вызов service.getResponse(). В случае сбоя выполняется резервная логика.

<ол старт="3">

  • Spring Cloud Circuit Breaker: Если вы используете Spring Cloud, вы можете воспользоваться преимуществами его встроенной абстракции автоматического выключателя, которая обеспечивает согласованный API для различных реализаций автоматического выключателя. Вот фрагмент, иллюстрирующий его использование:
  • @CircuitBreaker(name = "example", fallbackMethod = "fallback")
    @GetMapping("/example")
    public Mono<Response> getExample() {
        return webClient.get()
            .uri("/service")
            .retrieve()
            .bodyToMono(Response.class);
    }
    public Mono<Response> fallback(Throwable throwable) {
        return Mono.just(new Response("Fallback response"));
    }

    В этом примере аннотация @CircuitBreakerиспользуется для определения поведения автоматического выключателя, включая метод возврата.

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

    Продолжайте программировать и создавать надежные микросервисы, и пусть ваши системы всегда остаются устойчивыми!