Kleiner Chatserver: Threads oder Multiplex?

Status
Nicht offen für weitere Antworten.
T

Tamara

Gast
Hi :D

Ich soll einen kleinen Chatserver schreiben, maximale Teilnehmerzahl 150 Leute. Ist das noch sinnvoll mit Threads zu lösen (da kenne ich mich aus) oder muß da schon Multiplex her (da kenne ich mich noch nicht aus :wink: ).

Danke für alle Antworten
Tamara
 

Dante

Bekanntes Mitglied
Multiplex kenne ich so auch nicht, aber ich denke mal ermeint das er eine Nachricht an mehrere Clients schicken will?

Problem ist ja das man für eingehenden Verkehr vom Client eh einen Socket braucht, damit wäre es warscheinlich sinniger das dann auch gleich über den Socket zu machen... Da 150 gleichzeitige Verbindungen Threads eh vorraussetzen ist die Antwort eigentlich klar :)
 
T

Tamara

Gast
Dante hat gesagt.:
Multiplex kenne ich so auch nicht, aber ich denke mal ermeint das er eine Nachricht an mehrere Clients schicken will?

Genau. :)

Und beide Lösungen laufen über Sockets. Bei Multiplex sind die Verbindungen aber nicht-blockierend und werden allesamt aus einem Thread bedient, in dem ein Selektor zwischen den einzelnen Kanälen hin- und herschaltet.
Daß 150 Verbindungen über Threads laufen können, weiß ich auch. Meine Frage geht dahin, ob das auch effizient ist?
 

Grizzly

Top Contributor
Tamara hat gesagt.:
[...]Bei Multiplex sind die Verbindungen aber nicht-blockierend und werden allesamt aus einem Thread bedient, in dem ein Selektor zwischen den einzelnen Kanälen hin- und herschaltet.[...]
Habe ich jetzt zwar nicht verstanden, aber wahrscheinlich meinst Du damit einen Broadcast über UDP. Wenn alle Chat-Clients immer online sind und sich noch im selben Netz befinden, ist das sicher das einfachste. Ansonsten sind mehrere Threads mit mehreren Verbindungen besser.
 

Dante

Bekanntes Mitglied
nein, warscheinlich läuft das so, das ein thread ne referenz auf alle x verbindungen hat und die dann nacheinander bedient.

Ist sicher keine so dumme Idee, wenn sich denn der Verwaltungsaufwand (also welcher socket bekommt die nachricht und welcher nicht) lohnt.
 

Freddy

Mitglied
Überall, wo ich etwas über java.nio (eben dieses Gemultiplexe) lese, wird empfohlen, dies anstelle von Threads zu benutzen, da pro Thread mindestens 700KB RAM belegt werden. Ebenfalls entfällt der Aufwand der Synchronisierung. Allerdings hat man das Problem, dass die Requests hintereinander, und nicht (praktisch) parallel bearbeitet werden, was zur Folge hat, dass der Server bei längeren Rechenarbeiten (z.B. eine Schleife mit vielen Iterationen) oder auch Datenbankzugriffen komplett hängt. Diese Aktionen müsste dann wiederum doch in Threads (+ Synchronisierung) auslagern und sich ein eigenes Scheduling-API schreiben, das den Weg der Daten Client -> ServerThread -> ExternerThread und umgekehrt (Stichwort Producer/Consumer) steuert.
NIO einzusetzen ist also etwas komplex, und wenn genug RAM zur Verfügung steht bzw. die Anwendung sowieso keine hohen Lasten aushalten muss, kann man ruhig auf Threads zurückgreifen und sich Arbeit sparen. 150 Chatter sind nicht viel, sagen wir, ein Chatter postet durchschnittlich alle 7 Sekunden etwas, das wären dann 21 Anfragen pro Sekunde, 21 * 900KB (Thread + Objekte) sind 19 MB Speicher, ich denke, damit sollte man gut hinkommen.
 

Grizzly

Top Contributor
Freddy hat gesagt.:
[...]150 Chatter sind nicht viel, sagen wir, ein Chatter postet durchschnittlich alle 7 Sekunden etwas, das wären dann 21 Anfragen pro Sekunde, 21 * 900KB (Thread + Objekte) sind 19 MB Speicher, ich denke, damit sollte man gut hinkommen.

Ein Thread also pro Nachricht? Ist es nicht sinnvoller ein Thread pro Client zu starten, der dann die Verbindung versorgt (Daten vom Client empfangen und an das Innenleben weiterreichen, Daten aus dem Innenleben bekommen und an den Client senden; beides vielleicht mit eine Queue?) ?
 

meez

Top Contributor
Ich würd schon eine Art Multiplex nehmen....
Am besten stellst du alle requests in eine Queue, und arbeitest diese Queue mit z.B.: 5 Worker Threads ab...
 

Freddy

Mitglied
Grizzly hat gesagt.:
Ein Thread also pro Nachricht? Ist es nicht sinnvoller ein Thread pro Client zu starten, der dann die Verbindung versorgt (Daten vom Client empfangen und an das Innenleben weiterreichen, Daten aus dem Innenleben bekommen und an den Client senden; beides vielleicht mit eine Queue?) ?

