Вопрос 17 · Раздел 17

Как обеспечить отказоустойчивость микросервисов

4. Fallback — альтернативный путь при сбое 5. Bulkhead — разделяет потоки, чтобы сбой в одном не задел другие

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Отказоустойчивость — способность системы продолжать работу при сбое отдельных компонентов.

Основные паттерны:

  1. Circuit Breaker — размыкает цепь при ошибках, возвращает fallback
  2. Retry — повторяет упавший вызов с задержкой
  3. Timeout — ограничивает время ожидания ответа
  4. Fallback — альтернативный путь при сбое
  5. Bulkhead — разделяет потоки, чтобы сбой в одном не задел другие
Сервис A → Circuit Breaker → Retry → Timeout → Fallback → результат

🟡 Middle Level

Resilience4j

// "backend" — имя конфигурации из application.yml.
// fallbackMethod — метод, вызываемый при срабатывании circuit breaker.
// Resilience4j перехватывает вызов через AOP-прокси.
@CircuitBreaker(name = "backend", fallbackMethod = "fallback")
@Retry(name = "backend")
@TimeLimiter(name = "backend")
@Bulkhead(name = "backend")
public CompletableFuture<String> callBackend(String input) {
    return backendService.callAsync(input);
}

public CompletableFuture<String> fallback(String input, Throwable t) {
    return CompletableFuture.completedFuture("fallback: " + input);
}

Конфигурация

resilience4j:
  circuitbreaker:
    instances:
      backend:
        failureRateThreshold: 50
        waitDurationInOpenState: 10s
  retry:
    instances:
      backend:
        maxAttempts: 3
        waitDuration: 1s
  timelimiter:
    instances:
      backend:
        timeoutDuration: 5s

Типичные ошибки

  1. Retry без exponential backoff:
    3 retry без задержки сразу → overload сервиса (утроение трафика).
    Нужен exponential backoff с jitter — см. файл 20.
    Решение: exponential backoff + jitter
    

🔴 Senior Level

Chaos Engineering

Тестирование отказоустойчивости:
- Chaos Monkey (Netflix) — случайно убивает сервисы
- Gremlin — fault injection
- Тоxiproxy — network latency

Цель: найти слабые места до продакшена

Production Experience

Multi-region deployment:

Region 1 (active) → traffic
Region 2 (passive) → standby
Region 1 down → failover to Region 2

Best Practices

✅ Circuit Breaker для внешних вызовов
✅ Retry с exponential backoff
✅ Timeout на все вызовы
✅ Fallback для graceful degradation
✅ Bulkhead для изоляции
✅ Monitoring и alerting

❌ Без timeout
❌ Retry без backoff
❌ Без fallback
❌ Без мониторинга

🎯 Шпаргалка для интервью

Обязательно знать:

  • 5 ключевых паттернов: Circuit Breaker, Retry, Timeout, Fallback, Bulkhead
  • Circuit Breaker блокирует вызовы к неработающему сервису
  • Retry с exponential backoff + jitter повторяет вызов с нарастающей задержкой
  • Timeout ограничивает время ожидания — защищает от зависания
  • Fallback — альтернативный путь при сбое (graceful degradation)
  • Bulkhead изолирует ресурсы — сбой в одном не задевает другие
  • Chaos Engineering (Chaos Monkey, Gremlin) тестирует отказоустойчивость до продакшена

Частые уточняющие вопросы:

  • Почему retry без backoff плох? Утраивает трафик на падающий сервис — усугубляет проблему.
  • Что такое Chaos Engineering? Намеренное внесение сбоев (убить сервис, добавить latency) для поиска слабых мест.
  • Resilience4j vs Hystrix? Hystrix в maintenance mode, Resilience4j — современный стандарт.
  • Multi-region deployment как обеспечивает отказоустойчивость? Region 1 down → failover to Region 2.

Красные флаги (НЕ говорить):

  • “Retry без backoff — нормально” — нет, overload сервиса
  • “Circuit Breaker не нужен, у нас надёжная сеть” — сбой может быть на стороне сервиса
  • “Fallback = игнорировать ошибку” — нет, это альтернативный путь (кэш, дефолтное значение)
  • “Bulkhead = Circuit Breaker” — нет, Bulkhead изолирует ресурсы, CB блокирует вызовы

Связанные темы:

  • [[5. Что такое паттерн Circuit Breaker]]
  • [[6. Как работает Circuit Breaker и какие у него состояния]]
  • [[18. Что такое паттерн Bulkhead]]
  • [[19. Что такое паттерн Retry и как его правильно использовать]]
  • [[20. Что такое exponential backoff]]