Pergunta

Ambos fornecem aproximadamente a mesma funcionalidade. Qual deles deve optar por desenvolver o meu servidor TCP de alta performance? Quais são os prós e contras?

links de referência:

Apache MINA ( fonte )

Netty ( fonte )

Foi útil?

Solução

Enquanto MINA e Netty têm ambições semelhantes, eles são bastante diferentes na prática e você deve considerar a sua escolha com cuidado. Nós estávamos na sorte que tinha muita experiência com MINA e teve tempo para brincar com Netty. Nós gostamos especialmente a API mais limpa e muito melhor documentação. Desempenho parecia melhor no papel também. Mais importante, sabíamos que trustin Lee seria à disposição para responder quaisquer perguntas que, e ele certamente fez isso.

Encontramos tudo mais fácil em Netty. Período. Enquanto estávamos tentando reimplementar a mesma funcionalidade que já teve na MINA, fizemo-lo a partir do zero. Seguindo o excelente documentação e exemplos acabamos com mais funcionalidade em muito, muito menos código,.

O Netty Pipeline funcionou melhor para nós. É de certa forma mais simples do que Minas, onde tudo é um manipulador, e cabe a você decidir se deseja manipular eventos a montante, a jusante eventos, tanto ou consumir mais coisas de baixo nível. Devorando bytes em decodificadores "repetindo" foi quase um prazer. Foi também muito bom ser capaz de reconfigurar o gasoduto on-the-fly tão facilmente.

Mas a estrela atração de Netty, IMHO, é a capacidade de criar manipuladores de pipeline com uma "cobertura de um". Você provavelmente já leu sobre esta anotação cobertura já na documentação, mas, essencialmente, que lhe dá estado em uma única linha de código. Sem mexer, sem mapas de sessão, a sincronização e coisas assim, estávamos simplesmente capaz de declarar variáveis ??regulares (digamos, "username") e usá-los.

Mas, então, atingido um obstáculo. Nós já tínhamos um servidor multi-protocolo sob MINA, em que o nosso protocolo de aplicação correu sobre TCP / IP, HTTP e UDP. Quando nós mudamos para Netty nós adicionamos SSL e HTTPS à lista em questão de minutos! Até aí tudo bem, mas quando se tratava de UDP percebemos que tinha deslizado para cima. MINA foi muito bom para nós na medida em que poderíamos tratar UDP como protocolo de "conectado". Sob Netty não existe essa abstração. UDP é sem conexão e Netty trata como tal. Netty expõe mais da natureza sem conexão de UDP em um nível inferior do que MINA faz. Existem coisas que você pode fazer com UDP sob Netty do que você não pode sob a abstração de nível mais alto que MINA fornece, mas em que nos baseamos.

Não é tão simples de adicionar um wrapper "UDP conectado" ou algo assim. Dadas as restrições de tempo e por aconselhamento do confiando que a melhor maneira de proceder era implementar nosso próprio provedor de transporte em Netty, que não seria rápido, tivemos que abandonar Netty no final.

Assim, duro olhar para as diferenças entre eles e rapidamente chegar a um estágio onde você pode testar qualquer funcionalidade complicada está funcionando como esperado. Se você está convencido de que Netty irá fazer o trabalho, então eu não hesitaria em ir com ele ao longo do MINA. Se você está se movendo de MINA para Netty, em seguida, o mesmo se aplica, mas vale a pena notar que as duas APIs realmente são significativamente diferentes e você deve considerar uma reescrita virtual para Netty - você não vai se arrepender

Outras dicas

MINA tem características mais out-of-the-box, ao custo de complexidade e desempenho relativamente fraco. Alguns desses recursos foram integrados ao núcleo com muita força para ser removido, mesmo se eles não são necessários por um usuário. Em Netty, tentei abordar tais questões de design, mantendo os pontos fortes conhecidos do MINA.

Atualmente, a maioria dos recursos disponíveis no MINA também estão disponíveis em Netty. Na minha opinião, Netty tem mais limpo e mais documentado API desde Netty é o resultado de tentar reconstruir MINA partir do zero e resolver os problemas conhecidos. Se você achar que uma característica essencial está faltando, sinta-se livre para deixar a sua sugestão para o fórum. Eu ficaria feliz em resolver a sua preocupação.

Também é importante notar que Netty tem ciclo de desenvolvimento mais rápido. Simplesmente, veja a data de lançamento dos últimos lançamentos. Além disso, você deve considerar que a equipe MINA procederá a uma grande reformulação, MINA 3, o que significa que vai quebrar a compatibilidade API completamente.

I desempenho testado 2 "Google Protobuffer RPC" implementações onde um foi com base em Netty (netty-protobuf-RPC) eo outro com base em mina (protobuf-mina-RPC). Netty acabou sendo consistentemente mais rápido (+ - 10%) para todos os tamanhos de mensagens - que sustenta a alegação de desempenho geral no site da Netty. Desde que você quer espremer cada bit de eficiência fora do seu código quando você usa essa biblioteca RPC, eu acabei escrevendo protobuf-rpc pro baseado em Netty. Eu tenho usado MINA no passado, mas encontrar a sua documentação do material 2.0 tem grandes buracos, e a quebra de API compatibilidade com versões anteriores um grande menos.

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

local Em Netty você pode encontrar alguns desempenho relatórios . Como esperado :-) eles apontam Netty como o quadro com o melhor desempenho.

Eu nunca usei Netty, mas eu já utilizado MINA para implementar um protocolo TCP. A implementação de codificação e decodificação foi fácil, mas a implementação da máquina de estado não era tão fácil. MINA fornece algumas classes para ajudá-lo na implementação da máquina de estados, mas achei-os um pouco difícil de usar. No final, decidimos abandonar MINA e implementar o protocolo a partir do zero, e surpreendentemente, terminou com um servidor mais rápido.

Eu prefiro Netty.

Twitter também escolheu Netty para construir o seu novo Sistema de Busca e acelerou-lo até 3x mais rápido.

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

Nós escolhemos Netty sobre alguns de seus outros concorrentes, como a Mina e Pontão, porque ele tem uma API mais limpa, melhor documentação e, mais importante, porque vários outros projectos no Twitter estão usando este quadro.

Eu só utilizado MINA para construir uma pequena http como servidor. Os maiores problemas eu correr em com ele até agora:

  1. Ele irá realizar o seu "pedido" e "resposta" na memória. Este é apenas um problema porque o protocolo que eu escolher para uso é http. Você poderia usar o seu próprio protocolo no entanto de contornar este problema.
  2. Nenhuma opção para fornecer um fluxo off disco no caso de você querer servir-se arquivos grandes. Novamente pode ser contornado através da implementação de seu próprio protocolo

agradáveis ??coisas sobre ele:

  1. Pode lidar com um monte de conexões
  2. Se você optar por implementar algum tipo de sistema de trabalho distribuída, em seguida, saber quando um dos seus nós vai para baixo e perde a conexão é útil para reiniciar o trabalho em outro nó.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top