Отключить Redis, когда много таймаутов с помощью весенней загрузки - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть приложение, развернутое в AWS EC2, иногда (редко), я не могу подключиться и выполнить какую-либо команду в redis, я выясняю причину этой проблемы.

Я использую Springboot + Redis (Elasticcache).

Я использую оболочку для перехвата любых исключений, чтобы продолжить процесс запроса.

Моя оболочка:

class RedisCacheWrapper implements Cache {

private final Cache delegate;

public RedisCacheWrapper(Cache redisCache) {
    Assert.notNull(redisCache, "delegate cache must not be null");
    this.delegate = redisCache;
}

@Override
public String getName() {
    try {
        return delegate.getName();
    } catch (Exception e) {
        return handleException(e);
    }
}

@Override
public Object getNativeCache() {
    try {
        return delegate.getNativeCache();
    } catch (Exception e) {
        return handleException(e);
    }
}

@Override
public ValueWrapper get(Object key) {
    try {
        return delegate.get(key);
    } catch (Exception e) {
        return handleException(e);
    }
}

@Override
public <T> T get(Object o, Class<T> type) {
    try {
        return delegate.get(o, type);
    } catch (Exception e) {
        return handleException(e);
    }
}

@Override
public <T> T get(Object o, Callable<T> callable) {
    try {
        return delegate.get(o, callable);
    } catch (Exception e) {
        return handleException(e);
    }
}

@Override
public void put(Object key, Object value) {
    try {
        delegate.put(key, value);
    } catch (Exception e) {
        handleException(e);
    }
}

@Override
public ValueWrapper putIfAbsent(Object o, Object o1) {
    try {
        return delegate.putIfAbsent(o, o1);
    } catch (Exception e) {
        return handleException(e);
    }
}

@Override
public void evict(Object o) {
    try {
        delegate.evict(o);
    } catch (Exception e) {
        handleException(e);
    }
}

@Override
public void clear() {
    try {
        delegate.clear();
    } catch (Exception e) {
        handleException(e);
    }
}

private <T> T handleException(Exception e) {
    log.error("handleException", e);
    return null;
}}

В моей конфигурации redisЯ установил тайм-аут на 1 с.Таким образом, когда команда connect / не выполняется через 1 с, redis создает исключение, подобное следующему:

Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out

Мои сомнения: есть хороший способ отключить временный кэш (без развертывания), в то время как redisнехорошо?Например: Использование разрыва цепи?

Я думаю, что сделайте это:

    @Cacheable()
    myMethodCached(){
       myRealMethod();
    }

    myRealMethod(){}

Поместите «myMethodCached» в HystrixCommand, если выброшено время ожидания, тогда метод отката выполняется без использования redis.

Проблема этого подхода заключается в том, что мне нужно создать «запасной вариант» для всех методов, использующих кеш, я бы хотел «отключить» глобально (весь кеш будет пропущен).

Есть ли хорошее решение "отключить" redis на время?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...