Ils offrent tous deux à peu près les mêmes fonctionnalités. Lequel devrais-je choisir pour développer mon serveur haute performance TCP serveur? Quels sont les avantages et les inconvénients?
Liens de référence:
Apache MINA ( source )
Bien que MINA et Netty aient des ambitions similaires, elles sont assez différentes dans la pratique et vous devez envisager votre choix avec soin. Nous avons eu de la chance car nous avions beaucoup d’expérience avec MINA et avions le temps de jouer avec Netty. Nous avons particulièrement apprécié l’API de nettoyage et une documentation bien meilleure. La performance semblait meilleure sur le papier aussi. Plus important encore, nous savions que Trustin Lee serait disponible pour répondre à toutes nos questions, et il l'a certainement fait.
Nous avons trouvé tout plus facile à Netty. Période. Alors que nous essayions de réimplémenter la même fonctionnalité que celle que nous avions déjà sur MINA, nous l'avons fait à partir de zéro. En suivant l'excellente documentation et les exemples, nous avons obtenu plus de fonctionnalités dans beaucoup, beaucoup moins de code.
Le pipeline Netty a mieux fonctionné pour nous. C'est en quelque sorte plus simple que MINA, où tout est un gestionnaire et il vous appartient de décider de gérer les événements en amont, les événements en aval, les deux ou de consommer davantage d'éléments de bas niveau. Gober des octets en "rejouant" des décodeurs était presque un plaisir. C'était également très agréable de pouvoir reconfigurer le pipeline si facilement.
Mais l'attraction vedette de Netty, à mon humble avis, réside dans sa capacité à créer des gestionnaires de pipeline avec une "couverture de l'un". Vous avez probablement déjà entendu parler de cette annotation de couverture dans la documentation, mais vous y trouverez essentiellement un état dans une seule ligne de code. Sans problèmes, sans cartes de sessions, sans synchronisation, etc., nous avons simplement été en mesure de déclarer des variables normales (par exemple, "nom d'utilisateur") et de les utiliser.
Mais ensuite nous avons heurté un barrage routier. Nous avions déjà un serveur multi-protocole sous MINA, dans lequel notre protocole d’application fonctionnait sous TCP/IP, HTTP et UDP. Lorsque nous sommes passés à Netty, nous avons ajouté SSL et HTTPS à la liste en quelques minutes! Jusqu'ici tout va bien, mais en ce qui concerne UDP, nous avons réalisé que nous avions dérapé. MINA a été très gentil avec nous dans la mesure où nous pouvions traiter le protocole UDP comme un protocole "connecté". Sous Netty, une telle abstraction n'existe pas. UDP est sans connexion et Netty le traite comme tel. Netty expose davantage le caractère sans connexion d’UDP à un niveau inférieur à celui de MINA. Sous Netty, vous pouvez faire certaines choses avec NDP que sous l'abstraction de niveau supérieur fournie par MINA, mais sur laquelle nous nous sommes appuyés.
Il n'est pas si simple d'ajouter un wrapper "UDP connecté" ou quelque chose du genre. Compte tenu des contraintes de temps et de l'avis de Trustin selon lequel la meilleure façon de procéder était d'implémenter notre propre fournisseur de transport à Netty, ce qui ne serait pas rapide, nous avons finalement dû abandonner Netty.
Alors, regardez bien les différences entre eux et passez rapidement à une étape où vous pouvez tester toutes les fonctionnalités complexes qui fonctionnent comme prévu. Si vous êtes convaincu que Netty fera le travail, alors je n'hésiterais pas à le suivre avec MINA. Si vous passez de MINA à Netty, il en va de même, mais il convient de noter que les deux API sont très différentes et que vous devriez envisager une réécriture virtuelle pour Netty - vous ne le regretterez pas!
MINA offre davantage de fonctionnalités prêtes à l'emploi au détriment de la complexité et des performances relativement médiocres. Certaines de ces fonctionnalités ont été intégrées au noyau de manière trop étroite pour pouvoir être supprimées, même si elles ne sont pas nécessaires à un utilisateur. Dans Netty, j'ai essayé de résoudre ces problèmes de conception tout en conservant les forces connues de MINA.
Actuellement, la plupart des fonctionnalités disponibles dans MINA sont également disponibles dans Netty. À mon avis, Netty a une API plus propre et plus documentée, car Netty est le résultat d’une tentative de reconstruction de MINA à partir de zéro et de la résolution des problèmes connus. S'il vous manque une fonctionnalité essentielle, n'hésitez pas à poster votre suggestion sur le forum. Je serais heureux de répondre à votre préoccupation.
Il est également important de noter que Netty a un cycle de développement plus rapide. Vérifiez simplement la date de publication des versions récentes. En outre, vous devriez considérer que l'équipe MINA procédera à une réécriture majeure, MINA 3, ce qui signifie qu'elle rompra complètement la compatibilité de l'API.
J'ai testé les performances de 2 implémentations "Google Protobuffer RPC", l'une basée sur Netty (netty-protobuf-rpc) et l'autre sur mina (protobuf-mina-rpc). Netty a fini par être systématiquement plus rapide (+ - 10%) pour toutes les tailles de messages - ce qui sauvegarde la déclaration de performance globale affichée sur le site Web de Netty. Puisque vous voulez tirer le maximum de votre code lorsque vous utilisez une telle bibliothèque RPC, j'ai fini par écrire protobuf-rpc-pro basé sur Netty. J'ai déjà utilisé MINA par le passé, mais la documentation relative à la version 2.0 présente de gros trous et la rupture de la compatibilité ascendante des API est un inconvénient majeur.
MINA et Netty ont été initialement conçus et construits par le même auteur. C'est pourquoi ils sont si semblables les uns aux autres. MINA est conçu à un niveau légèrement supérieur avec un peu plus de fonctionnalités, tandis que Netty est un peu plus rapide. Je pense qu'il n'y a pas beaucoup de différence, les concepts de base sont les mêmes.
Sur le site Netty, vous pouvez trouver des performances rapports . Comme prévu :-), ils soulignent Netty comme le cadre offrant les meilleures performances.
Je n'ai jamais utilisé Netty, mais j'ai déjà utilisé MINA pour implémenter un protocole TCP. L'implémentation du codage et du décodage était facile, mais l'implémentation de la machine à états n'était pas si facile. MINA fournit quelques classes pour vous aider lors de l’implémentation de la machine à états, mais j’ai trouvé cela assez difficile à utiliser. Nous avons finalement décidé de laisser tomber MINA et de mettre en oeuvre le protocole à partir de rien, et étonnamment, nous avons fini avec un serveur plus rapide.
Je préfère Netty.
Twitter a également choisi Netty pour construire son nouveau système de recherche et l’accélérer trois fois plus vite.
Ref: la recherche sur Twitter est maintenant 3x plus rapide
Nous avons choisi Netty sur certains de ses concurrents, tels que Mina et Jetty, car elle dispose d'une API plus propre, d'une meilleure documentation et, plus important encore, de ce que plusieurs autres projets de Twitter utilisent ce cadre.
Je n'ai jamais utilisé MINA que pour créer un petit serveur http, tel que. Les plus gros problèmes que j'ai rencontrés jusqu'à présent:
Belles choses à ce sujet: