Wpis z mikrobloga

@Philopolemus_Fronius: Osobiście jestem Javoscalowcem, więc funkcyjnie piszę ( ͡° ͜ʖ ͡°)

Masz jakiś fajny paper, artykuł czy coś na ten wykres? :) Czy to własne badanie? Chciałbym podzielić się z zespołem ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@Philopolemus_Fronius: jak zwykle - zależy. Jeśli bottleneckiem jest czas mielenia to jedyne co ci da programowanie reaktywne to możliwość szybkiego walnięcia 503 bez czekania na naturalny timeout z uwagi na brak workerów - ot zrobisz to samo co zrobi co pod spodem klasyczny serwer typu Tomcat tylko manualnie. Jeśli bottleneckiem jest I/O to jest to fajniejsze bo przy użyciu NIO jesteś w stanie kilkoma wątkami opędzić mnóstwo klientów (tak jak
  • Odpowiedz
@cxnmlhuipwetr: W artykule, który podlinkowałem masz wszystko napisane ;)

No ogólnie bottleneckiem jest zazwyczaj I/O, no chyba, że masz serwis, który wykonuje bardzo pracochłonne obliczenia, chociaż wtedy też raczej lepszym rozwiązaniem byłoby ogarnięcie requestów asynchronicznie a wymagająca zadanie puścić na workerze jakimś, który spokojnie to zrobi. Chociażby jak na youtubie, jak wgrasz film to nie musisz czekać z używaniem serwisu aż się przekonwertuje tylko tam sobie leci gdzieś
  • Odpowiedz
@Philopolemus_Fronius: niby fajnie, ale nie do wszystkich zastosowań webFlux jest tak dobrym rozwiązaniem, tak samo jak mikroserwisy i nosql. Serce mnie boli jak patrzę na wykresy, ale cytując Bieńkowską- sorry, taką mamy architekturę ( ͡° ʖ̯ ͡°)
  • Odpowiedz
@Philopolemus_Fronius: Przy większości web appek w springu i tak masz repozytoria oparte na JDBC które się blokuje więc trzeba to opakowywać w ThreadPool żeby zrobić z tego wersję "asynchroniczną". Jak ThreadPool się zapcha to kończy się wzrost wydajności.
  • Odpowiedz
@Philopolemus_Fronius: Na jakiej zasadzie działają asynchroniczne repozytoria? Jeśli masz jakąś transakcję, to po pierwszym zapytaniu do db inni klienci nie mogą korzystać z tego samego połączenia do db, bo wszystkie kolejne zapytania w tym połączeniu będą w tej samej transakcji aż do commita. Jeśli więc masz K połączeń w db pool i N klientów, to N – K klientów i tak musi czekać, żeby dostać wolne połączenie.
  • Odpowiedz
@patste: meh, chodzi o to ze jak robisz zapis do bazy to nie czekasz tylko przetwarzasz reszte requestow. W klasycznym przypadku robisz zapis do bazy, czekasz ileś tam milisekund aż się zapisze i dopiero zaczynasz przetwarzać reszte requestow. Chodzi o blokowalne i nieblokowalne i/o a jak to jest zrobione to nie wiem, to jest zaimplementowane na poziomie bazy i systemu operacyjnego
  • Odpowiedz
@Philopolemus_Fronius: podejrzewam, że jeśli nie każdy request musi się łączyć z db, to ma to sens, bo te requesty nie będą musiały czekać. W sumie thread/req daje to samo bez konieczności używania nonblocking io
  • Odpowiedz
@Philopolemus_Fronius: Twój wykres mierzy dużo więcej rzeczy niż tylko async io vs thread/req. async io nie zawsze jest szybsze, bo zazwyczaj wymaga więcej pracy, i.e. musisz dodać socket do epoll/kqueue, dodatkowy kod w reactorze musi zostać wykonany etc.
Kilka miesięcy temu bawiłem się w async io i zrobiłem kilka benchmarków. echo server przy 20k równoczesnych połączeniach: 419k req/s używając boost.asio i 389k req/s używając thread/conn ;)
Zobacz też to:
https://medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c
  • Odpowiedz