Я всегда зацикливаюсь на реактивном мышлении, когда мне приходится начинать делать несколько внешних вызовов. Сейчас мне поручено реализовать следующий сценарий с использованием Reactor и Webflux.
- Получить токен из кеша
- Токен не найден
- Запрос от системы авторизации нового токена
- Сохранять токен в кеше
- Жетон найден
- Использовать токен для запроса к внешней системе
- Внешняя система отвечает 2xx
- Обратный ответ
- Внешняя система отвечает 403
- Неверный токен в кеше
- Повторить весь поток сверху
Пока у меня есть только пример того, как я хотел бы использовать кеш:
public static Mono<ServerResponse> doRequest(
Function<Mono<Token>, Mono<ClientResponse>> clientRequest,
Function<Mono<ClientResponse>, Mono<ServerResponse>> errorHandler
) {
Token token = null;
return token.getToken()
.transform(clientRequest)
.flatMap(clientResponse -> {
if (clientResponse.statusCode().value() == 403) {
// HOW WOULD I INVALIDATE ANYTHING HERE? Or where should i do it?
return Mono.error(new TokenExpired("Token expired"));
}
return Mono.just(clientResponse);
})
.transform(errorHandler)
.retryWhen(companion -> {
return companion.zipWith(Flux.range(1,4),
(error, index) -> {
if (index < 4 && (error instanceof TokenExpired)) {
return index;
} else {
throw Exceptions.propagate(error);
}
});
});
}
Я посмотрел на addons кеш, но не смог понять, как вручную сделать кеш недействительным, поскольку он был основан только на времени? Кроме того, при использовании кэша кофеина поведение аннулирования не определено в многопоточной среде. Я чувствую, что мой вариант использования является стандартным, но я не смог найти какие-либо шаблоны для этого.
Две проблемы, с которыми я застрял:
Убедиться, что обновление кэша происходит только один раз и не является блокирующим.
Как сделать запись в кэше недействительной неблокирующим способом.
Действительно, я застрял в том, как подходить к проблеме реактивно, принятый ответ не обязательно должен быть Reactor, это может быть любая реактивная библиотека, показывающая мышление, необходимое для решения проблемы.