Multithreaded oder nonblocking NIO Server?


SIDEX

Grünschnabel
Hallo leute :)

bin zwar seit graumer Zeit hier angemeldet aber ich glaube ich schreibe hier gerade zum ersten mal.

Also ich will ein Multiclient-Server schreiben. Es soll möglich sein, dass mehrere Benutzer mehrere Clienten verwalten. Also typisches Beispiel benutzer A und Benutzer B laden laden zwei unterschiedliche Dateien für ein und den selben Clienten und der Server leitet sie dann an den Clienten weiter.

Nun ich hab zwar schon einen kleinen Multithreaded Echoserver geschrieben, aber nun stellt sich die Frage ob multithreaded die richtige Lösung ist. Es kann sein dass später mehrere hundert Benutzer mehrere hundert Clienten verwalten. Und die Daten fließen in beide richtungen. Also sollte es schon ziemlich zügig gehen. Und da hab ich an NIO gedacht.

Ich habe schon einige Berichte gelesen und Benchmarks gesehen, aber da gehen die Meinungen auseinander. Einerseits soll NIO einen schnelleren Durchsatz haben und in einem Thread arbeiten auf der anderen Seite befinden wir uns in der Zeit der Mehrkernprozessoren und das Umschalten zwischen den Threads ist ja kein großes Problem mehr :D Laut einigen Artikeln sollte man den Versuch, NIO durch mehrere Threads zu optimieren, einfach unterlassen, weil es nur Kopfschmerzen bedeutet. D.h. unsere tolle Zeit würde da nix bringen ^^ Multithreaded soll auch einfach zu programmieren sein und das gefühl habe ich auch :D Das Ganze soll auch nach möglichkeit sicher sein also sollte SSL auch möglich sein. Und so wie ich gesehen habe ist SSL unter NIO umständlich ^^ und und und... wie gesagt die Meinungen gehen auseinander und die Benchmarks zeigen auch mal dies und mal das.

Also nun meine Frage: Was meint ihr dazu? Was empfielt ihr mir? NIO oder Threaded? Hat vielleicht jemand schon Erfahrungen mit beidem gemacht?

Danke im Voraus. Bin gespannt auf eure Meinungen.

gruss,
sidex
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

ich halte eine Kombination aus beidem für Sinnvoll.
Wenn du ein mehr Prozessor-System hast kannst du beispielsweise pro Prozessor einen Thread (+ X) hochziehen der mit Java NIO Non blocking Sockets entsprechend viele Clients bedient. Dabei ist dann 1 Thread für 100 / 1000 User zuständig.

Für solche Szenarien bietet sich auch das Reactor Pattern an (wenn du das unbedingt selber bauen musst / willst):
http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
http://www.cs.uu.nl/docs/vakken/no/reactor.pdf


Ansonsten schau dir doch mal Grizzly an:
https://grizzly.dev.java.net/
Auf dieser Basis lassen sich auch "relativ" einfach eigene "Protokolle" integrieren.

Gruß Tom
 

SIDEX

Grünschnabel
hi danke für die antwort. ich glaube ich werde mir grizzly anschauen. die seite geht nur momentan nicht...

aber bringt denn NIO wirklich einen erheblichen vorteil? wenn ja wieso?
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

die Grizzly Seite scheint jetzt wieder zu funktionieren.
Alternative zu Grizzly wäre Apache MINA:
http://mina.apache.org/

Hier noch ein paar Weitere Präsentationen zum Thema:
https://grizzly.dev.java.net/presentations/FISL-2007.pdf
http://weblogs.java.net/blog/jfarcand/archive/20071114_RIA_Comet_Derby.pdf
http://developers.sun.com/learning/javaoneonline/2007/pdf/TS-2992.pdf

Mit NIO kann man besser Performance und bessere Skalierbarkeit erreichen, aber nicht per se nur durch dessen Verwendung. Vielmehr muss man NIO auch "richtig" einsetzen und das lernt man nicht von heute auf morgen.

Wenn man mit NIO arbeitet kann man mit einem Thread gleich eine Vielzahl von Clients bedienen. Das spart Speicher und skaliert besser im Gegensatz zum traditionellen Ansatz bei dem jeder Client auf der Serverseite seinen eigenen Thread hat, der die meißte Zeit nur im wating... Status verbringt.

Gruß Tom