Питання 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
- Toxiproxy — 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]]