← Volver a todos los artículos
Retos

Diseñar una Arquitectura que Escale de 1.000 a 100.000 Usuarios

Por Marc Molas·21 de marzo de 2024·10 min de lectura

"Premature optimization is the root of all evil." La frase de Knuth la repite todo el mundo. Pero hay una variante que nadie cita: la ignorancia prematura sobre escalabilidad es igual de peligrosa.

El objetivo no es construir para 100.000 usuarios desde el día uno. Eso es sobre-ingeniería. El objetivo es no tomar decisiones a 1.000 usuarios que hagan imposible llegar a 100.000 sin reescribir todo desde cero.

He visto startups que gastan tres meses diseñando una arquitectura de microservicios para un producto que aún no tiene su primer cliente. Y he visto startups que llegan a 10.000 usuarios y tienen que parar el desarrollo de features durante dos meses porque su base de datos se muere y su arquitectura no permite escalar horizontalmente.

Ambos extremos son evitables. Aquí va un mapa realista de qué necesitas en cada fase.

Fase 1: De 0 a 1.000 usuarios — El monolito bien hecho

En esta fase, tu prioridad es el producto, no la infraestructura. Necesitas validar que lo que construyes tiene sentido, iterar rápido y no gastar energía en problemas que aún no tienes.

La arquitectura correcta aquí es simple:

  • Un monolito. Rails, Django, Express, Laravel, Next.js. Lo que tu equipo conozca mejor. Un solo repositorio, un solo deploy.
  • PostgreSQL. Probablemente la decisión de base de datos más segura que puedes tomar. Soporta JSON, full-text search, transacciones ACID, y escala muy bien hasta cientos de miles de registros con buenos índices.
  • Un servidor. Un VPS en Hetzner, una instancia en AWS, un dyno en Heroku. Un solo servidor con tu aplicación y tu base de datos.
  • Deploy simple. Git push, CI/CD básico con GitHub Actions o GitLab CI. Sin contenedores si no los necesitas.

Lo que SÍ debes hacer bien desde el principio:

  • Aplicación stateless. Tu servidor de aplicación no debe guardar estado en memoria ni en disco. Las sesiones van en la base de datos o en Redis, los archivos van a S3. Esto es crítico porque cuando necesites añadir un segundo servidor, no puedes tener estado local.
  • Índices en la base de datos. Cada query que filtra o ordena necesita un índice. No es optimización prematura, es higiene básica. Un query sin índice que tarda 50ms con 100 registros tarda 5 segundos con 100.000.
  • Separar lógica de negocio de la capa de presentación. Aunque sea un monolito, estructura tu código de forma que el día que necesites una API para una app móvil, no tengas que reescribir tu lógica de negocio.

Fase 2: De 1.000 a 10.000 usuarios — Las primeras optimizaciones

Aquí empiezas a notar los primeros cuellos de botella. Las páginas tardan más en cargar, la base de datos empieza a sudar en ciertos queries, y los procesos largos bloquean requests.

Lo que necesitas añadir:

  • Caching con Redis. No cachees todo de golpe. Identifica los endpoints más lentos o más frecuentes y cachea sus respuestas. Una página de producto que se genera con 5 queries a la base de datos y se sirve 10.000 veces al día es candidata perfecta para cache.
  • CDN para assets estáticos. Imágenes, CSS, JavaScript. Cloudflare, CloudFront, Bunny CDN. Esto reduce la carga de tu servidor y mejora los tiempos de carga para usuarios en diferentes regiones.
  • Read replicas de base de datos. Si tu aplicación es read-heavy (la mayoría lo son), configura una réplica de lectura de PostgreSQL. Las escrituras van al primario, las lecturas van a la réplica. Esto duplica tu capacidad de lectura sin tocar una línea de código de aplicación.
  • Background jobs. Todo lo que no necesita respuesta inmediata sale del request/response cycle. Enviar emails, procesar imágenes, generar reportes, sincronizar con terceros. Celery si usas Python, Sidekiq si usas Ruby, BullMQ si usas Node.js.

El error más común en esta fase: no monitorizar. Si no mides, no puedes optimizar. Instala algo que te dé visibilidad sobre tiempos de respuesta, queries lentas y uso de recursos. No necesitas nada caro: las métricas básicas de tu proveedor de hosting más una herramienta como Grafana con Prometheus son suficientes.

Fase 3: De 10.000 a 100.000 usuarios — Escalar horizontalmente

Aquí es donde tu arquitectura demuestra si las decisiones tempranas fueron buenas. Si tu aplicación es stateless y tu base de datos tiene buenos índices, esta transición es manejable. Si no, prepárate para semanas de refactoring.

