Serwer dla sporej ilosci klientów

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?

0

A musi to być w Javie?

0

Tak :P

0

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

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ę.

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/

1

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

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