Desacoplando peticiones REST con NiFi

Como montar un sistema de comunicación asíncrono usando NiFi

Hace unos días estuve hablando sobre la posibilidad de desacoplar las peticiones de una aplicación web, de la ejecución de la tarea en el servidor.
Las aplicaciones web que se ejecutan sobre protocolo http, orientado a petición/respuesta. En una arquitectura clásica, tienen un problema de base que hace que si alguna parte de la aplicación comienza a ir lenta se produzca un efecto bola de nieve y el rendimiento general de la aplicación se vea afectado. Para solventar este problema, intrínseco al propio diseño http y a la visión clásica de lo que es una aplicación web, un api rest etc.., se desacoplan parte de la misma. Proyectos o técnicas como las siguientes sirven para mitigar este problema usando patrones de asincronía:

Todas ellas técnicas relacionadas con evitar el bloqueo en la parte de servidor. En cualquier caso sigue existiendo un problema de base, que consiste en desacoplar la parte de la petición que va desde el navegador hasta el frontal web, ya que las peticiones son sincronas, es decir se bloquean hasta que el servidor responde. Para resolver esta parte del problema podemos hacer varias cosas
 * Pooling desde nuestra aplicación web (y desacople de la petición original).
 * Usar websockets para coordinar las respuestas que llegan a la aplicación (y desacople de la petición original).

Otra visión para resolver el problema globla es usar contenedores y microservicios, así podemos hacer crecer los recursos de manera controlada en base a las necesidades puntuales de la aplicación y evitamos el efecto bola de nieve.

Una vez visto cual es el problema general he intentado plasmar en una PoC con NiFi esa visión de desacople de la petición inicial. Para ello desde NiFi se ha levantado
 * Un servidor web en el puerto 9997
 * Un api rest en el puerto 9998
 * Un api websocket en el puerto 9999

Si nos conectamos al servidor web nos devuelve un html que levanta un websocket por el que comunicarse con el servidor, además el ejemplo permite mandar información por el api rest y que vuelva a la aplicación web por el canal websocket establecido.

Es únicamente una prueba de concepto y habría que trabajar bastantes puntos de la misma para considerarla productiva, pero como prueba sirve para ver las posibilidades de desacople entre una interfaz web y el servidor usando nifi, websockets y un api rest

La template de nifi está publicada en el siguiente link Update: Nueva template que la anterior no tenía puestas las cabeceras de CORS y AJAX da problemas

Para probar la PoC podemos hacer los siguiente

1) Arrancar los Handelers de request y respones de HTTP de nifi, que levantarán un servidor web en el puerto 9997


2) Arrancar el ListenerHTTP que levantará el API rest en el puerto 9998


3) Arrancar el ListenerWebsocket que levantará el canal WS en el puerto 9999

Una ve esté el sitstema levantado, podemos acceder, desde el navegador a la url http://localhost:9997 que nos devolverá la siguiente página web

Esta página establece un canal websocket, las características de este channel se almacenan en una cache en NiFi vinculadas a un token. Si pinchamos en el link de enviar mensaje usando el canal websocket se enviará el mensaje por el canal websocket y será consumido y procesado por la parte del flujo de nifi que corresponde a dicho canal y se enviará la información de vuelta por el canal websocket. Pero si usa el link de enviar información por el canal rest se enviará otro mensaje a través del puerto 9998 (petición AJAX) que se procesará por el canal REST de NiFi, la respuesta se devolverá al cliente usando el websocket no el canal REST.

En esto consiste la prueba de concepto, que habría que mejorar desde varios puntos
 * Seguridad
 * Rendimiento
 * Alta disponibilidad
 * etc..

00

Más entradas de blog

thumbnail
thumbnail

Añadir comentarios