Skip to content

MaxainNN/java-resilience

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Java Resilience Library

Библиотека отказоустойчивости на чистой Java с использованием Reflection API.

Возможности

@Retry — Автоматический повтор при ошибках

@Retry(
    maxAttempts = 4,                              // Максимум попыток
    delayMs = 500,                                // Базовая задержка
    backoff = BackoffStrategy.EXPONENTIAL,        // Стратегия увеличения задержки
    multiplier = 2.0,                             // Множитель для экспоненциальной стратегии
    maxDelayMs = 5000,                            // Максимальная задержка
    retryOn = {IOException.class},                // На какие исключения повторять
    noRetryOn = {IllegalArgumentException.class}, // Какие НЕ повторять
    fallbackMethod = "fetchDataFallback"          // Fallback при исчерпании попыток
)
public String fetchData(String url) {
    // код, который может выбросить исключение
}

public String fetchDataFallback(String url, Throwable ex) {
    return "cached-data";
}

Стратегии backoff:

  • FIXED — фиксированная задержка
  • LINEAR — линейный рост (delay * attempt)
  • EXPONENTIAL — экспоненциальный рост (delay * multiplier^attempt)
  • EXPONENTIAL_WITH_JITTER — экспоненциальный + случайный джиттер

@CircuitBreaker — Защита от каскадных сбоев

@CircuitBreaker(
    name = "external-service",           // Уникальное имя (методы с одним именем разделяют состояние)
    failureThreshold = 5,                // Сбоев для открытия
    successThreshold = 3,                // Успехов в HALF_OPEN для закрытия
    openDurationMs = 30000,              // Время в OPEN состоянии
    halfOpenRequests = 3,                // Пробных запросов в HALF_OPEN
    failOn = {RuntimeException.class},   // Что считается сбоем
    ignoreExceptions = {ValidationException.class}, // Игнорируемые исключения
    fallbackMethod = "getDefault",       // Fallback при OPEN
    useSlidingWindow = true,             // Использовать скользящее окно
    slidingWindowSize = 10,              // Размер окна
    failureRateThreshold = 50            // % ошибок для открытия
)
public String callService() {
    // вызов внешнего сервиса
}

Состояния Circuit Breaker:

stateDiagram-v2
    [*] --> CLOSED
    CLOSED --> OPEN : failureThreshold достигнут
    OPEN --> HALF_OPEN : openDurationMs истекло
    HALF_OPEN --> CLOSED : successThreshold достигнут
    HALF_OPEN --> OPEN : сбой при пробном запросе

    CLOSED : Нормальная работа
    OPEN : Все запросы отклоняются
    HALF_OPEN : Пробные запросы
Loading

Использование

1. Создание прокси

// Вариант 1: явное указание интерфейса
MyService service = new MyServiceImpl();
MyService resilientService = ResilienceProxy.create(service, MyService.class);

// Вариант 2: автоопределение интерфейсов
MyService resilientService = ResilienceProxy.create(service);

2. Мониторинг Circuit Breaker

CircuitBreakerRegistry registry = CircuitBreakerRegistry.getInstance();

// Получить состояние
CircuitBreakerState state = registry.get("external-service");
System.out.println("State: " + state.getState());
System.out.println("Failure rate: " + state.getFailureRate() + "%");

// Сбросить состояние
registry.reset("external-service");

// Сбросить все
registry.resetAll();

3. Комбинация @Retry + @CircuitBreaker

// Порядок выполнения: CircuitBreaker → Retry → Method
// 1. CB проверяет состояние
// 2. Если CLOSED/HALF_OPEN — выполняется Retry
// 3. Retry делает несколько попыток
// 4. Результат регистрируется в CB

@Retry(maxAttempts = 3, delayMs = 200)
@CircuitBreaker(name = "critical", failureThreshold = 2)
public String criticalOperation() {
    // ...
}

Архитектура

flowchart LR
    Client([Client]) --> Proxy

    subgraph Proxy[ResilienceProxy]
        subgraph Handler[ResilienceInvocationHandler]
            CB[CircuitBreaker Logic] --> Retry[Retry Logic]
            CB --> Registry

            subgraph Registry[CircuitBreakerRegistry]
                S1[CB State 1]
                S2[CB State 2]
                S3[...]
            end
        end
    end

    Retry --> Target([Target Method])
Loading

Запуск демо

  cd java-resilience
  mvn compile exec:java -Dexec.mainClass="io.mkalugin.resilience.Main"

Запуск тестов

  mvn test

Полезные ссылки

Лицензия

MIT

About

Java Resilince Liblary with example

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages