Event Driven
9
min de leitura
10 de novembro de 2020

Otimizando Event Driven Arquitetura em Java (a partir do baixo nível)

Charles Fonseca
Eu desenvolvo sistemas para facilitar a vida da humanidade.
Mais sobre o autor

Event Driven A arquitetura é generalizada no mercado, porém, ao utilizá-la sem cuidado, pode haver níveis insatisfatórios em relação aos prometidos pelos evangelistas. Este post aborda o tema de forma muito objetiva e detalhada. Quando utilizamos este modelo arquitetônico, estamos procurando um alto desempenho, pois ele trata, em geral, de streaming em tempo real, lote, trabalhos, etc. A implementação da Máquina Virtual Java (JVM), Eclipse OpenJ9, tem inovado em vários aspectos, fornecendo um paradigma para aplicações Java. Eles desacoplaram a compilação Just-In-Time (JIT) do resto do compilador, estabelecendo o conceito de servidor JIT. A idéia é que a aplicação seja executada independentemente de seu otimizador de tempo de execução (JIT). Qual é o problema que isto resolve? Suponha a seguinte arquitetura, todos os consumidores de mensagens são instâncias da mesma aplicação, e a fila é um serviço de mensagens, como RabbitMQ, Apache ActiveMQ. Cada consumidor na fila é uma aplicação Java, com seu próprio compilador, portanto, cada um terá ciclos de CPU dedicados ao JIT, e memória dedicada. Com o servidor JIT, é possível ter um servidor isolado dedicado ao atendimento de solicitações de compilação para todas as aplicações. Ele tem mais informações de otimização bytecode do que um compilador comum teria, já que há mais instâncias, conseqüentemente, mais hotspots.

Não há almoço gratuito

Todas as melhorias mencionadas, no entanto, não são possíveis sem custo. A aplicação e o compilador comunicam-se através de protocolos de rede. Entretanto, as construções levam mais tempo devido à latência da rede, mas por outro lado, a JVM não está mais esgotando os ciclos de CPU ou memória na construção do JIT. Portanto, quanto menos instâncias, menos informações o JIT terá para otimizar os recursos. Além disso, a diminuição da latência da rede pode certamente ser benéfica para a aplicação, os pontos de referência estabelecidos pelo OpenJ9 podem ser verificados aqui.

Hands-on

Você pode instalar o OpenJ9 através do SDKMAN:

curl -s"https://get.sdkman.io" | bashsdk i java x.x.x.j9-adptOr usando o site oficial, selecionando a opção OpenJ9.

Em seguida, executar:

jitserver -Xjit:verbose

Com isso, ele carregará um servidor em sua porta padrão, e obteremos maior visibilidade dos processos de compilação adicionando o parâmetro. Para utilizar o jitserver adicione a bandeira `-XX: + UseJITServer' ao executar a aplicação, com isso, ele será capaz de se conectar automaticamente. Se o jitserver não estiver disponível, ou se o aplicativo não puder se conectar, ele utilizará seus próprios processos de compilação, sem perda de desempenho no nível baixo.

Nó.java

Além das otimizações de baixo nível, seguindo a arquitetura Event Driven , a estrutura do Eclipse Vert.x é uma ótima escolha considerando seu funcionamento interno. Sob o capô, a estrutura funciona através do ônibus de eventos, que funciona como o emissor de eventos do Node.js. A aplicação tem uma fila de processo, de modo que tanto a estrutura quanto a aplicação podem emitir e ouvir eventos. Assim, é possível agrupar a fila de eventos de várias aplicações Vert.x, obtendo alto desempenho sem a necessidade de bloquear o fio principal, ou esgotar os recursos HTTP/HTTPS, que possuem camadas adicionais de comunicação, e ocorrem através de pontes. Esta comunicação não só é possível entre aplicações Java, mas também com aplicações Node através do Emissor de Eventos acima mencionado, e até mesmo com o navegador através do SocketJS.

Leituras relacionadas

Obrigado pela leitura!