Карта / Gateway, Resilience / Resilience4j

Resilience4j

Resilience4j — библиотека готовых паттернов отказоустойчивости для микросервисов, легковесная замена устаревшему Hystrix. Circuit Breaker (см. тему «Circuit Breaker») — лишь один из её модулей, есть и другие защитные механизмы.

@Retry(name = "userService", fallbackMethod = "getUserFallback")
@RateLimiter(name = "userService")
@CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")
User getUser(Long id) {
    return restTemplate.getForObject("http://user-service/api/users/" + id, User.class);
}
Копнуть глубже

Основные модули Resilience4j, и какую проблему каждый решает:

МодульЗащищает от
Circuit Breakerкаскадного сбоя при падении зависимого сервиса
Retryвременных, кратковременных сбоев (сетевая дрожь)
Rate Limiterперегрузки своего сервиса слишком частыми запросами
Bulkheadисчерпания ресурсов одним “плохим” вызовом, изолирует пул потоков под конкретную зависимость
Time Limiterзависших вызовов — принудительно обрывает по таймауту

Bulkhead — частично менее известный, но важный паттерн. Название от переборок на корабле — если одна “каюта” затапливается, остальные изолированы и корабль не тонет целиком. На практике это значит: выделить отдельный пул потоков под вызовы к конкретному внешнему сервису, чтобы если этот сервис тормозит и все потоки заняты ожиданием его ответа — это не утащит за собой потоки, обслуживающие другие, никак не связанные запросы.

Комбинация нескольких механизмов — норма, не исключение. Реальный production-код часто оборачивает внешний вызов сразу несколькими защитами (как в примере выше) — каждая защищает от своего класса проблем, и вместе они дают существенно более устойчивую систему, чем любая из них по отдельности.

🎤 Закрыл тему, если можешь объяснить:
• основные модули Resilience4j и от чего защищает каждый;
• идею Bulkhead и почему механизмы часто комбинируют вместе (если дошёл до 2-го слоя).