HornetQ: Simples, Performatico e Zumbido

é a terceira geração de soluções em Mesageria da JBoss, sucessora do JBoss Messaging, vem agitando o mercado de mesageria nos ultimos meses. Toda esta agitação não se deve só pelo fato de ser um produto totalmente novo com uma base de código nova em relação ao JBoss messaging(padrão de mesageria no JBoss EAP e JBOSS AS 5.0), mas pelo fato de sua performance bater os resultados anteriores da Spec.

Com a performance superior ao resultado anterior superando 307%, realmente é um número bem impressionate e que reflete o trabalho focado em performance da sua equipe de desenvolvimento. Este trabalho focando em performance tem dois elementos fundamentais: Netty e Persistência.

Netty é um framework focado para construir aplicações que tiram o máximo de performance da rede usando eventos de forma assíncrona. Ele foi criado por Trustin Lee que é o fundador dos projetos Apache Mina e Apiviz. O Transporte é basicamente delegado ao Netty quando o cliente e o servidor estão em diferentes maquinas virtuais ou invm quando o cliente e o servidor estão na mesma maquina. Tudo isto e configuravel e pode ser customizado, caso você queira mais detalhe de uma olhada neste post que fala sobre os Connectors & Acceptors no HornetQ.



Um pouco mais sobre a Arquitetura do Netty



Visão Geral da Arquitetura do Netty

Basicamente você pode efetuar o transporte usando a API de NIO de maneira bloqueante ou não bloqueante. Você ai tem suporte a diversos protocolos e formatos de dados como protocolos binários, procolos baseados em texto e até mesmo o Protobuf que é um protocolo da Google e é bem rápido. Além disso existe suporte a sugurança em SSL e integração com com container como Spring e JBoss Microcontainer.

O HornetQ usa a injeção de dependências do JBoss Microcontainer para configuração, feita através de XML em um estilo muito parecido com o do Spring Framework, isso é bom por que deixa muito fácil a customização do comportamento da soluções e deixa um bom gancho para extenssibilidade.O uso do JBoss Microcontainer é um dos pontos em que ele se difere da solução da Apache o ActiveMQ que é baseado em cima do Spring Framework.

A Persistência do HornetQ

Não existe mais suporte a persistência em banco de dados no HornetQ, na verdade nunca existiu, só nas versões antetiores das soluções de mesageria da JBoss. Já de conhecimento de todos que a persistência em banco de dados é muito lenta, devida a API de JDBC. O banco de dados lhe da muita resiliência mas performance, talvez a equipe do HornetQ esteja puxando um tendência nas soluções de mesageria ao retirar o suporte a banco de dados.

Várias soluções de mesageria tem o seu próprio Journal. Não foi deferente com o HornetQ, além de ter o seu próprio journal ele tem duas formas de escrever no disco basicamamente, a primeira é usando a API de NIO. A outra forma que é realmente rápida é focada para sistemas operacionais Linux e usa uma pequena camada JNI para acessar o libaio do linux.

O Journal da solução é circular e transacional, funciona em nível de kernel graças ao libaio, existem uma serie de arquivos pre-alocados que tem o tamanho mais proximo possível do cilimdro do disco, dai surgiu um valor mistico de 10mb que o pessoal do hornetq achou, mas segundo eles isso pode variar conforme o disco. São apénas usados os arquivos pre alocados, desta forma eles evitam os movimentos do disco rigido. Além disto tudo existe um controle muito otimizado para fazer a deleção e limpeza. Se você quizer mais detalhes confira este post do Clebert.

O HortnetQ comtém muitos exemplos em sua distribuição, mais de 70. Você pode usar a solução dentro do JBoss se quizer usando um modulo de resource adapter que vem na distrinuição da solução. Também é possivel usar a solução de forma standalone e também de forma "embarcada" dentro da sua aplicação.

Um recurso que eu gostei bastante é a detecção de conexões mortas. Isto é feito através do TTL e o proprio servidor mata recursos que estão mortos evitando que o servidor caia por falta de memoria, um warning é emitido no console e nos logs do servidor indicando isso.

O HornetQ realmente esta vindo contudo a performance e simplicidade são absurdamente bons, o unico porem é que não existem muitas funcionalidades fora do básico, na versão 2.1 vai vir suporte a REST e AMQP o que vai ser um boa.

Abraços e até a próxima.

Popular posts from this blog

Kafka Streams with Java 15

Rust and Java Interoperability

HMAC in Java