Event Driven
9
min de lectura
10 de noviembre de 2020

Optimización de la arquitectura Event Driven en Java (desde el bajo nivel)

Charles Fonseca
Desarrollo sistemas para facilitar la vida de la humanidad.
Más sobre el autor

La arquitecturaEvent Driven está muy extendida en el mercado, sin embargo, cuando se utiliza sin cuidado, puede haber niveles insatisfactorios en relación con los prometidos por los evangelistas. Este post aborda el tema de forma muy objetiva y detallada.Cuando utilizamos este modelo de arquitectura, buscamos un alto rendimiento, ya que maneja, en general, streaming en tiempo real, batch, trabajos, etc. Hay varias optimizaciones posibles en este modelo cuando se trata de Java, que ha demostrado ser una opción de herramienta para este propósito.La implementación de la Máquina Virtual Java (JVM), Eclipse OpenJ9, ha estado innovando en varios aspectos, proporcionando un paradigma para las aplicaciones Java. Desacoplaron la compilación Just-In-Time (JIT) del resto del compilador, estableciendo el concepto de servidor JIT.La idea es que la aplicación se ejecute independientemente de su optimizador de tiempo de ejecución (JIT). ¿Qué problema resuelve esto? Supongamos la siguiente arquitectura, todos los consumidores de mensajes son instancias de la misma aplicación, y la cola es un servicio de mensajería, como RabbitMQ, Apache ActiveMQ.Cada consumidor de la cola es una aplicación Java, con su propio compilador, cada uno, por tanto, tendrá ciclos de CPU dedicados al JIT, y memoria dedicada. Todas las instancias realizarán el mismo proceso de optimización en tiempo de ejecución, ya que tienen los mismos procesos, lo que puede provocar pérdidas de rendimiento en la aplicación.Con el servidor JIT, es posible tener un servidor aislado dedicado a atender las peticiones de compilación de todas las aplicaciones. Tiene más información de optimización de bytecode que la que tendría un compilador común, ya que hay más instancias y, por tanto, más puntos calientes.

No hay almuerzo gratis

Sin embargo, todas las mejoras mencionadas no son posibles sin coste. La aplicación y el compilador se comunican mediante protocolos de red. Sin embargo, las compilaciones tardan más tiempo debido a la latencia de la red, pero por otro lado, la JVM ya no agota los ciclos de CPU o de memoria en la compilación JIT.El cuello de botella es proporcional al número de instancias en ejecución. Por tanto, cuantas menos instancias haya, menos información tendrá el JIT para optimizar los recursos. Además, la disminución de la latencia de la red puede ser ciertamente beneficiosa para la aplicación.Los puntos de referencia establecidos por OpenJ9 pueden comprobarse aquí.

Manos a la obra

Puedes instalar OpenJ9 a través de SDKMAN:

curl -s"https://get.sdkman.io" | bashsdk i java x.x.x.j9-adptOr utilizar el sitio web oficial, seleccionando la opción OpenJ9.

Entonces, ejecuta:

jitserver -Xjit:verbose

Con ello, subirá un servidor en su puerto por defecto, y obtendremos una mayor visibilidad de los procesos de compilación añadiendo el parámetro.Para utilizar el jitserver añade la bandera `-XX: + UseJITServer` al ejecutar la aplicación, con ello, podrá conectarse automáticamente. Si el jitserver no está disponible, o la aplicación no puede conectarse, utilizará sus propios procesos de compilación, sin pérdida de rendimiento a bajo nivel.

Nodo.java

Además de las optimizaciones de bajo nivel, siguiendo la arquitectura Event Driven , el framework Eclipse Vert.x es una gran elección teniendo en cuenta su funcionamiento interno. Bajo el capó, el framework funciona a través del Bus de Eventos, que funciona como el Emisor de Eventos de Node.js. La aplicación tiene una cola de procesos, de manera que tanto el framework como la aplicación pueden emitir y escuchar eventos. Así, es posible agrupar la cola de eventos de varias aplicaciones Vert.x, obteniendo un alto rendimiento sin necesidad de bloquear el hilo principal, o agotar los recursos HTTP/HTTPS, que tienen capas adicionales de comunicación, y se producen a través de puentes. No sólo es posible esta comunicación entre aplicaciones Java, sino también con aplicaciones Node a través del mencionado Event Emitter, e incluso con el navegador a través de SocketJS.

Lecturas relacionadas

¡Gracias por leer!