Netty gegen Apache MINA

144

Beide bieten ungefähr die gleiche Funktionalität. Welchen sollte ich wählen, um meinen Hochleistungs-TCP-Server zu entwickeln? Was sind die Vor- und Nachteile?

Referenzlinks:

Apache MINA ( Quelle )

Netty ( Quelle )

GabiMe
quelle
6
Es wäre auch interessant, Grizzly zum Vergleich hinzuzufügen.
Mark
Grizzly ist ein ganz anderes Tier. Es gab sogar die Idee, MINA von Grizzly zu unterstützen, als beide Gruppen miteinander sprachen.
Hardcoded
1
@Hardcoded du sagst, Grizzly ist ein ganz anderes Biest, ich bin ein Neuling in diesem Bereich. Kannst du bitte auf die Unterschiede hinweisen oder mir einen Artikel zum Lesen geben? Ich würde es wirklich schätzen.
arg20
1
Grizzly hat einen anderen Hintergrund und als ich es das letzte Mal betrachtete, war es hauptsächlich für HTTP-basierte Anwendungen geeignet. Ich habe mir nur die Beispiele angesehen und war überrascht zu sehen, dass sie eine sehr ähnliche Struktur wie bei MINA oder Netty verwenden. Das Biest ist also nicht mehr so ​​anders
Hardcoded

Antworten:

211

Während MINA und Netty ähnliche Ambitionen haben, sind sie in der Praxis sehr unterschiedlich und Sie sollten Ihre Wahl sorgfältig überlegen. Wir hatten Glück, dass wir viel Erfahrung mit MINA hatten und die Zeit hatten, mit Netty herumzuspielen. Besonders gut hat uns die Cleaner-API und die viel bessere Dokumentation gefallen. Auch auf dem Papier schien die Leistung besser zu sein. Noch wichtiger war, dass wir wussten, dass Trustin Lee zur Verfügung stehen würde, um alle Fragen zu beantworten, die wir hatten, und das tat er auf jeden Fall.

In Netty fanden wir alles einfacher. Zeitraum. Während wir versuchten, die gleiche Funktionalität, die wir bereits auf MINA hatten, erneut zu implementieren, haben wir dies von Grund auf neu gemacht. Durch Befolgen der hervorragenden Dokumentation und Beispiele haben wir mehr Funktionalität in viel, viel weniger Code erhalten.

Die Netty Pipeline hat bei uns besser funktioniert. Es ist irgendwie einfacher als MINAs, bei denen alles ein Handler ist und es an Ihnen liegt, zu entscheiden, ob Sie Upstream-Ereignisse, Downstream-Ereignisse oder beides verarbeiten oder mehr Low-Level-Material verbrauchen. Das Verschlingen von Bytes beim "Wiedergeben" von Decodern war fast ein Vergnügen. Es war auch sehr schön, die Pipeline so einfach im laufenden Betrieb neu konfigurieren zu können.

Aber die Hauptattraktion von Netty, imho, ist die Fähigkeit, Pipeline-Handler mit einer "Abdeckung von eins" zu erstellen. Sie haben wahrscheinlich bereits in der Dokumentation über diese Abdeckungsanmerkung gelesen, aber im Wesentlichen erhalten Sie den Status in einer einzigen Codezeile. Ohne herumspielen, ohne Sitzungszuordnungen, Synchronisation und ähnliches konnten wir einfach reguläre Variablen (z. B. "Benutzername") deklarieren und verwenden.

Aber dann haben wir eine Straßensperre getroffen. Wir hatten bereits einen Multiprotokollserver unter MINA, auf dem unser Anwendungsprotokoll über TCP / IP, HTTP und UDP lief. Als wir zu Netty wechselten, fügten wir der Liste innerhalb weniger Minuten SSL und HTTPS hinzu! So weit so gut, aber als es um UDP ging, stellten wir fest, dass wir ausgerutscht waren. MINA war sehr nett zu uns, da wir UDP als "verbundenes" Protokoll behandeln konnten. Unter Netty gibt es keine solche Abstraktion. UDP ist verbindungslos und Netty behandelt es als solches. Netty enthüllt mehr von der verbindungslosen Natur von UDP auf einer niedrigeren Ebene als MINA. Es gibt Dinge, die Sie mit UDP unter Netty tun können, als mit der übergeordneten Abstraktion, die MINA bereitstellt, auf die wir uns verlassen haben.

Es ist nicht so einfach, einen "verbundenen UDP" -Wrapper oder so etwas hinzuzufügen. Angesichts der Zeitbeschränkungen und auf Empfehlung von Trustin, dass der beste Weg, um fortzufahren, darin bestand, unseren eigenen Transportanbieter in Netty zu implementieren, was nicht schnell gehen würde, mussten wir Netty am Ende verlassen.

Schauen Sie sich also die Unterschiede genau an und kommen Sie schnell zu einem Punkt, an dem Sie testen können, ob knifflige Funktionen wie erwartet funktionieren. Wenn Sie zufrieden sind, dass Netty den Job machen wird, würde ich jederzeit über MINA gehen. Wenn Sie von MINA zu Netty wechseln, gilt das Gleiche, aber es ist erwähnenswert, dass sich die beiden APIs wirklich erheblich unterscheiden und Sie eine virtuelle Neufassung für Netty in Betracht ziehen sollten - Sie werden es nicht bereuen!

Josh
quelle
3
Betreff: früherer Kommentar von Josh zum Mangel an Unterstützung für UDP in Netty: Ich verstehe nicht, warum Sie nicht ein paar Seiten handgefertigten Codes verwenden konnten, um das zu tun, was Sie brauchen, anstatt Netty aufzugeben. UDP überwacht sowieso einen anderen Port. Ich habe Netty gegen Nginx getestet und bin ziemlich beeindruckt (Netty punktet unter Last ungefähr gleich oder besser).
137

