# Arquitectura de Procesamiento de Datos en Streaming con Elixir: De Hello World a Acoplamiento Flojo
Construir un sistema de motores interconectados en Elixir requiere una clara separación de capas y una integración fluida con dependencias externas. Este artículo profundiza en la implementación de nodos centrales para procesamiento de datos en streaming —incluyendo fuentes, sumideros y un despachador central— con énfasis en principios arquitectónicos sólidos y soluciones prácticas.
Clasificación de Nodos de Hardware y Fuentes de Datos
En el procesamiento de datos en streaming, los nodos terminales del grafo son clave: se conectan directamente con el hardware. En la capa inferior están las fuentes de datos, clasificadas por tipo de entrada:
- Teclado (Setpoint): Para ingresar datos alfanuméricos, como valores de consigna en sistemas de control.
- Puertas Regulares (R_gateway): Controladores para buses con flujos de datos constantes, como Modbus en automatización industrial.
- Puertas Irregulares (Ir_gateway): Adaptadores para ráfagas de datos esporádicos, como el bus CAN en vehículos modernos conectado a la unidad de control central.
En la capa superior están los consumidores de datos, agrupados bajo la clase Stock:
- Pantallas para mostrar información.
- Sistemas de archivos para registrar eventos y errores.
- Bases de datos o repositorios como almacenamiento intermedio.
- Sistemas de nivel superior que encadenan motores mediante nodos de puerta.
Esta configuración crea un grafo de flujo de datos donde los nodos inferiores alimentan información hacia arriba, saltándose la capa de motores intermedia al inicio.
Implementación de Nodos Centrales y Simulación de Flujos
Para demostrar el sistema, creamos tres nodos fuente y un nodo sumidero —sin apoyarnos en GenServer OTP—. Estos usan funciones loop simples en bucle, manteniendo todo ligero y directo:
- Módulo de Entrada por Terminal: Permite escribir datos alfanuméricos, como el clásico "¡Hola, Mundo!".
- Simulador de Datos Regulares: Bucle infinito que inyecta "Hola, " en el flujo cada segundo.
- Simulador de Datos Irregulares: Bucle infinito que lanza "¡Mundo! " al flujo en intervalos de hasta 1 segundo.
- Sumidero de Salida por Terminal: Muestra en pantalla todos los datos alfanuméricos entrantes de cualquier fuente.
La capa de motores intermedia queda vacía por diseño en esta versión inicial. El código completo con motores funcionales estará disponible en GitHub para transparencia y fácil extensión.
Distribución de Terminales y el Despachador Central
Un gran desafío fue manejar la E/S de terminales ligada a procesos locales. Por defecto, Erlang canaliza toda la E/S de los nodos a un solo terminal para control centralizado —lo que no siempre encaja en configuraciones distribuidas—. ¿La solución? Este operador:
:global.register_name(:stock_ldr, :erlang.group_leader)
Divide el sistema en terminales dedicados, aunque localizarlo tomó una eternidad por la documentación incompleta.
Para cargar y arrancar el sistema, agregamos un despachador central. Al integrar librerías de terceros en Elixir, la mejor práctica es un módulo interno único como puerta de entrada a lo externo —promoviendo acoplamiento flojo—. La arquitectura hexagonal empuja las dependencias a los bordes, aislando la lógica de negocio de los efectos secundarios. En la práctica, sin embargo, lograrlo es complicado con montones de módulos externos como puertas de hardware y sumideros de datos.
Principios Arquitectónicos y Escalabilidad
El sistema de motores está diseñado para extenderse fácilmente: cualquier extremo del grafo actúa como puerta al mundo exterior. Esto permite conectar componentes personalizados libremente, evolucionando hacia aplicaciones del mundo real. Idea clave: el sistema crece "hacia abajo" en aplicaciones, invirtiendo la mentalidad arquitectónica top-down habitual.
Consejos para desarrolladores:
- Procesos basados en bucles simples superan a GenServer OTP para nodos base —más fáciles de implementar, pero planea el manejo de errores con cuidado—.
:global.register_nameresuelve el problema de E/S centralizada de Erlang.- El acoplamiento flojo con externos es difícil, incluso con ideales hexagonales.
Lecciones Clave:
- Clases de nodos como R_gateway, Ir_gateway, Setpoint y Stock dan estructura clara al streaming.
- Simuladores de datos prueban que el sistema funciona sin motores intermedios.
- La distribución de terminales requiere trucos ingeniosos de Erlang.
- Despachador central e integraciones externas priorizan acoplamiento flojo.
- Nodos de puerta hacen el sistema extensible a dominios prácticos.
— Editorial Team
Aún no hay comentarios.