Wielowatkowe serwery

0

Witam.
Jakieś pół roku temu napisałem dla zabawy chat clienci-serwer. Za każdym razem kiedy klient sie podlaczyl tworzylem nowy wątek po stronie serwera który obsługiwał clienta. Chciałem teraz napisać jeszcze raz czat z możliwością wysyłania plików ale lepszy i nie na "lapi capu". I teraz pytanie jak najlepiej było by teraz to zrobić chciałbym żeby to było efektywne i klarownie napisane. Myślałem żeby wykorzystywac nio aby nie musieć tworzyć wątków ale przeczytałem gdzieś na overflow ze ze względu na to że systemy są przygotowane na wielowatkowe zadania zastanawiam sie czy nie wykorzystać ExecutorSerwice. Co o tym myślicie?

0

Wszystko zależy od tego co tam sie ma dziać. Wielowątkowość ma sens jeśli wykonujesz jakieś operacje CPU-heavy, np. liczysz coś trudnego w tle. Odpalanie nowego wątku który pali cykle w jakimś while(true) żeby obsługiwać odbieranie/wysyłanie wiadomości to trochę słabę rozwiązanie i zupełnie się nie skaluje. Jak się podłączy kilka tysięcy osób to ci zabije ten serwer bo więcej czasu zejdzie na context switch niz na dzialanie programu.
W takiej sytuacji dużo lepiej obsługiwać wszystko w jednym/kilku wątkach które wyciągają sobie z jakiejś kolejki zadania do realizacji.

0
johnybrawo75 napisał(a):

przeczytałem gdzieś na overflow ze ze względu na to że systemy są przygotowane na wielowatkowe zadania zastanawiam sie czy nie wykorzystać ExecutorSerwice.

Taa, pod warunkiem, że nie będziesz musiał się zbytnio synchronizować. A liczba wątków będzie proporcjonalna do ilości CPU.

Shalom napisał(a):

Wszystko zależy od tego co tam sie ma dziać. Wielowątkowość ma sens jeśli wykonujesz jakieś operacje CPU-heavy, np. liczysz coś trudnego w tle. Odpalanie nowego wątku który pali cykle w jakimś while(true) żeby obsługiwać odbieranie/wysyłanie wiadomości to trochę słabę rozwiązanie i zupełnie się nie skaluje. Jak się podłączy kilka tysięcy osób to ci zabije ten serwer bo więcej czasu zejdzie na context switch niz na dzialanie programu.
W takiej sytuacji dużo lepiej obsługiwać wszystko w jednym/kilku wątkach które wyciągają sobie z jakiejś kolejki zadania do realizacji.

Dobrze mówi.

Jak to ma się skalować, to obawiam się, że bez selecta z nio się nie obejdzie. Chyba, że załatwi to za ciebie jakaś biblioteka. Jeden wątek mógłby akceptować połączenia i przy pomocy executora obsługiwać nowe zdarzenia odczytu/zapisu, używając puli wątków.
https://www.safaribooksonline.com/library/view/learning-java-4th/9781449372477/ch13s05.html

2

Jak to ma się skalować, to obawiam się, że bez selecta z nio się nie obejdzie. Chyba, że załatwi to za ciebie jakaś biblioteka. Jeden wątek mógłby akceptować połączenia i przy pomocy executora obsługiwać nowe zdarzenia odczytu/zapisu, używając puli wątków.
https://www.safaribooksonline.com/library/view/learning-java-4th/9781449372477/ch13s05.html

w netty (najlepszym frameworku do NIO ever) - zadanie jest wykonywane na wątku jego macierzystego selectora - i to działa bardzo dobrze, operacje wejścia wyjścia w javie również mogą być nie blokujące, co więcej, mogę nawet nie dosięgać user-spejsu (zero-copy).

Odnośnie wątku,
ja na początek przygody polecam te prezke

1 użytkowników online, w tym zalogowanych: 0, gości: 1