Как обеспечить отказоустойчивость микросервисов
4. Fallback — альтернативный путь при сбое 5. Bulkhead — разделяет потоки, чтобы сбой в одном не задел другие
🟢 Junior Level
Отказоустойчивость — способность системы продолжать работу при сбое отдельных компонентов.
Основные паттерны:
- Circuit Breaker — размыкает цепь при ошибках, возвращает fallback
- Retry — повторяет упавший вызов с задержкой
- Timeout — ограничивает время ожидания ответа
- Fallback — альтернативный путь при сбое
- 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
Типичные ошибки
- 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]]