java - tutorial - org apache sshd




Netty vs Apache MINA (5)

Ambos fornecem aproximadamente a mesma funcionalidade. Qual deles devo escolher para desenvolver meu servidor TCP de alto desempenho? Quais são os prós e contras?

Links de referência:

Apache MINA ( source )

Netty ( source )


Embora MINA e Netty tenham ambições semelhantes, elas são bastante diferentes na prática e você deve considerar cuidadosamente sua escolha. Tivemos a sorte de termos muita experiência com a MINA e tivemos tempo de brincar com a Netty. Nós gostamos especialmente da API mais limpa e da documentação muito melhor. O desempenho também parecia melhor no papel. Mais importante, sabíamos que a Trustin Lee estaria à disposição para responder a quaisquer perguntas que tivéssemos, e ele certamente fez isso.

Encontramos tudo mais fácil no Netty. Período. Enquanto estávamos tentando reimplementar a mesma funcionalidade que já tínhamos no MINA, fizemos isso do zero. Seguindo a excelente documentação e exemplos, acabamos com mais funcionalidade em muito, muito menos código.

O Netty Pipeline funcionou melhor para nós. É de alguma forma mais simples do que MINAs, onde tudo é um manipulador e cabe a você decidir se vai lidar com eventos upstream, eventos downstream, ambos ou consumir mais coisas de baixo nível. Devorando bytes em "replaying" decoders foi quase um prazer. Também foi muito bom poder reconfigurar facilmente o pipeline rapidamente.

Mas a principal atração da Netty, a imho, é a capacidade de criar manipuladores de pipeline com uma "cobertura de um". Você provavelmente já leu sobre essa anotação de cobertura na documentação, mas essencialmente fornece o estado em uma única linha de código. Sem mexer, sem mapas de sessão, sincronização e coisas assim, nós simplesmente pudemos declarar variáveis ​​regulares (digamos, "username") e usá-las.

Mas então nós batemos em um obstáculo. Nós já tínhamos um servidor multiprotocolo sob o MINA, no qual o nosso protocolo de aplicação rodava sobre TCP / IP, HTTP e UDP. Quando mudamos para o Netty, adicionamos SSL e HTTPS à lista em questão de minutos! Até aí tudo bem, mas quando chegou a UDP percebemos que tínhamos escorregado. MINA foi muito legal conosco, pois poderíamos tratar o UDP como um protocolo "conectado". Sob Netty não existe tal abstração. O UDP é sem conexão e o Netty o trata como tal. Netty expõe mais da natureza sem conexão do UDP em um nível inferior ao MINA. Há coisas que você pode fazer com o UDP sob o Netty do que com a abstração de alto nível que o MINA fornece, mas em que nos baseamos.

Não é tão simples adicionar um invólucro "UDP conectado" ou algo assim. Devido às limitações de tempo e ao conselho da Trustin de que a melhor maneira de proceder era implementar nosso próprio provedor de transporte na Netty, o que não seria rápido, tivemos que abandonar a Netty no final.

Portanto, observe as diferenças entre elas e, rapidamente, chegar a um estágio em que você pode testar se alguma funcionalidade complicada está funcionando conforme o esperado. Se você está satisfeito que Netty fará o trabalho, então eu não hesitaria em ir com isso sobre MINA. Se você está mudando de MINA para Netty, o mesmo se aplica, mas é importante notar que as duas APIs são significativamente diferentes e você deve considerar uma reescrita virtual para Netty - você não vai se arrepender!


Eu prefiro a Netty.

O Twitter também escolheu a Netty para criar seu novo sistema de busca e acelerou até 3x mais rápido.

Ref: Twitter Search é agora 3x mais rápido

Escolhemos a Netty sobre alguns de seus outros concorrentes, como Mina e Jetty, porque ela tem uma API mais limpa, melhor documentação e, mais importante, porque vários outros projetos no Twitter estão usando essa estrutura.


Eu testei duas implementações "Google Protobuffer RPC" onde uma delas era baseada em Netty (netty-protobuf-rpc) e a outra baseada em mina (protobuf-mina-rpc). O Netty acabou sendo consistentemente mais rápido (+ - 10%) para todos os tamanhos de mensagem - o que faz o backup da declaração geral de desempenho no site da Netty. Como você quer extrair toda a eficiência do código quando usa uma biblioteca RPC, acabei escrevendo protobuf-rpc-pro base no Netty. Eu usei MINA no passado, mas acho que a documentação do material 2.0 tem grandes buracos, e a quebra da compatibilidade com versões anteriores da API é muito grande.


MINA e Netty foram inicialmente projetados e construídos pelo mesmo autor. É por isso que eles são tão parecidos um com o outro. O MINA é projetado em um nível um pouco mais alto com um pouco mais de recursos, enquanto o Netty é um pouco mais rápido. Eu acho que não há muita diferença, os conceitos básicos são os mesmos.


O MINA tem mais recursos prontos para uso ao custo da complexidade e desempenho relativamente ruim. Alguns desses recursos foram integrados ao núcleo com muita força para serem removidos, mesmo que não sejam necessários por um usuário. Na Netty, tentei abordar esses problemas de design, mantendo os pontos fortes conhecidos do MINA.

Atualmente, a maioria dos recursos disponíveis no MINA também está disponível no Netty. Na minha opinião, a Netty tem uma API mais limpa e documentada, já que o Netty é o resultado de tentar reconstruir a MINA do zero e resolver os problemas conhecidos. Se você achar que um recurso essencial está faltando, sinta-se à vontade para postar sua sugestão no fórum. Eu ficaria feliz em resolver sua preocupação.

Também é importante observar que o Netty possui um ciclo de desenvolvimento mais rápido. Simplesmente, confira a data de lançamento dos lançamentos recentes. Além disso, você deve considerar que a equipe da MINA irá prosseguir para uma grande reescrita, MINA 3, o que significa que eles irão quebrar completamente a compatibilidade da API.







netty