web-dev-qa-db-ger.com

Netty gegen Apache MINA

Sie bieten beide ungefähr die gleiche Funktionalität. Welches sollte ich wählen, um meinen hochleistungsfähigen TCP Server zu entwickeln? Was sind die Vor- und Nachteile?

Verweise:

Apache MINA ( Quelle )

Netty ( Quelle )

141
GabiMe

Obwohl MINA und Netty ähnliche Ambitionen haben, unterscheiden sie sich in der Praxis erheblich 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 gefallen hat uns die übersichtlichere API und die viel bessere Dokumentation. Die Leistung schien auch auf dem Papier besser zu sein. Wichtiger noch: Wir wussten, dass Trustin Lee zur Stelle sein 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 in MINA hatten, erneut zu implementieren, haben wir dies von Grund auf getan. Indem wir die exzellente Dokumentation und die Beispiele befolgen, haben wir mehr Funktionalität in viel, viel weniger Code erhalten.

Die Netty Pipeline hat für uns besser funktioniert. Es ist irgendwie einfacher als MINAs, bei denen alles ein Handler ist und Sie selbst entscheiden müssen, ob Sie Upstream-Ereignisse, Downstream-Ereignisse oder beides behandeln oder mehr Low-Level-Inhalte 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 einem" zu erstellen. Sie haben wahrscheinlich bereits in der Dokumentation über diese Coverage-Annotation gelesen, aber im Grunde gibt sie den Status in einer einzelnen Codezeile an. Ohne herumzuspielen, ohne Sitzungszuordnungen, ohne Synchronisation und ähnliches konnten wir einfach reguläre Variablen (sagen wir "Benutzername") deklarieren und verwenden.

Aber dann stießen wir auf eine Straßensperre. Wir hatten bereits einen Multiprotokollserver unter MINA, in dem unser Anwendungsprotokoll über TCP/IP, HTTP und UDP lief. Als wir zu Netty gewechselt sind, haben wir in wenigen Minuten SSL und HTTPS zur Liste hinzugefügt! Soweit so gut, aber als es um UDP ging, stellten wir fest, dass wir durchgerutscht waren. MINA war sehr nett zu uns, dass wir UDP als "verbundenes" Protokoll behandeln konnten. Unter Netty gibt es keine solche Abstraktion. UDP ist verbindungslos und Netty behandelt es als solches. Netty zeigt mehr von der Verbindungslosigkeit von UDP auf einer niedrigeren Ebene als MINA. Es gibt Dinge, die Sie mit UDP unter Netty tun können, als Sie unter der höheren Abstraktionsebene, die MINA bereitstellt, auf die wir uns verlassen haben, nicht können.

Es ist nicht so einfach, einen Wrapper für "verbundenes UDP" oder etwas anderes hinzuzufügen. Aus Zeitgründen und auf Empfehlung von Trustin mussten wir Netty am Ende aufgeben, um unseren eigenen Transportdienstleister in Netty zu implementieren, was nicht schnell gehen würde.

Schauen Sie sich also die Unterschiede genau an und finden Sie schnell ein Stadium, in dem Sie testen können, ob eine knifflige Funktionalität wie erwartet funktioniert. Wenn Sie zufrieden sind, dass Netty den Job machen wird, würde ich ohne zu zögern über MINA nachdenken. Wenn Sie von MINA zu Netty wechseln, gilt das Gleiche. Es ist jedoch zu beachten, dass sich die beiden APIs erheblich unterscheiden und Sie eine virtuelle Neuschreibung für Netty in Betracht ziehen sollten - Sie werden es nicht bereuen!

204
Josh

MINA bietet mehr Standardfunktionen auf Kosten der Komplexität und einer relativ schlechten Leistung. Einige dieser Funktionen wurden zu eng 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 anzugehen, während ich die bekannten Stärken von MINA beibehalten habe.

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 ein wesentliches Merkmal fehlt, können Sie Ihren Vorschlag gerne im Forum veröffentlichen. Ich würde mich freuen, Ihr Anliegen anzusprechen.

Es ist auch wichtig anzumerken, dass Netty einen schnelleren Entwicklungszyklus hat. Informieren Sie sich einfach über das Veröffentlichungsdatum der letzten Veröffentlichungen. Sie sollten auch berücksichtigen, dass das MINA-Team eine umfassende Neufassung vornimmt, MINA 3, was bedeutet, dass die API-Kompatibilität vollständig beeinträchtigt wird.

134
trustin

Ich habe 2 "Google Protobuffer RPC" -Implementierungen getestet, wobei 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, schrieb ich protobuf-rpc-pro basierend auf Netty. Ich habe MINA in der Vergangenheit verwendet, finde aber, dass die Dokumentation der 2.0-Inhalte große Lücken aufweist und die Unterbrechung der API-Abwärtskompatibilität ein großes Minus darstellt.

22
pjklauser

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

16
Hardcoded

In Netty Site finden Sie einige Leistung Berichte . Wie erwartet :-) heben sie Netty als den Rahmen mit der besten Leistung hervor.

Ich habe Netty nie benutzt, aber ich habe MINA bereits benutzt, 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 Um Ihnen bei der Implementierung der Zustandsmaschine zu helfen, aber ich fand sie schwierig zu bedienen. Am Ende entschieden wir uns, MINA loszuwerden und das Protokoll von Grund auf neu zu implementieren, und überraschenderweise endeten wir mit einem schnelleren Server.

9
jassuncao

Ich bevorzuge Netty.

Twitter hat sich auch für Netty entschieden, um sein neues Suchsystem zu entwickeln und es dreimal schneller zu machen.

Ref: Twitter-Suche ist jetzt 3x schneller

Wir haben Netty gegenüber einigen Mitbewerbern wie Mina und Jetty ausgewählt, weil es eine sauberere API, eine bessere Dokumentation und, was noch wichtiger ist, mehrere andere Projekte bei Twitter verwenden dieses Framework.

5
Tho

Ich habe MINA immer 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 deshalb ein Problem, weil ich als Protokoll http wähle. Sie können jedoch Ihr eigenes Protokoll verwenden, um dies zu umgehen.
  2. Keine Option zum Bereitstellen eines Stream-Off-Datenträgers für den Fall, dass Sie große Dateien bereitstellen möchten. Wieder kann durch Implementieren Ihres eigenen Protokolls umgangen werden

Schöne Dinge daran:

  1. Kann mit vielen Verbindungen umgehen
  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 unterbrochen wird, um die Arbeit auf einem anderen Knoten neu zu starten.
4
gomesla