Consulta de catálogo
Flujo de consulta de catálogo: desde el frontend hasta el microservicio de catálogo, pasando por la base de datos y la capa de caché para optimizar respuestas.
Por qué la consulta de catálogo es un flujo representativo
La consulta de catálogo es uno de los flujos más frecuentes en cualquier aplicación de comercio o gestión. Es un caso de lectura intensiva: muchos usuarios consultan los mismos datos, los datos cambian con poca frecuencia y la velocidad de respuesta impacta directamente en la experiencia del usuario.
Este flujo ilustra cómo la arquitectura maneja lecturas optimizadas con caché y cómo el BFF adapta los datos para el frontend.
El flujo completo
sequenceDiagram
participant FE as Frontend
participant GW as API Gateway
participant BFF as BFF
participant CACHE as Caché
participant MS as ms-catalog
participant DB as Catalog DB
FE->>GW: GET /catalog/products?category=electronics
GW->>GW: Auth, rate limiting
GW->>BFF: Forward
BFF->>CACHE: ¿Datos en caché?
alt Cache HIT
CACHE-->>BFF: Datos cacheados
else Cache MISS
BFF->>MS: GET /products?category=electronics
MS->>DB: SELECT * FROM products WHERE category = ...
DB-->>MS: Resultados
MS-->>BFF: Lista de productos
BFF->>CACHE: Guardar en caché (TTL: 5 min)
end
BFF->>BFF: Transformar para UI
BFF-->>GW: Respuesta formateada
GW-->>FE: 200 OK + productos
Qué hace cada capa
Frontend
- El usuario navega a una categoría o usa el buscador
- El frontend construye la petición con filtros (categoría, precio, orden)
- Envía la petición al Gateway
- Recibe los productos y los renderiza en un grid o lista
- Puede implementar paginación o scroll infinito
API Gateway
- Valida el token JWT del usuario
- Aplica rate limiting (las consultas de catálogo pueden ser muy frecuentes)
- Enruta al BFF
BFF
El BFF es donde ocurre la mayor parte de la optimización:
- Recibe la petición con los filtros del frontend
- Consulta la caché para ver si ya tiene los datos
- Si hay cache hit, devuelve los datos cacheados directamente
- Si hay cache miss, invoca al microservicio de catálogo
- Guarda la respuesta en caché con un TTL apropiado
- Transforma los datos al formato que el frontend necesita
Microservicio de catálogo (ms-catalog)
- Recibe la consulta con los filtros
- Construye la query a la base de datos
- Aplica paginación, ordenamiento y filtros
- Devuelve los productos con sus datos de dominio
Base de datos
- Almacena productos, categorías, precios, stock
- Tiene índices optimizados para las consultas más frecuentes
- Puede usar vistas materializadas para consultas complejas
La capa de caché en detalle
Dónde ubicar la caché
Hay varias opciones, y pueden combinarse:
| Ubicación | Ventaja | Desventaja |
|---|---|---|
| BFF (Redis/Memcached) | Reduce llamadas al microservicio | Necesita invalidación |
| Microservicio | Transparente para el BFF | Sigue habiendo latencia de red |
| CDN / Gateway | Muy rápida para contenido estático | Difícil de invalidar |
| Frontend (local) | Instantánea | Datos potencialmente obsoletos |
En esta arquitectura, la caché principal está en el BFF porque es el punto donde se puede controlar mejor la transformación y la invalidación.
Estrategia de invalidación
La caché del catálogo se invalida de dos formas:
Por TTL (Time To Live): cada entrada tiene un tiempo de vida (por ejemplo, 5 minutos). Después de ese tiempo, se considera obsoleta y se consulta de nuevo al microservicio.
Por evento: cuando el microservicio de catálogo actualiza un producto, publica un evento ProductUpdated. El BFF escucha ese evento e invalida las entradas de caché afectadas.
sequenceDiagram
participant ADMIN as Admin
participant MS as ms-catalog
participant EB as Event Bus
participant BFF as BFF
participant CACHE as Caché
ADMIN->>MS: PUT /products/123 (actualizar precio)
MS->>MS: Actualizar en DB
MS->>EB: Publicar ProductUpdated
EB->>BFF: Evento ProductUpdated
BFF->>CACHE: Invalidar entradas relacionadas
Cache key design
Las claves de caché deben ser deterministas y reflejar los parámetros de la consulta:
catalog:products:category=electronics:sort=price:page=1
catalog:products:category=electronics:sort=price:page=2
catalog:product:123
Transformación en el BFF
El microservicio devuelve datos de dominio completos, pero el frontend no necesita todo. El BFF transforma:
Respuesta del microservicio:
{
"id": "prod-123",
"internalSku": "SKU-2024-001",
"name": "Laptop Pro",
"description": "...",
"priceInCents": 99900,
"currency": "USD",
"stockQuantity": 45,
"warehouseLocation": "A-12-3",
"categoryId": "cat-electronics",
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-15T10:00:00Z"
}
Respuesta del BFF al frontend:
{
"id": "prod-123",
"name": "Laptop Pro",
"description": "...",
"price": "$999.00",
"inStock": true,
"category": "Electrónica",
"imageUrl": "/images/prod-123.jpg"
}
El BFF elimina datos internos (internalSku, warehouseLocation), formatea el precio, simplifica el stock a un booleano y resuelve la categoría a su nombre legible.
Paginación y rendimiento
Para catálogos grandes, la paginación es esencial:
- El frontend envía
pageypageSize - El microservicio aplica
LIMITyOFFSETen la query - La respuesta incluye metadata de paginación (
totalItems,totalPages,currentPage) - Cada página se cachea independientemente
Escenarios de error
Microservicio no disponible
Si el microservicio de catálogo está caído pero hay datos en caché (aunque estén expirados), el BFF puede devolver los datos obsoletos con un header indicando que son stale. Esto es mejor que mostrar un error al usuario.
Caché no disponible
Si Redis está caído, el BFF simplemente consulta al microservicio directamente. La latencia aumenta pero el flujo no se rompe.
Consulta sin resultados
No es un error. El microservicio devuelve una lista vacía y el frontend muestra un mensaje de “No se encontraron productos”.
Resumen
La consulta de catálogo muestra cómo la arquitectura optimiza flujos de lectura intensiva. La caché en el BFF reduce la carga sobre el microservicio y la base de datos, mientras que la invalidación por eventos mantiene los datos razonablemente frescos. El BFF transforma los datos de dominio al formato que el frontend necesita, manteniendo la separación de responsabilidades entre capas.