Czym różni się wielowątkowość w aplikacji sieci Web opartej na Javie w porównaniu z autonomiczną aplikacją Java

13

Jestem całkiem nowy w Javie i moje doświadczenie jest ograniczone do aplikacji internetowych działających na kontenerze internetowym (w moim przypadku Jboss).

Czy mam rację twierdząc, że w przypadku aplikacji internetowych kontener internetowy zajmuje się wielowątkowością? Jeśli tak, to czy mogę wprowadzić nowe stopnie w aplikacjach internetowych? Czy ma to jakąś przewagę i w jakim scenariuszu trzeba to zrobić?

kapricanon
źródło
Do EE6 nie będziesz używać nici; EE7 wprowadza Concurrency Utilities.
Przywróć Monikę - M. Schröder

Odpowiedzi:

20

Czy mam rację twierdząc, że w przypadku aplikacji internetowych kontener internetowy zajmuje się wielowątkowością?

Większość serwerów WWW (Java i inne, w tym JBoss) stosuje model „jeden wątek na żądanie”, tzn. Każde żądanie HTTP jest w pełni przetwarzane przez dokładnie jeden wątek. Wątek ten często spędza większość czasu czekając na takie rzeczy, jak żądania DB. Kontener WWW utworzy w razie potrzeby nowe wątki.

Niektóre serwery (w ekosystemie Java, głównie Netty ) obsługują asynchroniczną obsługę żądań, albo z modelem „jeden wątek robi wszystko”, albo z czymś bardziej złożonym. Podstawową ideą jest to, że wiele oczekujących wątków marnuje zasoby, więc praca asynchroniczna może być bardziej wydajna.

Jeśli tak, to czy mogę wprowadzić nowe stopnie w aplikacjach internetowych?

Jest to możliwe, ale należy to robić bardzo ostrożnie, ponieważ błędy (takie jak wycieki pamięci lub brak synchronizacji) mogą powodować błędy, które są bardzo trudne do odtworzenia, lub doprowadzić do awarii całego serwera.

Czy ma to jakąś przewagę i w jakim scenariuszu trzeba to zrobić?

Zaletą jest to, że możesz robić rzeczy równolegle. Korzystanie z wątków do poprawy czystości obliczeniowej prędkości jest coś, co powinno nie robić na serwer, jak to spowolnić postępowanie z innych wniosków. Tego rodzaju czynności powinny być wykonywane na osobnym serwerze, prawdopodobnie przy użyciu kolejki zadań.

Uzasadnionym scenariuszem wielowątkowości w kontekście obsługi żądania HTTP może być sytuacja, gdy trzeba uzyskać dostęp do innych zasobów sieciowych, np. Wywołać kilka różnych usług internetowych. Jeśli zrobisz to w jednym czasie, musisz poczekać na zakończenie każdego połączenia. Ale jeśli używasz wielu wątków, całkowity czas oczekiwania jest tylko opóźnieniem pojedynczego najwolniejszego połączenia.

Michael Borgwardt
źródło
3
Ma sens. Czy interfejs ExecutorService jest najlepszym sposobem na tworzenie nowych wątków w aplikacji internetowej?
kapricanon
4
@kapricanon: tak, chyba że masz jakieś określone wymagania, których nie może obsłużyć, lub twój serwer WWW ma już coś podobnego.
Michael Borgwardt,
2

W odpowiedzi na twoje pytanie:

Czym różni się wielowątkowość w aplikacji sieci Web opartej na Javie w porównaniu z autonomiczną aplikacją Java

Nie jest inaczej. Zazwyczaj aplikacje internetowe, na których zbudowane są aplikacje, zapewniają już wiele wątków, czyniąc każde nowe żądanie wątkiem. Przez możesz używać / tworzyć wątki tak, jak każdą inną aplikację.

Rzeczywiście, wielowątkowość może dać drastyczny wzrost wydajności, jeśli użyjesz go właściwie. W przypadku intensywnych zadań we / wy, takich jak dostęp do sieci i dostęp do dysku, wzrost wydajności jest prawie zawsze gwarantowany. W przypadku zadań wymagających dużej mocy obliczeniowej należy przestrzegać zasady jednego wątku na rdzeń na serwerze. Na przykład, jeśli rdzeń ma procesor i7, powinieneś trzymać się 7 wątków, aby wykonywać zadania obliczeniowe.

W odpowiedzi na twoje pytanie:

Czy ma to jakąś przewagę i w jakim scenariuszu trzeba to zrobić?

Michael Borgwart mówi, że nie powinieneś tego robić, aby poprawić szybkość obliczeniową. Nie zgadzam się, ponieważ ten artykuł sugeruje, że wielowątkowość może pomóc w zapewnieniu szybkiego reagowania, gdy użytkownicy potrzebują zadania wymagającego dużej mocy obliczeniowej. W zwykłym języku angielskim użytkownicy nie będą musieli czekać tak długo, aby wykonać zadania wymagające dużej mocy obliczeniowej z wielowątkowością.

Jeśli zamierzasz często używać wątków, sugeruję użycie puli wątków. Zmniejszy to narzut związany z tworzeniem wątków.

Składnia Reguły
źródło
Jak to odpowiada na zadane pytanie?
komar
1
Odpowiedzi powinny mieć swoje zalety. Jeśli chcesz skomentować, najpierw musisz zdobyć 50 punktów reputacji.
ChrisF
1

Cóż, to miłe pytanie i myślę, że większość programistów pracujących nad tworzeniem aplikacji internetowych nie używa jawnie wielowątkowości. Powód jest dość oczywisty, ponieważ do wdrażania aplikacji używasz serwera aplikacji, serwer aplikacji wewnętrznie zarządza pulą wątków dla żądań przychodzących.

Dlaczego więc jawnie używać wielowątkowości? Czego twórca aplikacji internetowych naraża na wielowątkowość?

Podczas pracy nad aplikacją na dużą skalę, w której trzeba jednocześnie obsłużyć wiele żądań, trudno jest obsłużyć wszystkie żądania synchronicznie, ponieważ określone rodzaje żądań mogły przetwarzać dużo, co może obniżyć wydajność aplikacji.

Weźmy przykład, w którym aplikacja internetowa po spełnieniu określonego rodzaju żądania musi powiadamiać użytkowników za pośrednictwem wiadomości e-mail i SMS. Zrobienie tego synchronicznie z wątkiem żądania może obniżyć wydajność aplikacji internetowej. I tu pojawia się rola wielowątkowości. W takich przypadkach zaleca się opracowanie w sieci samodzielnej aplikacji wielowątkowej, która będzie odpowiedzialna za wysyłanie tylko wiadomości e-mail i SMS.

Anurag Sharma
źródło
dlaczego ta odpowiedź jest odrzucona?
Anurag Sharma