[Quarkus] - Entendiendo el @Nonblocking (BabySteps)

Discusión

Si bien Quarkus se convirtió uno de los frameworks de alguna forma más demandados debido a su versatilidad con reactividad asi como la promesa de ser un marco nativo para Kubernetes y que puedan construirse tanto en JVM o GraalVM, también dar soluciones serverless, con enfoques de soporte para arquitecturas de aplicaciones distribuidas.

@NonBlocking es una anotación que indica a un método o clase no bloquear el hilo que ejecuta, de tal forma que permite que el servidor maneje solicitudes de forma simultánea.

Veremos un ejemplo a alto nivel de como es que funciona esta anotación

Explicación

Asumiendo que tenemos una aplicación backend desplegada, donde este tiene un servicio expuesto, donde se obtiene la información de una persona.

Entorno síncrono

Se asume que existe un método síncrono con el nombre getPersonInfo(), donde llamará a este método en un hilo de un worker. Esto es debido a que Quarkus tiene un grupo de subprocesos dedicado a realizar esta tarea. Recordemos que esto se realiza en tiempo de compilación y no de ejecución. También debemos de entender que las solicitudes paralelas se ejecutan en hilos de workers separados.

Con base en toda la explicación tenemos un modelo de solicitud clásico de bloqueo de I/O, y el sistema asignará los hilos correspondientes. Por ende tendremos un consumo mayor de memoria.

Entorno asíncrono

Añadiendo la anotación @NonBlocking Quarkus invoca al un método, llamémoslo “handler o manejador” como un hilo, donde las peticiones llegarán a él y distribuirá las solicitudes de manera eficiente. De esta forma, Quarkus reduce el consumo de memoria y se mejora y el rendimiento, el conocido throughput

Conclusión

  • @NonBlocking es útil si la mayoría de tu código es imperativo y no quieres escribir código reactivo o código asíncrono, es decir, simplifica la gestión de hilos.

  • @NonBlocking no hace que tu código se convierta en asíncrono

  • Si estás usando JAX-RS (Response) para manejar repuestas @NonBlocking es necesario porque el código es netamente imperativo

  • Se debe de evitar APIS bloqueantes, por ejemplo, tienes que realizar una consulta a una base de datos(JPA) o llamada síncrona a una API externa, evita usar @NonBlocking porque anularía los beneficios que da esta anotación

0
Subscribe to my newsletter

Read articles from Christian Loza Peralta directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Christian Loza Peralta
Christian Loza Peralta

I am Christian Loza Peralta, working as a technical leader specialized in software engineering and software architecture. My expertise lies in the development of scalable and secure applications, utilizing agile methodologies, as well as in the implementation of cloud-based solutions and the adoption of microservices architectures. Furthermore, my interest in philosophy and anthropology shapes my holistic approach to designing solutions that are not only technically robust but also contribute to technological culture. With a constant commitment to learning and improvement, I aim to tackle projects from a comprehensive perspective that combines technical and cultural effectiveness