java network-programming apache-mina netty

java - Netty vs Apache MINA



network-programming apache-mina (7)

Ambos proporcionan más o menos la misma funcionalidad. ¿Cuál debería elegir para desarrollar mi servidor TCP de alto rendimiento? ¿Cuáles son los pros y contras?

Enlaces de referencia:

Apache MINA ( source )

Netty ( source )


El rendimiento probó 2 implementaciones de "Google Protobuffer RPC", una basada en Netty (netty-protobuf-rpc) y la otra basada en mina (protobuf-mina-rpc). Netty terminó siendo consistentemente más rápido (+ - 10%) para todos los tamaños de mensaje, lo que respalda el reclamo de rendimiento general en el sitio web de Netty. Como desea extraer todo el rendimiento del código cuando usa una biblioteca RPC de este tipo, terminé escribiendo protobuf-rpc-pro basado en Netty. He utilizado MINA en el pasado, pero encuentro que su documentación del material 2.0 tiene grandes agujeros, y la ruptura de la compatibilidad con versiones anteriores de API es un gran inconveniente.


En el sitio de Netty puede encontrar algunos reports rendimiento. Como se esperaba :-) señalan a Netty como el marco con el mejor rendimiento.

Nunca utilicé Netty, pero ya utilicé MINA para implementar un protocolo TCP. La implementación de codificación y decodificación fue fácil, pero la implementación de la máquina de estado no fue tan fácil. MINA proporciona algunas clases para ayudarlo cuando implementa la máquina de estado, pero me pareció un poco difícil de usar. Al final, decidimos deshacernos de MINA e implementar el protocolo desde cero, y sorprendentemente terminamos con un servidor más rápido.


MINA tiene más características listas para usar a costa de la complejidad y un rendimiento relativamente bajo. Algunas de esas características se integraron en el núcleo con demasiada fuerza como para eliminarlas incluso si el usuario no las necesita. En Netty, traté de abordar estos problemas de diseño sin perder los puntos fuertes conocidos de MINA.

Actualmente, la mayoría de las características disponibles en MINA también están disponibles en Netty. En mi opinión, Netty tiene una API más limpia y documentada, ya que Netty es el resultado de intentar reconstruir MINA desde cero y resolver los problemas conocidos. Si encuentra que falta una característica esencial, no dude en publicar su sugerencia en el foro. Estaría encantado de dirigir su preocupación.

También es importante tener en cuenta que Netty tiene un ciclo de desarrollo más rápido. Simplemente, revisa la fecha de lanzamiento de los lanzamientos recientes. Además, debe considerar que el equipo MINA procederá a una reescritura importante, MINA 3, lo que significa que romperá la compatibilidad API por completo.


MINA y Netty fueron inicialmente diseñados y construidos por el mismo autor. Es por eso que son muy similares el uno al otro. MINA está diseñado en un nivel ligeramente más alto con un poco más de características, mientras que Netty es un poco más rápido. Creo que no hay mucha diferencia en absoluto, los conceptos básicos son los mismos.


Prefiero Netty.

Twitter también eligió Netty para construir su nuevo sistema de búsqueda y lo aceleró hasta 3 veces más rápido.

Ref: La búsqueda de Twitter ahora es 3 veces más rápida

Elegimos a Netty sobre algunos de sus otros competidores, como Mina y Jetty, porque tiene una API más limpia, mejor documentación y, lo que es más importante, porque varios otros proyectos en Twitter están utilizando este marco.


Si bien MINA y Netty tienen ambiciones similares, en la práctica son bastante diferentes y debes considerar cuidadosamente tu elección. Tuvimos suerte porque tuvimos mucha experiencia con MINA y tuvimos tiempo para jugar con Netty. Nos gustó especialmente la API más limpia y una documentación mucho mejor. El rendimiento parecía mejor en el papel también. Más importante aún, sabíamos que Trustin Lee estaría a su disposición para responder cualquier pregunta que tuviéramos, y ciertamente lo hizo.

Encontramos todo más fácil en Netty. Período. Mientras intentábamos volver a implementar la misma funcionalidad que ya teníamos en MINA, lo hicimos desde cero. Al seguir la excelente documentación y ejemplos, terminamos con más funcionalidades en mucho, mucho menos código.

El Netty Pipeline funcionó mejor para nosotros. Es de alguna manera más simple que las MINA, donde todo es un controlador y depende de usted decidir si se manejan los eventos río arriba, los posteriores o ambos, o si se consumen más cosas de bajo nivel. Engullir bytes en "reproducir" decodificadores fue casi un placer. También fue muy agradable poder reconfigurar la tubería sobre la marcha tan fácilmente.

Pero la atracción principal de Netty, imho, es la capacidad de crear manipuladores de tuberías con una "cobertura de uno". Probablemente ya haya leído acerca de esta anotación de cobertura en la documentación, pero básicamente le proporciona el estado en una sola línea de código. Sin problemas, sin mapas de sesión, sincronización y cosas así, simplemente pudimos declarar variables regulares (por ejemplo, "nombre de usuario") y usarlas.

Pero luego llegamos a un obstáculo. Ya teníamos un servidor multiprotocolo bajo MINA, en el cual nuestro protocolo de aplicación funcionaba a través de TCP / IP, HTTP y UDP. Cuando cambiamos a Netty, agregamos SSL y HTTPS a la lista en cuestión de minutos. Hasta ahora todo bien, pero cuando se trataba de UDP nos dimos cuenta de que habíamos caído. MINA fue muy amable con nosotros en que pudimos tratar UDP como un protocolo "conectado". Bajo Netty no hay tal abstracción. UDP no tiene conexión y Netty lo trata como tal. Netty expone más de la naturaleza sin conexión de UDP en un nivel más bajo que MINA. Hay cosas que puede hacer con UDP en Netty de lo que no puede hacerlo en la abstracción de nivel superior que proporciona MINA, pero en las que confiamos.

No es tan simple agregar un contenedor "UDP conectado" o algo así. Dadas las limitaciones de tiempo y el consejo de Trustin de que la mejor manera de proceder era implementar nuestro propio proveedor de transporte en Netty, lo que no sería rápido, al final tuvimos que abandonar Netty.

Por lo tanto, fíjese bien en las diferencias entre ellos y llegue rápidamente a una etapa en la que puede probar que cualquier funcionalidad complicada está funcionando como se esperaba. Si está satisfecho de que Netty hará el trabajo, no dudaría en seguir con MINA. Si te estás moviendo de MINA a Netty, aplica lo mismo, pero vale la pena señalar que las dos API realmente son significativamente diferentes y debes considerar una reescritura virtual para Netty: ¡no te arrepentirás!


Solo he usado MINA para construir un pequeño servidor tipo http. Los mayores problemas con los que me he encontrado hasta ahora:

  1. Mantendrá su "solicitud" y "respuesta" en la memoria. Esto es solo un problema porque el protocolo que elijo usar es http. Sin embargo, puede usar su propio protocolo para evitar esto.
  2. No hay ninguna opción para proporcionar un disco de descarga en caso de que quiera entregar archivos de gran tamaño. Nuevamente se puede solucionar implementando su propio protocolo

Cosas agradables al respecto:

  1. Puede manejar una gran cantidad de conexiones
  2. Si elige implementar algún tipo de sistema de trabajo distribuido, saber cuándo uno de sus nodos se cae y pierde conexión es útil para reiniciar el trabajo en otro nodo.