Curso de Backend con Node.js: API REST con Express.js

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

Para este tutorial explicaré cómo implementé la tecnología Socket.IO en mi servidor de ventas con Express y MySQL.

  1. Introducción

Al crear un servidor, es fundamental restringir el acceso y modificación de datos sensibles, como un inventario o registros de ventas. Para ello, implementamos un inicio de sesión como primera capa de seguridad. Además, asignamos diferentes roles a los usuarios para gestionar permisos de acceso, por ejemplo:

  • Administrador
  • Gerente
  • Supervisor
  • Colaborador
  • Visualizador

El nombre de cada rol define los permisos que tiene cada usuario en el sistema.

  1. Beneficios de Socket.IO

La integración de Socket.IO en el cliente y el servidor presenta varias ventajas:

En las API REST tradicionales, la conexión HTTP se abre y cierra con cada solicitud, lo que genera una mayor carga si se realizan peticiones constantes para verificar cambios.

Con un socket, la conexión permanece activa entre cliente-servidor, permitiendo una comunicación en tiempo real sin necesidad de consultas repetitivas.

Cada acción de CRUD puede estar asociada a eventos de socket que notifican a los clientes sobre los cambios en los datos en tiempo real.

Sin embargo, un problema surge cuando todos los sockets se agrupan en un solo conjunto, asignando eventos para diferentes rutas como:

  • /productos
  • /categorias
  • /ventas
  • /compras
  • /usuarios

Esto genera una sobrecarga y dificulta la organización de los eventos y la distribución eficiente de los datos.

2.a. Solución: Agrupación en Nodos

Para mejorar la organización, decidí agrupar los sockets utilizando las variables rol_id, usuario_id y apikey, pero principalmente, segmentando la ruta ingresada.

2.b. Estructura en árbol

Implementé una estructura basada en nodos con un árbol jerárquico:

El nodo principal almacena la ruta base /.

Cada socket que se conecta se descompone por cada / de su ruta.

Por ejemplo, si la conexión proviene de /control/mantenimiento/inventario, se generarían tres nodos jerárquicos que organizan la estructura y facilitan la gestión de los sockets.

Cada nodo mantiene referencias a los sockets en memoria, permitiendo una mejor distribución de los eventos y optimizando la emisión de datos.

2.c. Ventajas de esta estructura

Permite una búsqueda eficiente de sockets asociados a rutas específicas.

Optimiza la emisión de eventos solo a los clientes correspondientes.

Mejora la escalabilidad del sistema al evitar la sobrecarga de sockets en una sola estructura.

  1. Implementación

Para la implementación de esta solución, utilicé una clase SocketNode que:

Crea nodos según la ruta del socket.

Mantiene una colección de sockets agrupados por rol, usuario y apikey.

Filtra los eventos para que solo los clientes relevantes reciban las actualizaciones.

En el código, la estructura de la clase permite manejar los eventos y conexiones de manera eficiente, evitando la necesidad de recorrer todos los sockets indiscriminadamente.

3.a. Código

https://github.com/HannsMP/Sistema_Ventas_REHF

3.b. Archivos importantes

  • /controller/socket.js: En este archivo se encuentra la creación de la instancia de SocketNode, además de cómo cada _socket _conectado es incorporado a la estructura.
  • /routes/contro/: Contiene las rutas y callbacks para asignar funciones CRUD a cada socket conectado.
  • /utils/socketNode.js: Define la estructura del árbol de nodos y su distribución.
  • /model/: Gestiona la interacción con la base de datos y, en caso de operaciones CRUD exitosas, emite cambios a los sockets de la ruta correspondiente.
  1. Conclusión

La implementación de una estructura en árbol para la gestión de sockets ha permitido una mejor organización de las conexiones y eventos en mi servidor de ventas. Gracias a esta solución, se optimizó la búsqueda y distribución de eventos, reduciendo la sobrecarga y mejorando la escalabilidad del sistema. Además, esta arquitectura facilita la administración de permisos y garantiza que solo los clientes relevantes reciban actualizaciones en tiempo real.

En futuras mejoras, se podría optimizar aún más la estructura mediante la integración de índices para acelerar las búsquedas o implementar una lógica de reconexión automática para manejar desconexiones inesperadas. Esto garantizaría una experiencia más fluida y confiable para los usuarios del sistema.

…Solo tenlo encuenta 😊

Curso de Backend con Node.js: API REST con Express.js

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

0 Comentarios

para escribir tu comentario

Artículos relacionados