Sistema que automatiza end-to-end la compra de suscripciones digitales en una tienda WooCommerce: Playwright navega el sitio en headless, BullMQ gestiona colas con concurrencia controlada, Redis Pub/Sub lleva el progreso al frontend en tiempo real via SSE, y una caché multicapa de 3 niveles minimiza las llamadas a la API externa — 0 intervención manual desde el click hasta las credenciales.
🚀 Impacto y Números
- 0 intervención manual: el flujo completo de compra y entrega de credenciales es 100% automatizado
- 3 capas de caché: Redis (hot, TTL 20s) → PostgreSQL (warm) → API WooCommerce (cold) — latencia mínima, carga mínima al origen
- Hasta 3 compras paralelas gestionadas simultáneamente por BullMQ con deduplicación por
jobId - Progreso con porcentaje exacto en tiempo real via Redis Pub/Sub + SSE — sin polling, sin WebSockets
- 3 servicios orquestados en red privada con Docker Compose: frontend, backend y Redis Stack
⚡ Cómo está construido
Automatización browser con Playwright
- Sesión persistente:
storageStatereutilizado entre ejecuciones para no re-autenticarse en cada job - Optimización de red:
route.abort()bloquea CSS e imágenes innecesarias — reduce tiempo de carga más del 40% - Flujo resiliente:
Promise.race()detecta éxito o error de pago en paralelo con timeouts independientes; captura URL final, texto de error y screenshot en caso de fallo
Pipeline de notificaciones Redis Pub/Sub → SSE
- Worker publica eventos en canal
store:{jobId}:statuscon cada cambio de estado — sin acoplamiento directo al frontend - Route Handler de Next.js se suscribe al canal Redis y re-emite los mensajes como Server-Sent Events: stream HTTP persistente de baja latencia sin WebSockets
- Dos conexiones Redis separadas (publisher/subscriber) para arquitectura pub/sub correcta
Estrategia de caché multicapa (Cache-Aside)
- Stale-while-revalidate manual: si el producto existe en Redis pero tiene más de 20s, se sirve inmediatamente y se encola una actualización en background — el usuario no espera
- Flag
isUpdatingreactivo: el frontend muestra en tiempo real qué productos están siendo refrescados - UPSERT bulk con
pg:INSERT ... ON CONFLICT DO UPDATEactualiza N productos en una sola query con valores dinámicos
🛠️ Stack
Core: Node.js ESM, Express 5, Next.js 15, React 19, TypeScript Automatización: Playwright (headless, session management, network interception) Infraestructura: BullMQ, Redis Stack (caché + Pub/Sub), PostgreSQL Frontend: Zustand, SWR, Tailwind CSS v4 Tools: Docker Compose, Biome, pnpm Patterns: Cache-Aside, Worker Queue, Observer (Pub/Sub), BFF, Repository
💼 Lo que este proyecto demuestra
Este proyecto demuestra que puedo:
- ✅ Diseñar sistemas distribuidos con colas de trabajo, workers especializados y concurrencia controlada
- ✅ Implementar automatización browser de producción con Playwright (sesiones, contextos, optimización de red)
- ✅ Construir arquitecturas event-driven usando Redis Pub/Sub como bus de mensajes desacoplado
- ✅ Elegir el patrón de caché correcto para cada problema: stale-while-revalidate cuando la consistencia puede diferirse, invalidación inmediata cuando no
- ✅ Conectar el stack moderno de Node.js (ESM, Express 5, Next.js 15, React 19) en una arquitectura coherente
Diferenciador clave: No es un CRUD con autenticación. Es un sistema que resuelve automatización de negocio real con tecnologías de nivel enterprise — colas, pub/sub, caché multicapa y RPA — construido de forma completamente independiente.