2015-03-02 10 views
9

Po przeczytaniu o złączu NIO Tomcat nadal nie otrzymuję jednej rzeczy: czy złącze nio jest korzystne, jeśli kod aplikacji jest blokowany, tzn. Blokuje czytanie z bazy danych, czytanie system plików podczas dzwonienia do zewnętrznych serwisów internetowych?Węzeł TomIO NIO z aplikacją blokującą

Na przykład masz interfejs API podobny do REST, który odbiera żądanie, odczytuje coś z bazy danych i zwraca odpowiedź. Nie korzysta z asletu 3, po prostu zapisuje do odpowiedzi.

Nie znalazłem pełnego opisu pul wątków używanych przez złącze NIO, ale wyobrażam sobie, że ma on pulę wątków do obsługi żądań, więc każde żądanie kończy się wątkiem, który może zablokować.

Jeśli tak, to czy korzyści z NIO nadal istnieją, czy kod blokujący zmniejsza korzyści płynące z NIO (pod względem wykorzystania zasobów)?

+0

powiązane http://techblog.bozho.net/why-non-blocking/ – Bozho

Odpowiedz

9

Czy złącze nio jest korzystne, gdy kod aplikacji blokuje ...?

Tak, złącze NIO jest zbudowany przy założeniu, że aplikacja będzie blokować gdzieś. Złącze NIO ma w zasadzie kilka gniazdowników gniazda i odpowiada na nowe przychodzące żądania, dopóki informacje nie zaczną być odczytywane.

Nie mogę znaleźć pełny opis basenów nici użytej przez złącze NIO

myślę, że to jest początek twojej zamieszania. Tomcat NIO ma pulę selektorów, a nie pulę wątków (reference). Kod złącza sonduje każdy selektor, aby sprawdzić, czy ma przychodzące lub wychodzące bajty do wysłania. W tym sensie selektor dla danego żądania będzie nadal otrzymywać informacje do czasu, aż będzie wystarczająca do przetworzenia żądania za pomocą obiektu Request/Response, który wypełnia lukę między synchronicznymi we/wy i asynchronicznymi operacjami We/Wy (reference).

Kod odpytywania nigdy nie blokuje dłużej niż czas potrzebny do serializacji pakietu informacji, więc może obsługiwać nowe żądania. Jedynym prawdziwym ograniczeniem jest ilość pamięci dostępnej dla Tomcat. Chociaż istnieje puli wątków, liczba używanych rzeczywistych wątków jest znacznie niższa niż liczba połączeń obsługiwanych przez aplikację (reference).

Chociaż występują różnice w wydajności między złączami Tomcat (reference), różnica w czasie rzeczywistym żądania/odpowiedzi jest dość mała, gdy sam serwlet blokuje. Jednak różnica w liczbie równoczesnych żądań obsługiwanych przez Tomcat jest znacznie inna, gdy korzystasz z nieblokujących operacji we/wy.

+3

Co się dzieje w tym przypadku z ThreadLocal? Jeśli zasymulowane jest gniazdo i ten sam wątek jest współużytkowany przez kilka żądań, może utworzyć niedopasowanie podczas używania ThreadLocal. Ale tak się nie dzieje. Jak Tomcat (i prawdopodobnie inne pojemniki) rozwiązuje ten problem? – AlexR

+0

Dzięki. Oprócz pytania na temat @AlexR - na stronie, którą połączyłeś, jest "maxThreads" - max wątki gdzie? Więc jest basen? – Bozho

+0

http://stackoverflow.com/questions/7925014/is-threadlocal-safe-to-use-with-tomcat-nio-connector – Bozho