Guava Cache obsługa Option

0

Mam taką sytuację, jest sobie interface do otrzymywania kursów walut:


interface CurrencyExchangeRatioProvider {
    fun getCurrencyExchange(from: Currency, to: Currency, exchangeDate: LocalDate) : Option<ExchangeRatio>
}

Jedną z implementacji jest restowy klient z którego zwracam Vavrowy Option (hehe pozdrawiam @Charles_Ray) - jak będzie 2xx to zwórci Option.Some, a inaczej pustego Optiona. To co chce zrobić to kolejną implementację będzie wrapperem z Guavovym Cachem i chcę wykorzystać CacheLoader i tu pojawia sięzagwostka - jeśli będzie problem dla pary walutowej (bo na przykład dostawca kursów będzie niedostępny), to wtedy zostanie zwrócony zwracany pusty Option. Jak najlepiej poradzić sobie z takim problemem?
Jeydny hack który wymyśliłem to dodawanie kluczy dla ktorych delegator zwraca pusty option do jakieś kolekcji i co jakiś czas robenie refresha dla niej...

0

A nie prościej nie umieszczać w Cache tych pustych w ogóle? Wtedy nie trzeba kombinować z refreshami. Alternatywnie możesz ustawić jakieś expire after write i co jakis czas automatycznie będzie pobierać wartości i refreshować cache.

0

A nie prościej nie umieszczać w Cache tych pustych w ogóle?

Ech no tak, w Guavie też mają metode put(K key, V Value)...

1

Nie wiem jak Guava ale Caffeine umie:
https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/2.2.0/com/github/benmanes/caffeine/cache/Cache.html#get-K-java.util.function.Function-

Wołasz sobie cache.get(key,this::fetchRealValue); i teraz:

  1. Jeśli klucz jest w cache to wartość idzie z cache
  2. Jeśli klucza nie ma, to wołana jest funkcja fetchRealValue i teraz:
  • jeśli funkcja zwróciła wartość nie-null, to wartość jest wkładana do cache i zwracana
  • jeśli funkcja zwróciła null, to wartość nie jest wkładana do cache i zwracany jest null

Alternatywnie Caffeine ma też https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/2.2.0/com/github/benmanes/caffeine/cache/Caffeine.html#expireAfterWrite-long-java.util.concurrent.TimeUnit-
wiec możesz wkładać sobie do cache te swoje puste optiony, ale ustawic ze entry wygasa po jakimś czasie i wtedy "sam" sie zrobi refresh, bo entry wygaśnie i wartość zostanie pobrana ponownie.

2

Kursy walut potrafią się zmienić w czasie (ha!), więc tak czy inaczej powinieneś mieć jakiegoś TTL. Pomyśl o dodaniu circuit breakera, żeby nie uderzać ciągle do niedostępnej usługi.

1

Też polecam Caffeine.

Które też ma fajny ficzer jak asynchronously refresh https://github.com/ben-manes/caffeine/wiki/Refresh

0

Kursy walut potrafią się zmienić w czasie (ha!), więc tak czy inaczej powinieneś mieć jakiegoś TTL

No w sumie bieżący kurs się zmienia, ale jeśli mam kurs przeszły to chyba nie powinien się zmienić? Może w takim przypadku mieć 2 cache, jeden na "dzisiaj", a drugi na przeszłe daty?
Chociaż to mógłby być trochę OE

1

Bieżący kurs też nie zmienia, po pewnym czasie nazywasz go przeszłym. To tylko kwestia skąd patrzysz.

0

@jarekr000000: nie doprezycowałem, API zwraca średni kurs z danego dnia. Jak dzień się skończył to kurs nie powinien się dla tego dnia nie powinien się zmieniać

1

No to wtedy nie bierzesz z żadnego cache tylko z historii, która trzymasz w ordynarnej bazie danych. Po co tutaj (w sensie przed klientem http) chcesz w ogóle cache mieć?

1 użytkowników online, w tym zalogowanych: 0, gości: 1