Caso de éxito · SaaS B2B confidencial, Norteamérica

Reducción de 8 veces en la latencia p95 de la API de un SaaS B2B con una capa de caché Redis en producción

Cómo rediseñamos la arquitectura de una API Python/FastAPI de alta demanda con una capa de caché Redis de varios niveles para reducir la latencia p95 de 1.8 s a 220 ms y la carga de PostgreSQL en un 70% en un SaaS B2B norteamericano.

  • SectorSaaS
  • Año2024
  • PaísEE. UU.
  • Duración4 meses
Cutting B2B SaaS API p95 Latency 8x with a Production Redis Caching Layer hero screenshot

Resultados de un vistazo

  • 8xReducción de la latencia p95 en endpoints críticos (de 1.8 s a 220 ms)
  • 70%Reducción de la carga de lectura en PostgreSQL
  • $3.4K/moSe evitó la actualización de RDS: el proyecto se amortizó en 90 días
  • 99.97%Disponibilidad de la capa de caché durante los primeros 6 meses

El reto

Un SaaS B2B de rápido crecimiento había chocado con un muro. Su API Python/FastAPI alimentaba paneles para miles de cuentas basadas en puestos, y la ruta de lectura se había convertido en una maraña de consultas ORM N+1, comprobaciones de permisos repetidas y búsquedas de feature flags en cada solicitud. La latencia p95 en los endpoints más concurridos había pasado de 380 ms en el lanzamiento a 1.8 s, la CPU de RDS estaba al 80% durante el horario laboral y el equipo de ingeniería ya estaba presupuestando una mejora vertical de RDS que habría añadido unos $3,400/mes a la factura.

Peor aún, la lentitud era invisible para la mitad de la base de clientes porque el panel se renderiza progresivamente — para cuando los clientes se quejaron, el equipo ya había perdido una renovación empresarial por "el panel parece roto". El equipo necesitaba una solución en semanas, no una replataformización de seis meses.

Nuestra solución

Colocamos una capa de caché Redis de tres niveles y bien disciplinada delante de las rutas de lectura más exigidas y reformamos el modelo de datos para que pudiera almacenarse en caché de forma segura. La inversión estuvo en el diseño de las claves de caché, los contratos de invalidación y la observabilidad — no en arrojar memoria al problema.

Nivel 1: memoización por solicitud dentro del contenedor de dependencias de FastAPI, eliminando las consultas duplicadas dentro de una misma solicitud. Nivel 2: un clúster Redis 7 compartido (modo clúster, AWS ElastiCache) que contiene las lecturas más frecuentes — conjuntos de permisos, feature flags, metadatos de cuentas, agregados de paneles — con TTL explícitos y un sobre Pydantic tipado para que las cargas en caché estén versionadas y puedan evolucionar con seguridad. Nivel 3: un worker de Celery fuera de banda que precalienta los agregados más solicitados inmediatamente después de las escrituras, de modo que la siguiente solicitud del usuario ya sea un acierto de caché.

Cada clave de caché lleva el espacio de nombres inquilino + entidad + versión, cada lectura registra un acierto/fallo en Datadog y cada escritura pasa por un único módulo de invalidación para que un futuro ingeniero no pueda saltárselo en silencio.

  • Caché de tres niveles: memoización en proceso, clúster Redis y workers Celery de precalentamiento
  • Sobres de caché Pydantic tipados con campo de versión explícito para una evolución segura del esquema
  • Claves con espacio de nombres (inquilino + entidad + versión) para que los despliegues nunca sirvan datos de formas mezcladas
  • Módulo único de invalidación — todas las rutas de escritura pasan por él; sin saltos silenciosos
  • Despliegue con lecturas en sombra y comparación caché-vs-BD en el 10% del tráfico real antes del corte
  • Paneles de Datadog para tasa de aciertos, p95, tasa de desalojo y margen de memoria de Redis
  • Alertas de PagerDuty por caída de la tasa de aciertos, picos de desalojo y conmutación del primario de Redis
  • Pruebas de carga con k6 que reproducen 3 veces el tráfico pico, con un modelo de capacidad documentado