Lo que necesitas:

  • Load balancer + múltiples servidores de aplicación. Nginx, HAProxy, o el balanceador de tu proveedor cloud. Si tu aplicación es stateless (como debería ser desde Fase 1), esto es añadir servidores y apuntar el balanceador a ellos.
  • Optimización seria de base de datos. Connection pooling con PgBouncer. Revisión de queries lentas con EXPLAIN ANALYZE. Índices compuestos para las queries más frecuentes. Considerar materializar vistas para reports pesados.
  • Separar servicios pesados. Si tienes un proceso que consume muchos recursos (procesamiento de imágenes, generación de PDFs, cálculos complejos), muévelo a un servicio separado. No es un microservicio en el sentido arquitectónico, es simplemente sacar una carga pesada del proceso principal.
  • Message queues para procesamiento asíncrono. RabbitMQ o Amazon SQS. Para comunicación entre servicios y para absorber picos de carga. Un spike de tráfico no debería tumbar tu sistema si los procesos no críticos están en una cola.
  • Autoscaling. Configura reglas para que tus servidores de aplicación escalen automáticamente basándose en CPU o número de requests. En AWS, esto es un Auto Scaling Group. En Kubernetes, un Horizontal Pod Autoscaler (pero probablemente aún no necesitas Kubernetes).

Las decisiones que importan desde el día uno

Si tuviera que resumir en una lista lo que debes hacer bien desde el principio, sería esto:

  • Diseño stateless. Sin estado en el servidor de aplicación. Sesiones en Redis o base de datos, archivos en almacenamiento externo.
  • Almacenamiento externo de sesiones. Nunca guardes sesiones en memoria del proceso. Cuando escales a múltiples servidores, un usuario podría ir a un servidor diferente en cada request.
  • Estrategia de índices. Cada query que use WHERE o ORDER BY necesita un índice. Revísalo periódicamente con el query planner.
  • Separar patrones de lectura y escritura. Aunque no tengas read replicas todavía, estructura tu código para que sea fácil apuntar lecturas a una conexión diferente cuando llegue el momento.
  • Migraciones reversibles. Cada cambio en el esquema de base de datos debe poder revertirse. Esto no es sobre escalabilidad directamente, pero evita downtime cuando algo sale mal en producción.

Lo que NO debes hacer

Esto es tan importante como lo anterior:

  • No hagas sharding de la base de datos a 5.000 usuarios. El sharding es complejo, introduce una cantidad enorme de complejidad operacional, y probablemente no lo necesites hasta cientos de miles o millones de usuarios. PostgreSQL bien configurado maneja mucho más de lo que crees.
  • No introduzcas Kubernetes a 10.000 usuarios. K8s resuelve problemas de orquestación a escala. Si tienes 3-5 servidores, Docker Compose o un simple load balancer con instancias es más que suficiente. La complejidad operacional de Kubernetes no se justifica hasta que tengas decenas de servicios.
  • No construyas microservicios antes de tener 3 equipos. Los microservicios son una estrategia organizacional, no técnica. Si un solo equipo mantiene todo, los microservicios solo añaden latencia de red, complejidad de deploy y dolor de debugging.
  • No optimices sin medir. Cada optimización debe estar respaldada por datos. "Creo que la base de datos es lenta" no es suficiente. "Este query tarda 800ms y se ejecuta 50.000 veces al día" sí lo es.

El checklist antes de cada fase de crecimiento

Antes de pasar a la siguiente fase, verifica:

  • ¿Tienes monitorización que te diga dónde están los cuellos de botella reales?
  • ¿Tu aplicación puede correr en múltiples instancias sin problemas?
  • ¿Las queries más frecuentes tienen índices apropiados?
  • ¿Los procesos pesados están fuera del ciclo request/response?
  • ¿Puedes hacer deploy sin downtime?
  • ¿Tienes backups automáticos y has probado restaurarlos?

El valor de la experiencia en escalabilidad

La diferencia entre escalar con dolor y escalar con confianza es haber pasado por el proceso antes. Un arquitecto que ya escaló un sistema de 1.000 a 100.000 usuarios sabe qué patrones importan en cada fase y, más importante, cuáles no importan todavía.

En Conectia, los ingenieros senior que conectamos con startups europeas han pasado por estas fases en productos reales. No te van a proponer Kubernetes para tu MVP ni microservicios para tu equipo de cuatro personas. Te van a ayudar a tomar las decisiones correctas para tu fase actual, dejando la puerta abierta para la siguiente.

Porque escalar no es un evento. Es una serie de decisiones incrementales. Y cada una es mucho más fácil cuando alguien en tu equipo ya sabe cuál es la siguiente.


¿Tu producto está creciendo y no sabes si tu arquitectura aguantará el siguiente orden de magnitud? Habla con un CTO — conectamos con arquitectos que ya han escalado sistemas como el tuyo.

¿Listo para construir tu equipo de ingeniería?

Habla con un partner técnico y despliega ingenieros validados por CTOs en 72 horas.