En este tema, exploraremos los sistemas de mensajería en tiempo real, que son fundamentales para aplicaciones que requieren comunicación instantánea y continua entre diferentes componentes o usuarios. Estos sistemas son esenciales en aplicaciones como chats en línea, notificaciones en tiempo real, y sistemas de monitoreo.
Conceptos Básicos
¿Qué es la Mensajería en Tiempo Real?
La mensajería en tiempo real se refiere a la transmisión de mensajes entre sistemas o usuarios con una latencia mínima, permitiendo una comunicación casi instantánea. Los sistemas de mensajería en tiempo real son diseñados para manejar grandes volúmenes de mensajes y garantizar la entrega rápida y confiable.
Características Clave
- Baja Latencia: Los mensajes deben ser entregados casi instantáneamente.
- Alta Disponibilidad: El sistema debe estar disponible en todo momento.
- Escalabilidad: Capacidad para manejar un gran número de conexiones y mensajes simultáneamente.
- Consistencia: Asegurar que los mensajes se entreguen en el orden correcto y sin pérdidas.
Protocolos de Mensajería en Tiempo Real
WebSockets
WebSockets es un protocolo que proporciona comunicación bidireccional entre un cliente y un servidor sobre una única conexión TCP. Es ideal para aplicaciones que requieren actualizaciones en tiempo real.
Ejemplo de WebSocket en JavaScript
// Crear una nueva conexión WebSocket const socket = new WebSocket('ws://example.com/socket'); // Evento cuando la conexión está abierta socket.addEventListener('open', function (event) { socket.send('Hello Server!'); }); // Evento cuando se recibe un mensaje socket.addEventListener('message', function (event) { console.log('Message from server ', event.data); });
Explicación:
- Se crea una nueva conexión WebSocket a
ws://example.com/socket
. - Se envía un mensaje "Hello Server!" cuando la conexión está abierta.
- Se escucha y se imprime cualquier mensaje recibido del servidor.
MQTT
MQTT (Message Queuing Telemetry Transport) es un protocolo ligero de mensajería diseñado para conexiones con ancho de banda limitado y alta latencia. Es comúnmente utilizado en IoT (Internet de las Cosas).
Ejemplo de MQTT en Python
import paho.mqtt.client as mqtt # Callback cuando se conecta al broker def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("test/topic") # Callback cuando se recibe un mensaje def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("mqtt.example.com", 1883, 60) client.loop_forever()
Explicación:
- Se define un callback
on_connect
que se ejecuta al conectarse al broker y suscribe al cliente atest/topic
. - Se define un callback
on_message
que se ejecuta al recibir un mensaje y lo imprime. - Se crea un cliente MQTT y se asignan los callbacks.
- Se conecta al broker MQTT en
mqtt.example.com
y se inicia el bucle de eventos.
Arquitecturas de Sistemas de Mensajería en Tiempo Real
Publicación/Suscripción (Pub/Sub)
En este modelo, los productores de mensajes (publicadores) envían mensajes a un "topic", y los consumidores (suscriptores) reciben mensajes de los topics a los que están suscritos. Este modelo desacopla a los productores de los consumidores, permitiendo una mayor flexibilidad y escalabilidad.
Ejemplo de Pub/Sub con Redis
import redis # Publicador def publisher(): r = redis.Redis() while True: message = input("Enter message: ") r.publish('channel', message) # Suscriptor def subscriber(): r = redis.Redis() pubsub = r.pubsub() pubsub.subscribe('channel') for message in pubsub.listen(): print(message['data']) # Ejecutar en diferentes terminales # publisher() # subscriber()
Explicación:
- El publicador envía mensajes al canal
channel
. - El suscriptor escucha mensajes del canal
channel
y los imprime.
Ejercicios Prácticos
Ejercicio 1: Implementar un Chat en Tiempo Real con WebSockets
Objetivo: Crear una aplicación de chat simple utilizando WebSockets.
Instrucciones:
- Configura un servidor WebSocket utilizando una biblioteca como
ws
en Node.js. - Crea una interfaz de usuario simple en HTML y JavaScript que permita a los usuarios enviar y recibir mensajes.
- Asegúrate de que los mensajes se muestren en tiempo real en todos los clientes conectados.
Solución:
// Servidor (Node.js) const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', function connection(ws) { ws.on('message', function incoming(message) { wss.clients.forEach(function each(client) { if (client.readyState === WebSocket.OPEN) { client.send(message); } }); }); }); // Cliente (HTML + JavaScript) <!DOCTYPE html> <html> <body> <input id="message" type="text"> <button onclick="sendMessage()">Send</button> <ul id="messages"></ul> <script> const socket = new WebSocket('ws://localhost:8080'); socket.onmessage = function(event) { const li = document.createElement('li'); li.textContent = event.data; document.getElementById('messages').appendChild(li); }; function sendMessage() { const message = document.getElementById('message').value; socket.send(message); } </script> </body> </html>
Explicación:
- El servidor WebSocket en Node.js escucha en el puerto 8080 y retransmite cualquier mensaje recibido a todos los clientes conectados.
- El cliente HTML permite a los usuarios enviar mensajes y muestra los mensajes recibidos en una lista.
Ejercicio 2: Configurar un Broker MQTT y Publicar/Suscribir Mensajes
Objetivo: Configurar un broker MQTT y crear scripts de publicación y suscripción en Python.
Instrucciones:
- Instala un broker MQTT como Mosquitto.
- Crea un script en Python para publicar mensajes a un topic.
- Crea un script en Python para suscribirse a un topic y recibir mensajes.
Solución:
# Publicador import paho.mqtt.client as mqtt client = mqtt.Client() client.connect("localhost", 1883, 60) while True: message = input("Enter message: ") client.publish("test/topic", message) # Suscriptor import paho.mqtt.client as mqtt def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client = mqtt.Client() client.on_message = on_message client.connect("localhost", 1883, 60) client.subscribe("test/topic") client.loop_forever()
Explicación:
- El publicador envía mensajes al topic
test/topic
. - El suscriptor escucha mensajes del topic
test/topic
y los imprime.
Conclusión
En esta sección, hemos explorado los sistemas de mensajería en tiempo real, sus características clave, y los protocolos más utilizados como WebSockets y MQTT. También hemos visto ejemplos prácticos y ejercicios para implementar sistemas de mensajería en tiempo real. Estos conocimientos son fundamentales para desarrollar aplicaciones que requieren comunicación instantánea y eficiente entre diferentes componentes o usuarios.
Curso de Arquitecturas Distribuidas
Módulo 1: Introducción a los Sistemas Distribuidos
- Conceptos Básicos de Sistemas Distribuidos
- Modelos de Sistemas Distribuidos
- Ventajas y Desafíos de los Sistemas Distribuidos