A jeżeli np. używany jest jakiś cache rozproszony typu redis, hazelcast czyli de facto I/O sieciowe to też warto robić cache tego cache'a żeby nie wchodzić na IO tylko z pamięci?
To zależy co piszesz i jak bardzo zależy ci na latency. Ja nie twierdzę że zawsze
należy tak robić. Jak ktoś klepie CRUDa to pewnie nie ma to znaczenia, ale jak piszesz jakiś system tradingowy który ma obsługiwać setki tysięcy requestów na sekundę i odpowiadać w kilka milisekund, to wtedy nie tyle warto, co nawet trzeba ;)
Zależy jak bardzo potrzebujesz wydajności i na co możesz sobie pozwolić. Narzut na komunikację oczywiście będzie, ale jeżeli np. masz 10 instancji jakiegoś serwisu, które muszą się komunikować pomiędzy sobą, to wiele nie zrobisz, bo czasami po prostu potrzebujesz jakiejś współdzielonej wartości.
Jw, oczywiście że dobiera sie rozwiązania do problemu i jak nie potrzebujesz odpowiadać w 5 milisekund, tylko możesz sobie pozwolić na 500, to wtedy można sie bawić w synchroniczne requesty do innych serwisów.
to wiele nie zrobisz, bo czasami po prostu potrzebujesz jakiejś współdzielonej wartości.
Zapewniam że można wiele zrobić
;)
- Można wysyłać eventy do wszystkich instancji, tak żeby każda z nich miała dokładnie taki sam stan swojego cache w pamięci. Czyli np. przychodzi update od usera, jest obsługiwany przez serwis zajmujący się "zapisem", który go przetwarza a następnie emituje event, że taka operacja nastąpiła. Dzięki temu serwisy "czytające" nie potrzebują synchronicznie pobierać niczego w trakcie obsługi requestu.
- Alternatywnie serwisy czytające, mogą co jakiś czas robić sobie odczyt i aktualizować swoje wewnętrzne cache, podobnie jak w tym przykładzie z tokenem tutaj.
Załóżmy np. ze mamy taki problem jak OP, tylko instancji mamy 100 i chcemy żeby wszystkie używały tego samego tokena. Moglibyśmy w takim razie zamiast osobnego wątku
mieć w ogóle osobny serwis który zajmuje się pobieraniem tego tokena co jakiś czas i może emitować event do innych instancji kiedy pojawia się nowy token, albo każda instancja aplikacji co zadany czas pobiera z tego serwisu aktualny token.
Można by zamiast ciężkiego serwisu użyć jakiegoś Serverless jak AWS Lambda, bo mamy mały kawałek kodu który chcemy odpalić tylko raz na jakiś czas. W opcji 2 można by wtedy taki token wrzucic do jakiegoś Redisa, z którego co jakiś czas pozostałe serwisy czytałyby sobie aktualną wartość.
Ale to chyba nie zadziała przy system2system
Czemu nie? Jeśli potrzebujesz zsynchronizować akcje, to nic nie stoi na przeszkodzie zeby serwis który wysyłał request zablokował się aż nie sprawdzi powodzenia. Czyli wysłałeś request, dostajesz jakiś callback i jeśli jest dla ciebie ważne żeby nie "iść dalej" póki nie masz pewności że wszystko się powiodło, to czekasz na tym callbacku.
Trik polega na tym ze zawsze możesz zsynchronizować kod, ale jak masz kod synchroniczny to niewiele już można zrobić.
Shalom.isExpired()
powinno zwrócićtrue
gdy minie 4min 30s. W przypadku gdy nie ma race condition np. 4min 50s.isExpired()
zwrócitrue
więc pobieram nowy token i jest ok. W przypadku gdy jest race condition np. 4min 29.9999s.isExpired()
zwracafalse
token niby wygasa ale mam jeszcze 30s zapasu więc user może z niego korzystać..isExpired()
=true
i równolegle zaczną pobierać token oczywiście gdy nie masynchronized
?