Concepto clave
Las colas de trabajos en Redis son estructuras de datos que permiten procesar tareas de forma asíncrona y distribuida. Imagina un restaurante donde los clientes piden comida (tareas) y los cocineros (workers) las preparan en orden. Redis actúa como el sistema de tickets que organiza los pedidos, asegurando que nada se pierda y que se atiendan en el orden correcto, incluso si hay múltiples cocineros trabajando simultáneamente.
En producción, esto es crucial para manejar picos de tráfico sin bloquear la aplicación principal. Por ejemplo, cuando un usuario hace un pedido en tu e-commerce, en lugar de procesar inmediatamente el pago, envío de correo y actualización de inventario (lo que podría tardar segundos), la aplicación solo agrega un "trabajo" a la cola y responde rápidamente al usuario. Los workers (procesos en segundo plano) luego toman esos trabajos y los ejecutan sin afectar la experiencia del usuario.
Cómo funciona en la práctica
Veamos un ejemplo paso a paso usando Redis Lists para implementar una cola simple:
- La aplicación principal recibe un nuevo pedido y lo serializa a JSON
- Usa el comando
LPUSH pedidos_queue '{"id": 123, "usuario": "[email protected]", "total": 99.99}'para agregar el trabajo al final de la lista - Un worker en segundo plano ejecuta constantemente
BRPOP pedidos_queue 0para esperar y tomar el siguiente trabajo (0 significa esperar indefinidamente) - Cuando obtiene un trabajo, lo procesa: valida pago, actualiza base de datos, envía confirmación
- Si hay error, puede reencolar el trabajo o moverlo a una cola de fallos
En producción, considera usar bibliotecas como Bull (Node.js) o RQ (Python) que manejan automáticamente reintentos, prioridades y monitoreo.
Caso de estudio
Implementemos un sistema real para procesar pedidos en un e-commerce con 10,000 pedidos diarios. La arquitectura incluye:
| Componente | Función | Configuración Redis |
|---|---|---|
| API Principal | Recibe pedidos, valida datos básicos | LPUSH a cola "pedidos:pending" |
| Worker de Pagos | Procesa transacciones con gateway externo | BRPOPLPUSH entre "pedidos:pending" y "pedidos:processing" |
| Worker de Inventario | Actualiza stock y prepara envío | Usa SETNX para locks en productos |
| Worker de Notificaciones | Envía emails y SMS | Publica eventos a canal Pub/Sub para logging |
Métrica clave: tiempo de procesamiento promedio de 2 segundos por pedido, con capacidad de pico de 100 pedidos/segundo usando 5 workers escalables.
Errores comunes
- No manejar fallos de workers: Si un worker muere mientras procesa, el trabajo se pierde. Solución: usar BRPOPLPUSH para mover a cola de procesamiento, y verificar periódicamente trabajos "atascados".
- Colas infinitas sin monitoreo: Si los workers son más lentos que la entrada, Redis puede quedarse sin memoria. Solución: establecer límites de tamaño y alertas cuando se alcance el 80% de capacidad.
- Procesamiento no idempotente: Si un trabajo se procesa dos veces (por reintento), puede duplicar cargos. Solución: diseñar trabajos para que sean idempotentes, usando IDs únicos y verificando estado antes de actuar.
- Falta de priorización: Todos los pedidos iguales cuando algunos son urgentes. Solución: usar múltiples colas (alta/media/baja prioridad) o sorted sets con scores de prioridad.
- No planificar escalabilidad: Un solo worker no basta para producción. Solución: diseñar workers stateless que puedan escalar horizontalmente, usando conexiones pool a Redis.
Checklist de dominio
- Puedo explicar la diferencia entre procesamiento síncrono y asíncrono con colas
- He implementado una cola con Redis Lists o Streams que maneja al menos 100 trabajos/minuto
- Sé configurar workers que reintenten fallos automáticamente con backoff exponencial
- Puedo monitorear métricas clave: longitud de cola, tiempo de procesamiento, tasa de error
- He diseñado trabajos idempotentes que evitan efectos secundarios duplicados
- Sé escalar workers horizontalmente basado en métricas de carga
- Puedo implementar priorización de trabajos usando múltiples colas o sorted sets
Implementa un sistema de procesamiento de pedidos con Redis Queue
En este ejercicio, crearás un sistema completo de procesamiento de pedidos usando Redis como cola de trabajos. Sigue estos pasos:
- Configura el entorno: Instala Redis localmente o usa un contenedor Docker. Instala la biblioteca Bull para Node.js o RQ para Python según tu lenguaje preferido.
- Crea la cola principal: Define una cola llamada "pedidos" con configuración para 3 reintentos automáticos y delay exponencial entre reintentos.
- Implementa el productor: Crea un endpoint API simple (puede ser un script) que simule recibir pedidos. Cada pedido debe tener: ID único, email de usuario, monto total, y lista de productos. Agrega 10 pedidos de ejemplo a la cola.
- Implementa el worker: Crea un worker que procese cada pedido con esta lógica:
- Simular validación de pago (80% éxito, 20% fallo aleatorio)
- Si éxito: registrar en log "Pedido [ID] procesado exitosamente"
- Si fallo: lanzar error para que la cola reintente automáticamente
- Después de procesar, simular envío de email de confirmación
- Agrega monitoreo: Implementa un script que muestre cada 5 segundos:
- Cantidad de trabajos en cola
- Cantidad de trabajos en proceso
- Cantidad de trabajos completados
- Cantidad de trabajos fallados
- Prueba con carga: Modifica el productor para agregar 100 pedidos rápidamente y observa cómo los workers los procesan. Ajusta el número de workers concurrentes y observa el impacto.
- Usa Bull Queue para Node.js: tiene manejo de reintentos y monitoreo incorporado
- Para simular fallos aleatorios, genera un número random y si es menor a 0.2, lanza un error
- Considera usar eventos de Bull para implementar el monitoreo en tiempo real
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.