Guava cache, a ddos

Guava cache, a ddos
AG
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:4
0

Przy danym endpoincie używam cache z guavy.

Kopiuj
        cache = CacheBuilder.newBuilder()
            .maximumSize(10_000)
            .expireAfterWrite(200, TimeUnit.MILLISECONDS)
            .build()

Wartosc z cache ma sie usuwac po 200ms.

Pytanie: Co w przypadku jeśli ktoś np. naśle atak ddos np. 5000requestów, a średnio moja cachowana operacja wykonuje się np. 500ms?
Chodzi o to, że jeśli będzie moment w którym wartość z cache po tych 200ms zostanie usunięta to żeby reszta (około 5k~) requestów nie brała się za obliczanie tej operacji która jest cachowana.

Czy cache guavy oferuje jakieś zabezpieczenie przed czymś takim? Lockowanie nie wchodzi w gre

edytowany 1x, ostatnio: annon_guy
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
1

A nie możesz po prostu trzymać cache dłużej niż 200ms?


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
AG
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:4
0
Kamil Żabiński napisał(a):

A nie możesz po prostu trzymać cache dłużej niż 200ms?

Też sugerowałem takie rozwiązanie, niestety zostało ono odrzucone. Kompletnie nic innego mi nie przychodzi do głowy, stąd pytanie tutaj

edytowany 1x, ostatnio: annon_guy
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0

Ogólnie wartość w cache trzyma się tak długo jak tylko:

  • Wartość w cache jest dalej poprawna (bo np. nie zmienia się w czasie )
  • Nie brakuje w systemie pamięci

Czyli jeśli wartość nie będzie wymagać ponownego przeliczenia i pamięci nie będzie brakować to można ustawić expireAfterWrite na jeden dzień/tydzień/miesiąc/rok/. Gorzej jak po jakimś czasie dane stają się niepoprawne, albo obawiasz się że nie starczy pamięci. Na ten drugi wypadek można przenieść wartość expireAfterWrite to propertisów żeby móc to konfigurować na produkcji. Lub w jakiś inny sposób to zmieniać.

Innym rozwiązaniem może być zewnętrzny cache jak Redis


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
AG
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:4
0
Kamil Żabiński napisał(a):

Ogólnie wartość w cache trzyma się tak długo jak tylko:

  • Wartość w cache jest dalej poprawna (bo np. nie zmienia się w czasie )
  • Nie brakuje w systemie pamięci

Czyli jeśli wartość nie będzie wymagać ponownego przeliczenia i pamięci nie będzie brakować to można ustawić expireAfterWrite na jeden dzień/tydzień/miesiąc/rok/. Gorzej jak po jakimś czasie dane stają się niepoprawne, albo obawiasz się że nie starczy pamięci. Na ten drugi wypadek można przenieść wartość expireAfterWrite to propertisów żeby móc to konfigurować na produkcji. Lub w jakiś inny sposób to zmieniać.

No właśnie ten cache tyczy się endpointa z health checkiem, więc dane się mają szansę stać niepoprawnymi, jak np. się apka wyje@$ie.

edytowany 1x, ostatnio: annon_guy
Zobacz pozostałe 3 komentarze
AG
@nie100sowny: ten health check to nie jest na zasadzie czy apka stoi czy nie, bardziej sprawdza czy jest polaczenie z baza, kolejkami etc.
OtoKamil
W takim razie cache tu nie ma sensu. W przypadku który wymieniłem wyżej, jeśli będziesz dostawał request po HC co 150ms przez godzinę (a czyścisz dopiero po 200ms), a po pierwszym requeście padnie Ci połączenie z bazą to przez godzinę ktoś będzie dostawał info, że apka żyje bo pierwszy request zcacheował info o tym, że apka działa a reszta requestów wyciągała to z cache'a
AG
@OtoKamil: no ale przecież mam usuwanie z cache'a po 200ms .expireAfterWrite(200, TimeUnit.MILLISECONDS), więc ta sytuacja którą opisujesz się nie zadzieje
OtoKamil
Ah, racja, nie ogarnąłem :D Jednak w przeciągu tych 200ms może się trochę pozmieniać i coś padnie na te 200ms (zależnie od ruchu jaki macie) i przez 200ms możesz zwracać nieprawidłowy stan
AG
No tak, dlatego główny serwis ma schedule ze odpytuje nas co 500ms, więc nawet jeśli by był taki problem to przy kolejnym odpytaniu dostanie już prawidłowy (nieprawidłowy :D) stan aplikacji.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0

Z tego co wiem health checkiem zwykle nie wystawia się na świat zewnętrzny


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
OtoKamil
  • Rejestracja:około 10 lat
  • Ostatnio:około rok
  • Postów:143
0

Jakie rozwiązanie już przerabialiście?

Rozważaliście np.:

  1. Usługi anty-DDOS (nie używałem, nie znam wad/zalet, po prostu rzucam pomysłem) jeśli to ruch z zewnątrz
  2. Więcej instancji aplikacji w zapasie żeby rozłożyć ruch (napisaliście posty w trakcie pisania mojego, wiec dla HC to raczej nie ma sensu)
  3. Jeśli to niepubliczne api to nałożyć limit req/s na usera (jeśli od HC zależy coś ważnego to chyba też odpada)
  4. Wzięcie na klatę requesty i przyduszenie apki, ale user przynajmniej dostanie odpowiedź. Poczekacie na zeskalowanie się aplikacji albo umrzecie jeśli ruch będzie zbyt duży (tu też w przypadku HC skalowanie nie ma sensu)
edytowany 2x, ostatnio: OtoKamil
AG
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:4
0

znalazłem rozwiązanie, temat do zamknięcia.

OtoKamil
Jesteś w stanie podzielić się rozwiązaniem?
AG
https://github.com/google/guava/wiki/CachesExplained przy .build() można podac parametr ClassLoader, no i wtedy z java doca: If another thread is currently loading the value for this key, simply waits for that thread to finish and returns its loaded value.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.