Quelles sont les alternatives Netty pour le réseautage de haute performance? [fermé]
je suis en train de choisir une bibliothèque de réseau pour implémenter un système client/serveur qui ne peut pas épargner n'importe quelle microseconde. Il mettra en œuvre son propre protocole pour envoyer et recevoir des messages. Je suis à la recherche d'un bon framework NIO qui me permettra de développer facilement le serveur et le client, sans trop m'inquiéter des détails du sélecteur de bas niveau. Tout le monde me recommande Netty mais je voudrais expérimenter avec 2 ou 3 autres alternatives avant d'engager mon équipe avec Framework. Une chose que je n'ai pas beaucoup aimé à propos de Netty est la façon dont il gère les ByteBuffers avec sa propre mise en œuvre de ByteBuf et le comptage de référence. Est-ce que quelqu'un peut partager vos idées et vos solutions de rechange?
3 réponses
nous avons développé une NIO networking library qui exécute moins de 2 microsecondes sur loopback sans produire de déchets pour le GC. Comme Peter Lawrey l'a mentionné, le sélecteur natif JDK produit beaucoup de déchets, mais nous avons corrigé toutes ces "fuites de déchets en implémentant notre propre sélecteur epoll. Occupé attente le sélecteur de fil est idéal pour la latence, mais il doit y avoir un équilibre pour ne pas brûler la puce ou de consommer beaucoup d'énergie. Notre l'implémentation du sélecteur utilise des astuces de bas niveau pour implémenter une sorte de mode d'économie d'énergie qui prend soin de cet équilibre.
outre CoralReactor , vous pouvez également jeter un oeil sur Grizzly et Mina , mais nous n'avons pas encore joué avec ces cadres.
pour certains TCP Netty critères de performance, vous pouvez jeter un oeil ici .
cela suppose que vous voulez vraiment sauver chaque micro-seconde. La plupart des applications n'ont pas de telles exigences strick.
si vous voulez enregistrer des micro-secondes, vous voulez utiliser NIO en attente occupée non-bloquant pour les threads sur les CPU dédiés. Cela ne se passe pas bien car vous avez besoin d'avoir beaucoup de CPU, mais cela minimise la latence pour gérer IO. Je suggère que vous liiez aussi les CPU isolés pour minimiser les secousses.
vous voudrez éviter d'utiliser Les sélecteurs comme ils bloquent et / ou créent tout à fait un peu de déchets ajoutant aux pauses GC.
également pour minimiser la latence, vous voudrez utiliser un adaptateur réseau de dérivation du noyau à faible latence tel que Solarflare.
vous voudrez utiliser un analyseur push pour que les messages longs puissent être décodés/analysés au fur et à mesure qu'ils sont téléchargés. c'est-à-dire que vous ne voudrez pas attendre jusqu'à ce que tous les messages soient reçus avant de commencer.
en utilisant ces trucs en combinaison peut sauver 10-30 micro-secondes sur chaque requête ou événement entrant.
Netty est une meilleure solution pour l'évolutivité, c'est-à-dire un débit net plus élevé, mais à un faible coût pour la latence, comme le font la plupart des cadres qui sont basés sur les services web de soutien où milli-secondes retards sont tolérables.
si vous êtes d'accord avec l'utilisation d'au moins quelques Scala, Spray est une excellente alternative à Netty. Sur le long terme, le cadre de jeu est par exemple l'intention de migrer de Netty à Spray. Spray offre différents niveaux D'Abstraction TCP. Ce sont:
- Chunk "au niveau de 151960920"
- niveau de la Demande (HttpRequest / HttpResponse)
- niveau D'objet regroupé
Plus vous creusez dans la pile, plus les informations livrées sont brutes. Dans l'API chunk level, vous vous rapprochez des tampons byte originaux. Je n'ai jamais utilisé ce faible niveau d'abstraction moi-même, mais j'ai entendu de bonnes choses.
Spray construit sur le dessus de Akka IO qui est de nouveau construit sur le dessus de Java NIO. Toutes les fonctionnalités s'enroule autour des abstractions des acteurs ce qui rend facile de construire des applications parallèles en utilisant le Spray. Je pense qu'un serveur de chat serait un parfait cas d'utilisation. Depuis Akka propose une API Java, vous devriez pouvoir utiliser Spray avec principalement cette API. Cependant, vous aurez probablement besoin de lire certaines sources Scala de temps en temps. Finalement, Spray se fondra complètement dans Akka.
Edit: citation du site Web Spray: "Spray n'est plus maintenu et a été remplacé par Akka HTTP . Playframork a commencé à supporter expérimentalement Akka serveur HTTP backend à partir de Jouer 2.4.X . Dans Play 2.6.X versions, play complètement migré vers Akka serveur HTTP backend.