Serwer dla sporej ilosci klientów

Serwer dla sporej ilosci klientów
VO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

Jakie będzie lepsze podejście.
Tworzę serwer TCP na który będzie podpinać się kilka tysięcy klientów. Zadaniem serwera jest broadcastowanie danych miedzy klientami.

Podejścia:

  1. Wątek serwera tworzy wątek zbierający dane od klienta i wrzuca je do kolejki (tworzy osobny wątek per klient). Osobny wątek zbiera z kolejki dane do rozesłania i rozsyła je po klientach w liście (synchronicznie, jeden watek per serwer). (w tym podejściu minus taki że będzie raczej potrzebny potężny procesor do ogarnięcia tylu wątków bez większych opóźnień)
  2. Watek serwera akceptujący połączenie i wrzucający klienta do listy. Watek zbierający dane od klientów iterując po liście synchronicznie i wrzuca je na kolejkę. Watek do rozsyłania danych do klientów iterując po liście z klientami. (ryzyko zapchania bufora tcp przez nie odbieranie przez serwer na czas)

Który lepiej, może macie jakieś inne pomysły?

UglyMan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2206
0

A musi to być w Javie?

VO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

Tak :P

baant
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 524
0

Wątek per klient przy kilku tys rownoczesnie to nie bardzo

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
3

Polecam rozwiązanie nr 3) czyli Java NIO Selector. Możesz zguglać właśnie tę frazę "java nio selector" i dostaniesz przykłady jak tego użyć:
https://www.baeldung.com/java-nio-selector
http://tutorials.jenkov.com/java-nio/selectors.html
https://www.javatpoint.com/java-nio-selector
https://www.tutorialspoint.com/java_nio/java_nio_selector.htm

Selektor sam ogarnia które połączenia są gotowe i dzięki temu nie musisz sam tego sprawdzać przez iterowanie w kółko po wszystkich połączeniach.

PS:
Java NIO Selector to oczywiście niskopoziomowe rozwiązanie podobnie jak pozostałe dwa zaproponowane w początkowym poście. Nie znam się na Javowych bibliotekach wyższego poziomu (jestem Scalowcem od dobrych paru lat), więc takiej nie zasugeruję.

PK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
1

A musi to być plain java ? weź sobie https://vertx.io/docs/vertx-core/java/#_writing_tcp_servers_and_clients - napisz handler, wrzuć socket to tablicy i już :) ew https://github.com/netty/netty , w pakiecie examples jest zaimplementowany czat który ma trochę logiki podobnej do tej którą sam chcesz napisać https://github.com/netty/netty/blob/4.1/example/src/main/java/io/netty/example/securechat/SecureChatServerHandler.java .

Jeżeli chcesz plain java ( chociażby po to żeby się pouczyć podstaw), to oczywiście tak jak pisał @Wibowit, nio - ja bardzo lubie ten tutorial http://rox-xmlrpc.sourceforge.net/niotut/

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1909
1

Poczytaj o Netty, ponieważ model thread-per-request ma swoje ograniczenia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.