Отказоустойчивость 4j Повторная попытка — Потребление памяти

#resilience4j #resiliency #resilience4j-retry

Вопрос:

Я использую resilience4j с Spring Boot 2.x Как влияет использование модулей повтора и автоматического выключателя на память и процессор?

Кроме того, каково влияние на память, если у меня 2000 событий/с, поступающих с каждой полезной нагрузкой около 10 МБ, и я сохранил продолжительность ожидания повторной попытки 15 секунд с экспоненциальным коэффициентом возврата 2? У меня 8 ГБ оперативной памяти приложения

Ответ №1:

Лучший способ-отслеживать ваше приложение с помощью профиля, такого как VisualVM. Тогда вы сможете узнать, где находится узкое место.

Одна вещь, которую я знаю, имеет значение, это то, где вы создаете свой экземпляр circuitbreaker. В конце концов, есть коллектор, который удаляет неиспользуемые экземпляры. Но в вашем случае, по-видимому, было бы хорошей идеей не помещать создание автоматического выключателя в метод get, как здесь

 @Service
public static class DemoControllerService {
    private RestTemplate rest;
    private CircuitBreakerFactory cbFactory;
    public DemoControllerService(RestTemplate rest, CircuitBreakerFactory cbFactory) {
        this.rest = rest;
        this.cbFactory = cbFactory;
    }
    public String slow() {
        return cbFactory.create("slow").run(() -> rest.getForObject("/slow", String.class), throwable -> "fallback");
    }
}
 

Но создайте прерыватель цепи в конструкторе.

 @Service
public class DemoControllerService {
    private RestTemplate restTemplate = new RestTemplate();
    private CircuitBreakerFactory circuitBreakerFactory;
    private CircuitBreaker circuitBreaker;

    @Autowired
    public DemoControllerService(CircuitBreakerFactory circuitBreakerFactory) {
        this.circuitBreakerFactory = circuitBreakerFactory;
        this.circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    }
 

Также обсуждается возможность размещения одного прерывателя цепи на хост. Другое, что вы можете сделать, — это самостоятельно удалить экземпляр реестра и не ждать, пока компонент circuitbreaker удалит его в будущем.

 registry.remove(circuitBreakerName);
 

Здесь также обсуждается вопрос об очистке памяти реестра.