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 )
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 )
Antworten:
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!
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.
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.
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.
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.
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.
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:
Schöne Dinge daran: