Hej, piszę swój pierwszy czysto funkcyjny serwer w Webfluxie. Obejrzałem kilka prezek i githubów, ale chcę rozwiać wszelkie wątpliwości.
- Jeśli nic nie skonfiguruję to domyślnie Netty będzie obsługiwał żądania na 1 wątku ? Dobrą praktyką jest ustawić tyle wątków ile obsługuje procesor czy są inne podejścia ?
WebFlux sam z siebie jest nakładką na SpringBoota - jak masz pod spodem Tomcata, to zależy on od konfiguracji Tomcata. Jak masz pod spodem Reactora, to zależy on od Reactora. Reactora ma trochę inny model pracy niż tradycyjne serwery aplikacji - zamiast iluś tam wątków tworzy sobie pod spodem tzw. Worker Thready, do których trafiają zadania (coś trochę jak system agencki). Jest ich chyba tyle, co procków z defaultu.
Są jakieś wrażliwe miejsca, w których muszę pamiętać, że żądania współdzielą wątek i martwić się o race conditions itd ?
Race conditions będzie raczej problemem gdy wskoczysz do swojego kodu, tj. jeśli napiszesz architekturę tak, że będziesz miał wspólne zasoby nie będące thread-safe. Tzn. wszelkiego rodzaju mutowalne static'i oraz repozytoria typu baza danych itp. Tych pierwszych unikaj, te drugie należy dodatkowo zabezpieczać.
Pytam o przykre doświadczenia ludzi, którzy więcej tak pisali. Generalnie czy takie rozwiązanie z nieblokującą architekturą jest słuszne produkcyjnie ?
IMO tak, tzn. nigdzie jeszcze nie spotkałem się z większymi problemami z tym. Spotkałem się za to z problemami przy np. Weblogic'u, przy dosyć niskich liczbach użytkowników. Jeśli nie planujesz robić naprawdę dużego serwisu to konfiguracja domyślna powinna ogarnąć temat, jeśli chodzi o większy serwis to widzę pewien problem o którym wspomniałem dalej.
- Autoryzacja robione przez high order function. Z tego co zrozumiałem zamysł jest taki, że user loguje się, z bazki userów jest on wyciągany po loginie i sprawdzane jest czy zahashowane hasło różni się z tym jego i jeśli tak to generowany jest JWT, który również gdzieś zapisujemy do in memory ConcurrentHashMapy jako klucz i wartość czyli dane sesji (id usera, wygaśnięcie). Security high order function wygląda tak, że z z headera jest token wyciągany, sprawdzane jest czy sesja w tej concurrent hash mapie istnieje i ewentualne sprawdzenie czy nie wygasła ? Czy to jest też produkcyjnie ok?
Pytanie, co zamierzasz z tym zrobić. Bo np. jeśli ta HashMapa będzie zbyt duża to skończy ci się pamięć, dodatkowo takie rozwiązanie jest raczej słabo skalowalne (zakładasz istnienie jednej instancji - bo przy dwóch musisz jakoś te tokeny synchronizować).