Cómo lo construimos

  1. 01

    Auditoría de puntos críticos y mapa de cacheabilidad

    Comenzamos instrumentando la API existente con Datadog APM y un perfilador SQL personalizado, y luego clasificamos cada endpoint por costo p95 y volumen de llamadas. Los 14 endpoints principales representaban el 91% del tiempo total de base de datos. Para cada uno construimos un mapa de capacidad de caché: qué es seguro cachear, qué es por tenant, qué es por usuario, qué TTL y qué eventos deben invalidarlo.

  2. 02

    Contrato de caché y diseño de claves

    Antes de escribir cualquier código de Redis, redactamos un contrato de caché de una página: envoltorios tipados, una única función constructora de claves, TTL obligatorios, versionado por espacio de nombres para que los despliegues nunca sirvan estructuras obsoletas y una regla de no omisión aplicada con un pequeño decorador verificado por mypy. Este fue el paso más importante: evitó la típica degradación de la caché que acaba con estos proyectos en el segundo año.

  3. 03

    Implementación en iteraciones cortas

    Entregamos una familia de endpoints por semana detrás de un feature flag, con un modo de lectura en sombra que comparaba los resultados de la caché y la base de datos en el 10 % del tráfico durante 48 horas antes de cambiar. Los despliegues se hicieron por tenant, de modo que cualquier anomalía quedaba contenida, y cada fragmento incluía un runbook para el ingeniero de guardia.

  4. 04

    Observabilidad, prueba de carga y traspaso

    Añadimos paneles de Datadog para tasa de aciertos, tasa de expulsión, p95 por endpoint y margen de memoria de Redis, y luego ejecutamos una prueba de carga con k6 de 2 horas a 3x el tráfico pico para confirmar el nuevo techo. El equipo del cliente recibió un runbook escrito, umbrales de alerta y un retainer de 4 semanas posterior al lanzamiento para ajustes.

Stack tecnológico

  • Python
  • FastAPI
  • Redis 7
  • PostgreSQL
  • Celery
  • Docker
  • AWS ECS
  • Datadog
  • Ingeniería de rendimiento backend
  • Python y FastAPI
  • Soluciones en la nube
  • DevOps y observabilidad
“Pasamos de rediseñar nuestra base de datos a entregar el siguiente conjunto de funciones para clientes en el mismo trimestre. UnlockLive trató la invalidación de caché como una verdadera disciplina de ingeniería, no como un parche.”
VP of Engineering · Cliente de SaaS B2B (nombre confidencial)

Preguntas frecuentes

¿Cómo decide qué es seguro almacenar en caché en Redis para un SaaS multiinquilino?

Comenzamos con una auditoría de capacidad de caché por endpoint: límite del tenant, tolerancia a la desactualización y qué eventos invalidan el resultado. Los agregados por tenant con rutas de escritura claras son victorias fáciles; los joins entre tenants casi nunca lo son. Cada valor cacheado recibe un envoltorio tipado y una clave versionada para que los futuros cambios de esquema no contaminen la caché.

¿Cómo evita los datos obsoletos y el clásico problema de invalidación de caché de Redis?

Dos reglas: toda ruta de escritura pasa por un único módulo de invalidación (aplicado mediante un decorador tipado para que no pueda omitirse), y toda clave de caché incluye una versión de esquema. También ejecutamos en producción un modo de lectura en sombra que compara los resultados de la caché con los de la base de datos en una parte del tráfico antes de promover un nuevo endpoint cacheado.

¿Cuándo ahorra dinero realmente el caché con Redis en AWS y cuándo es solo complejidad?

Se amortiza cuando se puede demostrar un ahorro medible en RDS o en cómputo, normalmente cuando las lecturas frecuentes representan más del 60 % del tiempo total de la base de datos y la carga tiene localidad natural. En nuestro caso, el punto de equilibrio suele ser de 3 a 6 semanas de trabajo de ingeniería que se compensan con una actualización diferida de RDS. Modelamos esto antes de cotizar el proyecto.

¿Usan Redis Cluster o Redis de un solo nodo para cargas de trabajo SaaS?

Por defecto usamos Redis gestionado en modo clúster (AWS ElastiCache o equivalente) para SaaS en producción: ofrece sharding, conmutación por error en línea y escalado predecible. Redis de un solo nodo sirve para colas o cachés de sesión, pero no para la caché de la ruta de lectura que mantiene vivo su panel.

¿Cuánto tarda un proyecto de caché con Redis como este?

Normalmente de 8 a 16 semanas para una API mediana en FastAPI o Django: 2 semanas de auditoría y diseño de contratos, de 6 a 12 semanas de despliegue por fragmentos con feature flags y una ventana de estabilización de 2 a 4 semanas con cobertura de guardia.

¿Quiere un resultado como este?

Hable con el mismo equipo que construyó Reducción de 8 veces en la latencia p95 de la API de un SaaS B2B con una capa de caché Redis en producción. Definiremos el alcance de su proyecto, le daremos una propuesta a precio fijo y le mostraremos el caso más parecido de nuestro portafolio.

Reservar una llamada estratégica