# [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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1738472857125/b58462e7-6045-4b03-a4b5-b12d9e1d681c.png align="center")

## 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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1738473002781/4db8793e-2ccd-4f9b-ac10-a121ae8a2e41.png align="center")

## 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*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1738473833446/e1281751-efd5-40fe-ab4f-2bb01fb71abd.png align="center")

# 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