MINA bietet mehr sofort einsatzbereite Funktionen auf Kosten der Komplexität und der relativ schlechten Leistung. Einige dieser Funktionen wurden zu fest in den Kern integriert, um entfernt zu werden, selbst wenn sie von einem Benutzer nicht benötigt werden. In Netty habe ich versucht, solche Designprobleme zu lösen und dabei die bekannten Stärken von MINA beizubehalten.

Derzeit sind die meisten in MINA verfügbaren Funktionen auch in Netty verfügbar. Meiner Meinung nach verfügt Netty über eine sauberere und besser dokumentierte API, da Netty das Ergebnis des Versuchs ist, MINA von Grund auf neu zu erstellen und die bekannten Probleme zu beheben. Wenn Sie feststellen, dass eine wesentliche Funktion fehlt, können Sie Ihren Vorschlag gerne im Forum veröffentlichen. Ich würde mich freuen, auf Ihr Anliegen einzugehen.

Es ist auch wichtig zu beachten, dass Netty einen schnelleren Entwicklungszyklus hat. Überprüfen Sie einfach das Veröffentlichungsdatum der letzten Versionen. Sie sollten auch berücksichtigen, dass das MINA-Team eine umfassende Neufassung durchführen wird, MINA 3, was bedeutet, dass die API-Kompatibilität vollständig beeinträchtigt wird.

Vertrauen in
quelle
21
Oh, @trustin ist der Autor von MINA und Netty.
Jason Heo
@trustin, ich fand, dass Netty 5.0 nicht viel fortgeschrittene Dokumente bietet und aktuelles Webmaterial mit einer anderen Version nicht funktionieren würde. Haben Sie einen empfohlenen Link für ein mittleres und fortgeschrittenes Mina-Tutorial? danke
Korben
22

Ich habe 2 "Google Protobuffer RPC" -Implementierungen getestet, bei denen eine auf Netty (netty-protobuf-rpc) und die andere auf mina (protobuf-mina-rpc) basierte. Netty war bei allen Nachrichtengrößen durchweg schneller (+ - 10%) - was den allgemeinen Leistungsanspruch auf der Netty-Website bestätigt. Da Sie bei der Verwendung einer solchen RPC-Bibliothek jede Menge Effizienz aus Ihrem Code herausholen möchten , habe ich schließlich protobuf-rpc-pro basierend auf Netty geschrieben. Ich habe in der Vergangenheit MINA verwendet, finde aber, dass die Dokumentation des 2.0-Materials große Lücken aufweist und das Aufbrechen der API-Abwärtskompatibilität ein großes Minus darstellt.

pjklauser
quelle
16

MINA und Netty wurden ursprünglich vom selben Autor entworfen und gebaut. Deshalb sind sie einander so ähnlich. MINA ist auf einer etwas höheren Ebene mit etwas mehr Funktionen konzipiert, während Netty etwas schneller ist. Ich denke, dass es überhaupt keinen großen Unterschied gibt, die Grundkonzepte sind die gleichen.

Hardcodiert
quelle
9

In Netty Seite können Sie einige Performance finden Berichte . Wie erwartet :-) Sie weisen auf Netty als das Framework mit der besten Leistung hin.

Ich habe Netty nie verwendet, aber ich habe MINA bereits verwendet, um ein TCP-Protokoll zu implementieren. Die Implementierung der Codierung und Decodierung war einfach, aber die Implementierung der Zustandsmaschine war nicht so einfach. MINA bietet einige Klassen an, die Ihnen bei der Implementierung der Zustandsmaschine helfen sollen, aber ich fand sie schwierig zu verwenden. Am Ende haben wir uns entschlossen, MINA fallen zu lassen und das Protokoll von Grund auf neu zu implementieren, und überraschenderweise haben wir mit einem schnelleren Server geendet.

jassuncao
quelle
5

Ich bevorzuge Netty.

Twitter entschied sich auch für Netty, um sein neues Suchsystem zu erstellen, und beschleunigte es bis zu dreimal schneller.

Ref: Twitter-Suche ist jetzt 3x schneller

Wir haben Netty gegenüber einigen anderen Wettbewerbern wie Mina und Jetty ausgewählt, weil es eine sauberere API, eine bessere Dokumentation und vor allem, weil mehrere andere Projekte bei Twitter dieses Framework verwenden.

Tho
quelle
4

Ich habe MINA bisher nur verwendet, um einen kleinen http-ähnlichen Server zu erstellen. Die größten Probleme, auf die ich bisher gestoßen bin:

  1. Es wird Ihre "Anfrage" und "Antwort" im Speicher halten. Dies ist nur ein Problem, da das von mir verwendete Protokoll http ist. Sie können jedoch Ihr eigenes Protokoll verwenden, um dies zu umgehen.
  2. Keine Option zum Bereitstellen eines Streams von der Festplatte, falls Sie große Dateien bereitstellen möchten. Auch hier kann umgangen werden, indem Sie Ihr eigenes Protokoll implementieren

Schöne Dinge daran:

  1. Kann viele Verbindungen verarbeiten
  2. Wenn Sie sich für die Implementierung eines verteilten Arbeitssystems entscheiden, ist es hilfreich, zu wissen, wann einer Ihrer Knoten ausfällt und die Verbindung verliert, um die Arbeit auf einem anderen Knoten neu zu starten.
Gomesla
quelle
Wenn Sie "Streaming von Festplatte für große Dateien" sagen, verwenden die Leute normalerweise nicht UDP dafür?
Djangofan
1
Nein. Sie verwenden die Kernel-Sendedatei (in Java als FileChannel.transferTo verfügbar gemacht) über TCP.
Jbellis