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ć?
java
web-applications
multithreading
kapricanon
źródło
źródło
Concurrency Utilities
.Odpowiedzi:
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.
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.
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.
źródło
W odpowiedzi na twoje pytanie:
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:
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.
źródło
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.
źródło