8 Stimmen

Bestes Modell für eine NIO-Implementierung?

Ich bin dabei, unseren Java-Code in Verwendung von NIO umzuwandeln, aber ich bin mir nicht sicher, wie ich es am besten gestalten soll.

Mein erster Ansatz war es, einen Pool von Selektorthreads zu erstellen. Die Threads werden bei Bedarf gestartet/beendet, und Kanäle werden in einer Round-Robin-Reihenfolge einem Selektorthread zugewiesen, wenn sie verbunden/akzeptiert werden. Von dort aus blockiert jeder Thread bei select(), und wenn er geweckt wird, wird der entsprechende Callback für jeden Kanal ausgeführt, der einen ausgewählten Schlüssel hat.

Zusätzlich zu diesem Design mit "mehreren Selektorthreads" habe ich auch gesehen, dass man vorschlägt, einen einzelnen Selektorthread und einen Pool von Dispatch-Threads zu verwenden. Wenn ein IO-Vorgang bereit ist, ausgeführt zu werden, benachrichtigt der Selektor einen Dispatcher-Thread, der dann die Anfrage verarbeitet. Dieses Modell hat den Vorteil, dass der IO-Thread nicht blockiert wird, aber nun zwingen wir alle IOs in einen einzigen Thread und müssen mit Synchronisierung/einer Ereignisschlange im Dispatcher umgehen.

Zusätzlich könnte ich auch kein einzelnes direktes Byten-Buffer für das Lesen jedes Kanals verwenden und es direkt an den Callback übergeben. Stattdessen müsste ich die Daten jedes Mal, wenn ein Lesevorgang erfolgt, in ein Array kopieren und zurücksetzen. (Glaube ich..)

Was ist der beste Weg, um dies zu implementieren?

5voto

pjp Punkte 16064

Werfen Sie einen Blick auf das Reaktormuster

http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

Wie Sie Ihre Selektoren arbeiten lassen möchten, hängt wirklich von Ihrem Anwendungsfall ab. (Anzahl der Verbindungen, Nachrichtengröße, etc.)

Welches Problem versuchen Sie zu lösen, indem Sie von IO zu NIO konvertieren?

0 Stimmen

Leistung und Skalierbarkeit. Viele weniger Threads, und es sollte unser Design vereinfachen.

0 Stimmen

Das Reactor-Pattern ist eine sehr gute Wahl. Es gibt einige Implementierungen dieses Designs, die mehrere Threads für die Behandlung der I/O-Ereignisse verwenden. Diese Designs sind schlecht und widersprechen dem Zweck einer nicht blockierenden asynchronen I/O. Wenn Sie ein Design für leistungsstarke und skalierbare Server schreiben möchten, sollten Sie asynchrone I/O-Aufrufe verwenden und alles auf einem Thread - dem Selector-Thread halten.

3voto

ZZ Coder Punkte 72742

Sie sollten sich wirklich Mina ansehen,

http://mina.apache.org/

Es löst alle Probleme, die Sie erwähnt haben.

1 Stimmen

Ja, obwohl es eine gute Idee ist, zu versuchen zu verstehen, was unter der Oberfläche passiert.

1 Stimmen

Das ist genau das, was ich getan habe. Ich habe Mina nicht wirklich in meinem Projekt verwendet, aber ich habe viel daraus gelernt, indem ich ihre Implementierung gelesen habe.

1voto

Norman Maurer Punkte 22487

Schauen Sie sich auch netty an, das wirklich schnell und funktionsreich ist und auch in großen Systemen und von großen Unternehmen wie Redhat (jboss), Twitter, Facebook verwendet wird... .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X