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_connectque se ejecuta al conectarse al broker y suscribe al cliente atest/topic. - Se define un callback
on_messageque 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.comy 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
channely 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
wsen 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/topicy 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
