martes, 22 de noviembre de 2022

FUNDAMENTOS DE NODE-RED

https://www.techedgegroup.com/es/blog/fundamenos-node-red

FUNDAMENTOS DE NODE-RED


Node-RED: ''Low-code programming for event-driven applications''

"Low-code programming for event-driven applications": Así es cómo esta herramienta se autodescribe en su página web [9] (https://nodered.org), y no creo que exista mejor forma de definir esta versátil y poderosa herramienta en base a nuestra experiencia de uso en diferentes áreas de aplicación: dispositivos "edge computing" en proyectos de IoT, aceleración de escenarios de Integración y tratamiento de eventos de negocio ('Business Events'), o la automatización de la captura, estructuración y refinamiento de datos en sus fuentes de origen en proyectos de Big-Data, por mencionar solo algunos.

En el cada vez más interconectado mundo en que nos movemos, multitud de dispositivos, aplicativos y componentes de todo tipo, tamaño y funcionalidad, se están conectando, ofreciendo una fuente ingente de datos. Esto significa que dichos datos se están recogiendo y acumulando en diferentes repositorios a una velocidad asombrosa. ¿Qué se puede hacer con todos estos datos?, ¿Cómo puede aprovecharse todo su potencial?, ¿Cómo convertirlos en información valiosa?, ¿Cómo extraer de ellos eventos de negocio o indicadores de alarma significativos?, ¿Cómo diseñar una arquitectura de solución que nos permita “cabalgar” con éxito esta ola?

Node-RED es uno de las componentes clave de dicha arquitectura de solución. Como herramienta visual, facilita extraordinariamente la captura de eventos del mundo real, permite agregar cierto grado de inteligencia en nodos de tratamiento/transformación de datos y utilizar nodos especializados para integrar dichos eventos con todo tipo de sistemas de mensajería, como por ejemplo MQTT, AMQP o Apache Kafka. También es posible en plataformas sociales como Twitter o Facebook y sistemas de persistencia de datos como Bases de Datos Relacionales y NoSQL, como MongoDB y Redis. Todo ello se lleva a cabo con la finalidad de crear aplicaciones que puedan reaccionar de forma ágil y precisa ante el  complejo mundo existente a su alrededor, y aportar la “materia prima elaborada” a los otros componentes de la arquitectura global de tratamiento de la información.

NODE-RED, es una herramienta de código libre (Open Source) construida en Node.js [1] y que se encuadra en la familia de herramientas "flow-based programming (FBP) tools" ('Herramientas de programación basadas en flujos'[2]. Originalmente desarrollado por el equipo de Emerging Technology Services de IBM [3], es ahora parte de la OpenJS Foundation [4], cuenta con una creciente comunidad de desarrollo muy activa y goza actualmente de un gran predicamento y una amplia difusión de aplicación en multitud de proyectos innovadores.

Origen y fundamentos

El concepto de "flow-based programming (FBP)" fue inventado por J. Paul Morrison en la década de los 1970, e inicialmente implementado en un software para un banco canadiense. En sus inicios estuvo fuertemente influenciado por algunos lenguajes de simulación de IBM de la época, en particular General Purpose Simulation System (GPSS) [5], pero sus raíces se remontan al documento seminal de Melvin Conway [6] sobre lo que denominó "coroutines" ('co-rutinas').

La programación basada en flujos es una forma de describir el comportamiento de una aplicación como una red de cajas negras o "nodos", como se les llama en Node-RED. Cada nodo tiene un propósito bien definido: recibe o captura algunos datos, realiza algún tratamiento con esos datos y luego los pasa a uno o varios nodos con los que se enlaza. La red constituye la configuración de cómo estos nodos se interconectan entre sí y es responsable del mantenimiento del flujo de datos entre los nodos.

Flujo de datos Node-RED

Es un modelo que se presta muy bien a una representación visual y lo hace más accesible para una gama más amplia de usuarios. Si alguien puede dividir un problema en pasos discretos, puede entonces observarlo como un flujo de etapas relacionadas entre sí y tener una idea completa y visual de lo que dicho flujo está haciendo, sin tener que conocer necesariamente ni bajar al nivel de detalle del código contenido en cada nodo.

Node-RED comenzó su vida a principios de 2013 como un proyecto colateral de Nick O’Leary y Dave Conway-Jones [7] del grupo de Emerging Technology Services de IBM [3], que pronto pasó de ser un proyecto colateral a convertirse en un producto estratégico en IBM.

Lo que comenzó como una simple prueba de concepto para poder visualizar y manejar flujos de transformación entre mensajes asociados a 'tópicos' de MQTT [8], se convirtió rápidamente en una innovadora herramienta de propósito mucho más general que se podía extender fácilmente para su aplicación en muchos otros campos. Nacida dentro del ámbito del desarrollo de prototipos de soluciones de Internet-of-Things (IoT), esta tecnología pronto demostró su capacidad de acelerar extraordinariamente su desarrollo y pruebas, a través de la conexión y configuración de nodos especializados de entrada, procesamiento y salida, transformando las soluciones IoT de complejos programas monolíticos a flujos de trabajo fáciles de entender, adaptar y extender.

En septiembre de 2013 se liberó como plataforma de código abierto, mantenida y enriquecida por una activa comunidad de desarrolladores, que culminó convirtiéndose, en octubre de 2016, en uno de los proyectos fundacionales de la OpenJS Foundation [4].

¿Qué es Node-RED?

En su página Web [9] se describe Node-RED como: 'Node-RED is a programming tool for wiring together hardware devices, APIs and online services in new and interesting ways.' Que podría traducirse como: 'Node-RED es una herramienta de programación que permite conectar entre sí dispositivos hardware, APIs y servicios en-linea en formas completamente nuevas e interesantes.'

rhinno-labs-contact

Entorno de Ejecución ('Runtime) ligero y multiplataforma

Como se ha indicado, Node-RED está construido en Node.js, aprovechando así las distintivas características de dicho lenguaje: su modelo 'no-bloqueante', 'orientado a eventos asíncronos' ('Event-Driven, Non-Blocking Model').

Esto dota a Node-RED de dos importantes características:

  1. Un runtime muy ligero con bajo consumo de recursos.
  2. La capacidad de poder ejecutarse en todos aquellos dispositivos y sistemas operativos en los que pueda correr Node.js [1] 

Ambas características permiten que Node-RED pueda instalarse y ejecutarse en un amplio rango de dispositivos y entornos de despliegue:

  • En dispositivos de bajo coste como Raspberry Pi o Beagelbone Black, permitiendo que puedan actuar como dispositivos "edge" o "pre-edge" cercanos a los dispositivos actuadores o sensores en una red IoT.
  • Correr localmente en ordenadores y servidores locales (on-premises) con sistemas operativos Windows, Linux o Mac, bien en forma de servicios en background o incluso como contenedores Docker. Esto permite una distribución de la capacidad de tratamiento de datos y eventos a través de la red de dispositivos de una empresa.
  • En la nube (Cloud) (Azure, AWS, GCP, IBM, ...), bien corriendo directamente como servicios en instancias de servidor virtual, bien corriendo en contenedores en servicios gestionados de orquestación de contenedores (Ej. Kubernetes), o incluso directamente como un servicio de Node-RED gestionado. La opción Cloud es especialmente interesante pues, además de facilitar la conexión con otras soluciones de tratamiento analítico de la información desplegados por la empresa, permite integrarse con el amplio espectro de otros servicios gestionados que ofrecen los diferentes proveedores de servicios Cloud, que van desde herramientas de análisis cognitivo, Machine Learning, Big-Data, Bases de Datos, mensajería distribuida, conectores con redes sociales...

Entorno de Ejecución ('Runtime) ligero y multiplataforma

Editor de Flujos basado en navegador

Cuando una instancia de Node-RED se está ejecutando, bien como resultado de la invocación de un script, bien corriendo como el ejecutable principal de un contenedor Docker, o bien como un servicio Windows/Linux, expone un acceso Web (cuyo puerto y protección de acceso son configurables) que permite levantar remotamente un editor gráfico de flujos basado completamente en navegador.

Editor de Flujos basado en navegador

Editor de Flujos basado en navegador

Editor de Flujos basado en navegador

 

Una vez dentro del navegador pueden crearse nuevos flujos arrastrando algunos de los tipo de nodo disponibles en una paleta lateral en el espacio de trabajo, conectándolos entre sí, estableciendo el flujo de proceso de datos y configurando los parámetros y atributos de dichos nodos.

 

Flujo de proceso de datos

 

Los nodos se conectan utilizando líneas de enlace ('wires') que unen sus puertos ('ports'). Un nodo puede tener como máximo un puerto de entrada y uno o más puertos de salida. Estas líneas de enlace ('wires') definen el flujo de datos que se establece entre los diferentes nodos.

Algunos puertos puede tener una 'etiqueta asociada' que se muestra cuando el ratón pasa sobre él para ofrecer una ayuda rápida sobre su función en el nodo. Por ejemplo, el nodo 'Switch' de la imagen muestra la regla asociada a la activación de la salida de datos por ese puerto:

 

Nodo 'Switch'

 

Asimismo, se pueden especificar 'etiquetas' en cada 'nodo', para facilitar de un vistazo una más rápida comprensión de su función/rol en el flujo de proceso de datos sin requerir entrar en su diálogo de edición/configuración para entender su cometido o funcionalidad. Estas etiquetas se personalizan en el cuadro de diálogo de edición/configuración de los nodos.

 

cuadro de diálogo de edición/configuración de los nodos

Existen tres tipos de nodos:

  • Nodos Iniciadores de flujo que ('Triggers') que inician o 'disparan' la ejecución de flujo de proceso:
    • Poseen únicamente 1 puerto de salida ('output').
    • Pueden ser 'activos'como aquellos que de forma periódica supervisan la activación de un evento determinado (un intervalo de tiempo, la llegada de un archivo en un directorio, la llegada de un nuevo tópico de MQTT al que está subscrito,...).
    • O bien 'pasivos'como aquellos que están 'a la escucha' de evento de activación generado externamente (por ejemplo los que escuchan la recepción de una petición API REST, gRPC o Websockets, por mencionar solo algunos).
  • Nodos Intermedios que realizan acciones con la información que reciben en el flujo de datos, realizan acciones con dicha información y traspasan los datos resultantes de dicha acción a los nodos siguientes con los que está enlazado a través de su puerto o puertos de salida:
    • Poseen únicamente 1 puerto de entrada ('input')
    • Poseen 1 ó más puertos de salida ('output')
    • Realizan acciones como (por mencionar sólo algunas):
      • Transformación de formato (JSON, YAML, CSV, XML, binario, ... )
      • Invocación de APIs, o en general, servicios expuestos externamente.
      • Persistencia en fichero, Bases de Datos (SQL/NoSQL), etc.
      • Reglas de bifurcación, de retardo, de descarte de mensajes según condiciones, etc. 

        Nodos de Ejecución de código:
        • 'function node' que permite la incorporación de código Node.js propio ('custom code') para el tratamiento de los datos recibidos o realizar acciones especializadas. Para este tipo de nodos se dispone de un editor 'rich-text' incorporado. Con más de 225.000 módulos en el repositorio de paquetes de Node, es fácil extender y agregar nuevas capacidades con el único límite que imponga la imaginación.
          Captura de pantalla 2020-04-17 a las 20.31.21
        • 'exec node' que permite la ejecución de 'scripts' o ejecutables accesibles en el entorno de ejecución. Esto amplía las capacidades extraordinariamente permitiendo incorporar o re-utilizar elementos desarrollados en otros lenguajes de programación (Python Java, C++, Go...)
          Captura de pantalla 2020-04-17 a las 20.31.29
  • Nodos Terminales de flujo ('end nodes') que se disponen al final de ramas del flujo de datos y 'disparan' acciones específicas cuando el flujo de datos en dicha rama los alcanzan:
    • Poseen únicamente 1 puerto de entrada ('input').
    • Entre las acciones que pueden 'disparar' (por mencionar las más frecuentes):
      • Disparar la ejecución de otros flujos Node-Red.
      • Invocar otros servicios expuestos externamente (enviado mensajes a un backend, arrancando la ejecución de un workflow BPM, ...)
      • Mostrar información de 'traza' con el contenido de los datos en es punto de flujo.
      • Generar 'eventos de negocio' en sistemas de mensajería (AMQP, MQTT, ...) o 'eventos de notificación' en sistemas de mensajería social (Twitter, Telegram...)

Nodos Terminales de flujo

 

Extensibilidad

La solución viene de partida ('out-of-the-box') con una amplia colección de nodos:

Colección de nodos

 

Esta paleta de nodos puede ser fácil y rápidamente extenderse mediante la instalación de nuevos nodos especializados en forma de 'plugins oficiales' que la fundación que da soporte a Node-RED proporciona, o bien en forma de 'plugins' que una amplia comunidad de desarrolladores comparte y mantiene.

Paleta de nodos

Preparada para un trabajo en equipo y la re-usabilidad de componentes

Toda la lógica resultante del trabajo realizado a través del editor se aloja internamente en un archivo JSON. Esto permite que pueda ser fácilmente compartido por equipos de trabajo a través de repositorios de gestión de fuentes y versiones, ser importado en otros entornos Node-RED (desarrollo, calidad, producción, ...), o servir de plantilla de comienzo para la creación de nuevos flujos en entornos separados y facilitar su incorporación en pipelines CI/CD.

 

Archivo JSON

Este archivo contiene el conjunto de flujos que pueden configurarse de forma separada en el editor organizados en pestañas.

NOTA: Por razones obvias de seguridad, las credenciales (por ejemplo contraseñas) que se almacenan en los llamados 'nodos de configuración' ('Configuration nodes') NO  persisten en el archivo y deben ser configuradas de nuevo en los entornos en los que se importa, permitiendo con ello una separación nítida de las credenciales que deben configurarse específicamente para cada entorno.

Organización pestañas en el editor

Con un simple click sobre el desplegable de "Deploy"el flujo que se acaba de crear (o modificar) se guarda y se despliega de vuelta (junto con los otros flujos que lo acompañan en las otras pestañas) en el entorno donde se está ejecutando y el flujo de trabajo global se reanuda.

Desplegable de "Deploy"

Incorpora una forma de librería interna ('built-in library') que permite guardar funciones de utilidad y sub-flujos ('sub-flows') para su posterior reutilización.

Dashboards

Es importante destacar igualmente que una de sus capacidades menos conocida, pero no por ello de menor importancia y utilidad, es la capacidad de poder crear y desplegar 'Cuadros de Mando' ('Dashboards') a los que se puede acceder remotamente vía navegador y cuyo acceso puede ser, al igual que lo descrito para el editor, protegido con credenciales de acceso.

Cuadro de Mando

Escenarios de uso

  • Escenarios IoT ('Internet-of-Things').

Como se ha mencionado, la herramienta Node-RED surge desde su nacimiento estrechamente relacionada con la agilización de proyectos de IoT ('Internet-of-Things') y como tal es en este tipo de escenarios donde su uso está más difundido.

Es frecuente verla presente en múltiples puntos/etapas/niveles de la red de procesamiento de datos procedentes de sensores y su tratamiento y canalización hacia los repositorios de datos donde se integran y extrae información analítica de negocio.

Cada vez más esta red de tratamiento sigue el patrón conocido cómo 'Hierarchical and Autonomous Fog Architecture for IoT' o simplemente 'Fog Architecture for IoT' [10][11][12] que se sintetiza en la siguiente figura [10]:

Fog Architecture for IoT

y podemos ver el uso de Node-RED en muchos de los nodos ('Fog nodes') de las diferentes capas o niveles ('Fog layers'):

    • En dispositivos 'edge' realizando la captura, diferentes tratamientos (estructuración, conversión, agregación, combinación, filtrado, etc) de las señales procedentes de un conjunto de sensores y su envío a componentes del nivel superior, habitualmente a través de soluciones de mensajería asíncrona (MQTTApache KafkaApache PulsarAMQP brokers...)
    • En dispositivos 'gateway' de niveles superiores, facilitando/complementando el tratamiento armonizado de los datos recibidos habitualmente a través de la mensajería asíncrona, desde uno o varios de los nodos inferiores y su envío a componentes del nivel superior, o directamente al final en la capa de tratamiento analítico en Cloud. Aquí es común ver Node-RED combinado con soluciones de 'Machine-Learning - ML' y/o 'Complex Event Processing - CEP'
    • Ámbitos más frecuentes de IoT:
    • En entornos industriales y de fabricación.
    • Smart-Cities.
    • Trazabilidad en Retail y logística.
    • Smart Hotels / Smart Buildings.
    • Control de presencia.
    • ... y un largo etcétera.
  • Escenarios EDA ('Event-Driven-Architectures') y Big Data:
    • Facilitar la captura, tratamiento y generación de fuentes de 'eventos de negocio' en los sistemas de datos en origen (algo parecido a un "micro ETL") y envío a etapas posteriores de tratamiento, habitualmente a través de soluciones de mensajería asíncrona.
    • Captura y tratamiento de 'eventos de negocio derivados' en etapas posteriores de tratamiento de eventos complejos. Nuevamente aquí es común ver igualmente Node-RED combinado con soluciones de 'Machine-Learning - ML' y/o 'Complex Event Processing - CEP'.
  • Escenarios de interacción con Redes Sociales:

    Por la riqueza de conectores con las diferentes Redes Sociales (Twitter, Telegram botnets...) es muy frecuente ver aplicaciones de Node-RED como facilitadores de la captura de eventos/mensajes en dichas redes, así cómo de su creación/emisión combinados con otros componentes de análisis cognitivoML/AI, etc.
  • Otros:
    • Como 'micro soluciones/middleware de integración' de aplicaciones/sistemas.
    • Como 'micro soluciones de RPA (Robotic Process Automation'.
    • Como 'micro soluciones de ETL (Extract, Transform & Load'.

Próximos artículos:

Este artículo constituye el primero de una serie de artículos donde se irá desgranando su instalación en diferentes entornos y ejemplos prácticos de uso.

Para saber más:



No hay comentarios:

Publicar un comentario