Comunicando procesos en tiempo real con Redis | Programador Web Valencia

Comunicando procesos en tiempo real con Redis

2 minutos

Redis

Vamos a ver un ejemplo de cómo comunicar en tiempo real diferentes procesos, contenedores, servidores o incluso diferentes lenguajes, usando Redis.

Si estas familiarizado con sistemas de mensajería como RabbitMQ o Kafka, sigue siendo interesante usar Redis para reducir la complejidad de tu arquitectura. Además, si ya tienes Redis en tu stack, puedes aprovecharlo para esta tarea.

En el ejemplo utilizaré Python, ya que es un lenguaje fácil de comprender. Pero puedes implementar los mismos conceptos en otros lenguajes.

El objetivo del artículo será mostrar como podemos modificar un valor en Redis y escuchar ese cambio en tiempo real en cualquier otro proceso. Lo cual se puede proyectar a otro elementos como contenedores, servidores, etc. Lo importante es que todos los procesos estén conectados a Redis, independientemente de la infraestructura.

En el ejemplo, jugaremos con un diccionario de datos de un usuario. Dentro habrá un email, username y una lista de artículos de compra (shopping_cart). Esta última será representada por números enteros, que serán los IDs de los artículos. Cada cierto tiempo añadiremos un artículo a la lista y escucharemos ese cambio en tiempo real.

Primero instalamos la librería de Redis para Python:

pip install redis

Creamos un archivo llamado users.py con el siguiente contenido:

import redis
from random import randint

my_redis = redis.from_url("redis://localhost:6379/0")

data = {
    "email": "foo@boo.com",
    "username": "foo",
    "shopping_cart": [],
}

while True:
    # Add a new article to the list
    data['shopping_cart'].append(randint(1, 100))
    my_redis.set('user', json.dumps(data))
    time.sleep(1)

Es importante convertir el diccionario a JSON antes de guardarlo en Redis, ya que solo podemos guardar strings, enteros o floats, no objetos.

Ahora creamos un archivo llamado listener.py con el siguiente contenido:

import redis

my_redis = redis.from_url("redis://localhost:6379/0")

with my_redis.monitor() as m:
    # Listen the SET command: SET {name} {new value}
    for command in m.listen():
        if command['command'].startswith(f'SET user'):
            data = json.loads(my_redis.get('user').decode('utf-8'))
            print(f"User data: {data.get('shopping_cart')}")
  • La función monitor de Redis nos permite escuchar todos los comandos que se ejecutan en Redis. En este caso, solo nos interesa el comando SET user, que es el que estamos utilizando para modificar el diccionario de datos del usuario.
  • Cuando recuperemos el valor de Redis, lo convertimos de nuevo a un diccionario de Python.
  • Imprimimos la lista de artículos del usuario.

Ahora levantamos un servidor de Redis en el puerto 6379. Puedes usar Docker para ello.

docker run -d -p 6379:6379 redis

Ya podemos ejecutamos el archivo users.py y listener.py. Recuerda hacerlo en diferentes terminales.

python users.py
python listener.py

Si todo ha ido bien, verás en el segundo terminal como va creciendo la lista de artículos del usuario cada segundo.

Puedes levantar más instancias de listener.py y verás como todos los procesos están conectados.

Ahora ya puedes aplicar estos conceptos a tus proyectos. Tal vez cuando cambie la variable del usuario is_active, le envía otro proceso un email de bienvenida. Cada vez que se añada un artículo, se envía un nuevo HTML por WebSockets al carrito del cliente. Implementas un sistema de notificaciones en tiempo real, etc.

El límite lo pones tú.

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me invitas a un café? ☕

Puedes hacerlo usando el terminal.

ssh customer@andros.dev -p 5555

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario

Tal vez también te interese...