Dann wird der meiste Speicher von wartenden Threads verbraucht, also 150 Threads. Wenn man einen Threadpool nimmt, und jeden Request an einen der Threads abgibt, dann kommt man vielleicht mit 30 Threads aus (jedenfalls bei einem Webchat).
 

Isaac

Bekanntes Mitglied
Auf jedenfall Zeitmultiplex. Mit Threads machst du dich unglücklich und es ist auch mit Kannonen auf Spatzen geschossen.

Natürlich braucht man trotzdem ein paar Threads damit nix hängt aber um die Clients zu bediehnen reichen ein paar Threads die sich alle angemeldeten Clients teilen und die dann per Queue abarbeiten.
 

Isaac

Bekanntes Mitglied
Weil mit jedem Thread der Verwaltungsaufwand steigt. Welche Threads laufen noch, welche müssen beendet werden, welche Threads haben einen Timeout durch die URL Verbindung. Sicher kann man das so lösen aber einen eigenen Thread für jede Verbindung zum Client ist wie eine eigene Klasse für jeden Button in deiner Applikation.

Wenn du die Verwaltung sauber programmierst wirst du auch nicht unglücklich da dann alles von alleine flutscht. Aber 2 oder 3 Threads die die Queue abarbeiten sind wesentlich leichter zu überschauen und zu debuggen als 150 Threads von denen vieleicht 3 oder 4 aus der Reihe tanzen, wieso auch immer.
 

meez

Top Contributor
Freddy hat gesagt.:
Nun, ich habe einen Webchat programmiert, wo jedem Client on demand ein Thread zugewiesen wird (d.h. wenn z.B. Text gesendet werden soll). Im Leerlauf läuft hingegen nur ein Thread, und ich komme mit der Verwaltung recht gut zurecht.

Was machst du, wenn du gleichzeitige 100'000 Teilnehmer hast...Dann läuft da überhaupt nichts mehr...
Es ist nicht das Problem, das es techisch nicht geht, sondern es sollte immer möglichst die perfomanteste, sauberste und skalierbarste Lösung angestrebt werden....
 
N

Niki

Gast
hallo alle zusammen, ich hab zwar nur die antworten bisserl überflogen, aber wie wärs wenn du einen eigenen JMS-Server aufsetzt, und dem zum notifizieren auf alle Clients verwendest, da gibts auch sicher irgendwelche vorgeschriebenen free-JMS-Server. die Clients müssten dann nur mehr die nachrichten an den JMS senden, und der könnte das publishen (ich hoffe ich rede da keinen schwachsinn :) )
 
D

Daydreamer

Gast
hallo leute, ich suche 1 oder 2 leute die mit mir zusammen ein chat machen wollen.
hab schon so meine vorstellungen.. bräuchte aber jemand der sich etwas mit java auskennt.. und noch etwas mit php..
wenn jemand da ist und interesse hat der kann sich bei mir melden undter necro200@yahoo.de
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T kleiner DatenServer! Netzwerkprogrammierung 5
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
Messoras Socket Chatserver mit mehreren OutputStreams Netzwerkprogrammierung 2
I ChatServer Netzwerkprogrammierung 9
J Socket Chatserver aus dem Internet nicht erreichbar Netzwerkprogrammierung 19
J Implementation Chatserver Netzwerkprogrammierung 4
L Probleme bei Chatserver Netzwerkprogrammierung 6
A ChatServer Grafisch aufbauen Netzwerkprogrammierung 4
T TCP mit und ohne Threads Netzwerkprogrammierung 1
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
C Frage zu Threads & Server Netzwerkprogrammierung 4
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
J Threads & Streams Netzwerkprogrammierung 9
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S HTTP ServerSockets und Threads Netzwerkprogrammierung 5
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
R Threads mit einem WebService Netzwerkprogrammierung 4
M Verständnisfrage zu RMI und Threads Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
A Threads auflisten und nacheinander ansprechen Netzwerkprogrammierung 6
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
P Threads einbinden Netzwerkprogrammierung 11
P RMI Callback (mit Threads?) Netzwerkprogrammierung 3
T RMI Threads und Synchronized Netzwerkprogrammierung 13
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
S Threads beim Server koordinieren Netzwerkprogrammierung 5
L ClientServer mit 2 Threads Netzwerkprogrammierung 5
N Threads und Socketprogrammierung Netzwerkprogrammierung 4
G 1 Socket 2 Threads problem Netzwerkprogrammierung 13
K Problem mit Threads Netzwerkprogrammierung 3
S Threads bei Web Service sinnvoll oder Alternative? Netzwerkprogrammierung 2
K Hintergrund - Threads Netzwerkprogrammierung 3
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
L UDP-Server mit Threads Netzwerkprogrammierung 8
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
C Join von Threads bei I/O-Operation Netzwerkprogrammierung 6
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben