Diagnostico tecnologico: cuando escalar y cuando optimizar lo que tienes

A
abemon
| | 11 min de lectura

Sintomas que parecen problemas de escala pero no lo son

Cuando un sistema empieza a ir lento, la reaccion instintiva es escalar: mas servidores, mas CPU, mas memoria. Es la solucion mas visible y la mas facil de justificar en un presupuesto. Tambien es, en la mayoria de los casos que hemos diagnosticado, la solucion equivocada.

En los ultimos tres anos hemos realizado diagnosticos tecnologicos para empresas de logistica, hospitality, retail y servicios financieros. En el 70% de los casos, los problemas de rendimiento que motivaron la consulta tenian su raiz en codigo ineficiente, no en infraestructura insuficiente.

Los sospechosos habituales:

Queries N+1. El clasico que nunca muere. Un listado de 100 pedidos que ejecuta 101 queries en lugar de una con JOIN o un eager loading. Cada query individual es rapida, pero la suma mata el rendimiento. Lo hemos encontrado en ORMs de todos los lenguajes: Eloquent, SQLAlchemy, ActiveRecord, Hibernate. La solucion no es mas base de datos; es revisar las queries.

Indices ausentes. Una tabla de un millon de registros sin indice en la columna de busqueda principal. La query hace un full table scan en cada peticion. Anadir el indice correcto pasa la query de 3 segundos a 3 milisegundos. Coste de la solucion: una linea de SQL. Coste de escalar en su lugar: cientos de euros mensuales en infraestructura que no necesitas.

Procesamiento sincrono donde deberia ser asincrono. Un endpoint de API que envia un email, genera un PDF y actualiza tres sistemas externos antes de responder al usuario. El usuario espera 8 segundos. La solucion no es un servidor mas rapido; es mover las operaciones no criticas a una cola de trabajo (Celery, Sidekiq, Bull) y responder al usuario en 200ms.

Over-fetching. Endpoints de API que devuelven objetos completos con todas sus relaciones cuando el cliente solo necesita tres campos. Hemos visto respuestas de 500KB que, con una proyeccion adecuada, se reducen a 5KB. Multiplicado por miles de peticiones, la diferencia en ancho de banda y tiempo de procesamiento es brutal.

Ausencia de cache. Datos que se recalculan en cada peticion cuando cambian una vez al dia. Listas de categorias, configuraciones, tipos de cambio, catalogos de productos. Un Redis con TTL de una hora resuelve el problema. No necesitas mas CPU; necesitas no repetir trabajo.

Estos cinco problemas cubren la mayoria de los “necesitamos escalar” que resultan ser “necesitamos optimizar”. Identificarlos requiere medicion, no intuicion.

El framework de diagnostico

La decision entre escalar y optimizar debe basarse en datos, no en sensaciones. El framework que aplicamos tiene cuatro fases secuenciales.

Fase 1: Medir el estado actual

Antes de cambiar nada, necesitas una linea base. Sin ella, no puedes saber si un cambio mejoro o empeoro las cosas.

  • Latencia por endpoint: p50, p95 y p99. El promedio miente; los percentiles cuentan la verdad. Un endpoint con p50 de 100ms y p99 de 5 segundos tiene un problema que el promedio esconde.
  • Throughput: peticiones por segundo que el sistema procesa actualmente. No la capacidad teorica, sino el trafico real.
  • Utilizacion de recursos: CPU, memoria, disco I/O, conexiones de red. Mide en los momentos de pico, no en promedio.
  • Coste por peticion: divide tu factura de infraestructura mensual entre el numero de peticiones. Este numero es tu linea base economica.

Fase 2: Identificar el cuello de botella

Un sistema solo es tan rapido como su componente mas lento. El analisis de cuellos de botella determina donde esta el limite real:

  • Si el CPU esta al 90% pero el disco esta al 10%, el cuello de botella es computacion.
  • Si la base de datos tiene connection pool exhaustion pero el servidor de aplicacion tiene recursos libres, el cuello de botella es la base de datos.
  • Si la latencia aumenta linealmente con el numero de usuarios concurrentes pero los recursos no se saturan, el cuello de botella es probablemente un lock o un recurso compartido.

Herramientas: APM (Datadog, New Relic, Elastic APM), profilers de base de datos (pg_stat_statements en PostgreSQL, slow query log en MySQL), profilers de aplicacion (py-spy, async-profiler, perf).

Fase 3: Calcular la economia de cada opcion

Para cada solucion candidata, estimamos:

  • Coste de implementacion: horas de ingenieria necesarias.
  • Coste operativo recurrente: incremento en factura de infraestructura si escalas, o reduccion si optimizas.
  • Tiempo hasta el impacto: escalar puede ser inmediato; optimizar requiere desarrollo.
  • Riesgo: escalar es bajo riesgo pero no resuelve la causa raiz; optimizar codigo tiene riesgo de regresion pero soluciona el problema.

Fase 4: Decidir y ejecutar

Con los datos de las tres fases anteriores, la decision suele ser clara. El arbol de decisiones simplificado:

Pregunta 1: El cuello de botella esta en codigo o en infraestructura?

  • Si es codigo (queries lentas, procesamiento ineficiente, falta de cache) -> Optimizar primero.
  • Si es infraestructura genuina (CPU saturado con codigo eficiente, disco I/O al limite con queries optimizadas) -> Escalar.

Pregunta 2: El crecimiento de carga es real y sostenido?

  • Si el trafico crece un 20% mensual y las proyecciones se mantienen -> Escalar proactivamente.
  • Si el trafico es estable y el rendimiento se degrado “de repente” -> Buscar la regresion (deploy reciente, datos que crecieron, query plan que cambio).

Pregunta 3: El coste de optimizar supera el coste de escalar a 12 meses?

  • Si optimizar cuesta 40 horas de ingenieria y escalar cuesta 200 euros/mes adicionales -> Depende del contexto. Pero recuerda que escalar sin optimizar es pagar interes compuesto: el coste crece con el trafico mientras la ineficiencia permanece.

Cuando escalar es la respuesta correcta

Escalar no es siempre la solucion equivocada. Hay escenarios claros donde anadir infraestructura es la decision correcta:

Crecimiento genuino de carga. Si tu base de usuarios crece un 50% anual y el sistema esta optimizado, necesitas mas capacidad. La senal es que la utilizacion de recursos crece proporcionalmente al trafico sin degradacion en la eficiencia por peticion.

Requisitos de latencia estrictos. Hay limites fisicos. Si necesitas responder en menos de 10ms y el procesamiento minimo de la peticion toma 8ms, no hay optimizacion que te lleve a 2ms. Necesitas procesamiento mas cerca del usuario (CDN, edge computing) o hardware mas rapido.

Requisitos de disponibilidad. Un unico servidor puede ser perfectamente rapido pero no ofrece redundancia. Escalar horizontalmente para alta disponibilidad es una decision de resiliencia, no de rendimiento.

Elasticidad ante picos. Black Friday, lanzamientos de producto, eventos. Si tu trafico se multiplica por 10 durante unas horas, necesitas capacidad elastica. Autoscaling en la nube o capacidad reservada segun el patron de tus picos.

En estos casos, la clave es escalar de forma eficiente. Horizontal antes que vertical cuando sea posible (mas instancias pequenas en lugar de una instancia gigante), con autoescalado configurado correctamente y con metricas que confirmen que el escalado funciona como se espera.

La aproximacion optimization-first

Para el 70% de los casos, la optimizacion es el primer paso correcto. La secuencia que aplicamos:

Profiling de queries de base de datos. Activar el slow query log, analizar con EXPLAIN las queries mas frecuentes y mas lentas. Anadir indices, reescribir queries N+1, implementar paginacion donde se cargan datasets completos. En un proyecto reciente de logistica, esta fase sola redujo la latencia p95 un 60%.

Estrategias de cache. Identificar datos que se leen mucho mas de lo que se escriben. Implementar cache en memoria (Redis) con TTL apropiado. Cache de resultados de API para respuestas que no cambian en minutos. Cache de consultas de base de datos para queries costosas con resultados estables. Invalidacion de cache basada en eventos, no en expiracion temporal, cuando la consistencia lo requiere.

Optimizacion de queries y conexiones. Connection pooling (PgBouncer para PostgreSQL) para evitar el coste de crear y destruir conexiones. Prepared statements para queries repetitivas. Read replicas para separar trafico de lectura y escritura cuando el volumen lo justifica.

Procesamiento asincrono. Mover al background todo lo que el usuario no necesita esperar: envio de emails, generacion de reportes, sincronizacion con sistemas externos, procesamiento de imagenes. Esto no reduce el trabajo total pero reduce drasticamente la latencia percibida.

Reduccion de payload. Comprimir respuestas (gzip/brotli). Implementar paginacion. Proyectar solo los campos necesarios en las queries. Usar formatos eficientes (protobuf en lugar de JSON para comunicacion entre servicios internos).

Cuando traer ayuda externa

Hay momentos en los que un diagnostico externo aporta valor que el equipo interno no puede generar por si solo:

Deuda tecnica acumulada. Cuando el equipo ha trabajado en el mismo sistema durante anos, desarrolla puntos ciegos. Asunciones que nadie cuestiona, patrones que se repiten por inercia, complejidad que se normaliza. Una revision externa identifica estos puntos ciegos porque no tiene el contexto historico que los invisibiliza.

Decision de arquitectura critica. Migrar a microservicios, cambiar de base de datos, mover a la nube. Estas decisiones tienen consecuencias a largo plazo y son dificiles de revertir. Una segunda opinion arquitectonica antes de ejecutar puede evitar meses de trabajo en la direccion equivocada.

El equipo esta sobrecargado. Si el equipo no tiene capacidad para parar, medir y analizar porque esta constantemente apagando fuegos, un diagnostico externo desbloquea la situacion. Medimos, analizamos, priorizamos y entregamos un plan de accion que el equipo puede ejecutar en sprints.

Preparacion para escala. Antes de una ronda de financiacion, un lanzamiento importante o una expansion a nuevos mercados, un diagnostico tecnologico valida que la infraestructura y el codigo soportaran el crecimiento previsto. Es mas barato descubrir los limites en un laboratorio que en produccion con usuarios reales.

En abemon realizamos estos diagnosticos con un enfoque pragmatico: medimos antes de opinar, cuantificamos las recomendaciones en horas y euros, y entregamos un plan priorizado que distingue entre lo urgente (riesgo operativo), lo importante (eficiencia y coste) y lo deseable (mejoras de arquitectura). La tecnologia es un medio, no un fin. El objetivo es que tu sistema soporte tu negocio de forma fiable y eficiente, no que sea un showcase de las ultimas tendencias.