🏗️ 30 Conceptos Fundamentales de System Design (Explicados con Ejemplos Claros)
El System Design puede resultar abrumador, especialmente cuando no sabes por dónde empezar. Pero una vez entiendes los bloques fundamentales, construir y escalar sistemas deja de ser intimidante — ya sea para entrevistas o para desarrollar software real usado por millones.
Este artículo reúne los 30 conceptos esenciales que todo desarrollador debería conocer. Muchos de estos principios se aplican diariamente en empresas como Google, Netflix, Uber, Meta y Amazon.
📑 Índice
- Client-Server Architecture
- IP Address
- DNS
- Proxy / Reverse Proxy
- Latency
- HTTP / HTTPS
- APIs
- REST API
- GraphQL
- Databases
- SQL vs NoSQL
- Vertical Scaling
- Horizontal Scaling
- Load Balancers
- Database Indexing
- Replication
- Sharding
- Vertical Partitioning
- Caching
- Denormalization
- CAP Theorem
- Blob Storage
- CDN
- WebSockets
- Webhooks
- Microservices
- Message Queues
- Rate Limiting
- API Gateways
- Idempotency
1. Client-Server Architecture
La mayoría de aplicaciones web siguen el modelo cliente-servidor:
- El cliente (web, móvil, IoT) envía solicitudes.
- El servidor procesa esas solicitudes y responde.
Ejemplo: cuando abres Instagram, tu app (cliente) pide contenido al servidor.
2. IP Address
Un cliente no “adivina” dónde está el servidor: necesita una dirección llamada IP, similar a un número telefónico en internet.
3. DNS
Los usuarios escriben dominios (ej. google.com), no IPs.
El DNS (Domain Name System) traduce un dominio a su dirección IP.
4. Proxy / Reverse Proxy
- Proxy: cliente → proxy → server (oculta la IP del cliente).
- Reverse Proxy: cliente → reverse proxy → múltiples servidores (mejor seguridad, caching, load balancing).
Ejemplo: Cloudflare actúa como reverse proxy.
5. Latency
Es el tiempo que tarda un dato en viajar entre cliente y servidor.
Mayor distancia → mayor latencia.
Para reducirla se despliegan servidores cerca del usuario (edge computing).
6. HTTP / HTTPS
HTTP define cómo cliente y servidor intercambian datos.
HTTPS es la versión segura, usando TLS/SSL para encriptar la conexión.
7. APIs
Una API define las reglas de comunicación entre cliente y servidor sin exponer la lógica interna.
Ejemplo: enviar un post a TikTok desde tu app.
8. REST API
Estilo de APIs basado en HTTP y recursos.
Métodos claves:
| Método | Acción | Ejemplo |
|---|---|---|
| GET | Leer | /users/23 |
| POST | Crear | /users |
| PUT/PATCH | Actualizar | /users/23 |
| DELETE | Eliminar | /users/23 |
9. GraphQL
Permite consultar solo los datos necesarios en una sola solicitud, evitando múltiples endpoints REST.
Ideal para aplicaciones con UIs complejas.
10. Databases
El servidor almacena datos en bases de datos.
Pueden manejar pequeñas cantidades o millones de registros según arquitectura.
11. SQL vs NoSQL
| SQL | NoSQL |
|---|---|
| Estructurada con esquema | Flexible, esquema dinámico |
| ACID | Altamente escalable |
| Ej.: PostgreSQL, MySQL | Ej.: MongoDB, Redis, Cassandra |
Muchos sistemas usan ambos (patrón polyglot persistence).
12. Vertical Scaling (Scale Up)
Aumentar recursos del servidor (más CPU, RAM).
Ventaja: simple.
Desventaja: límite físico + punto único de fallo.
13. Horizontal Scaling (Scale Out)
Añadir más servidores y distribuir carga.
Más escalable y resiliente que el escalado vertical.
14. Load Balancers
Distribuyen tráfico entre múltiples servidores usando algoritmos como:
- Round Robin
- Least Connections
- IP Hash
Si un servidor falla, redirige al resto (alta disponibilidad).
15. Database Indexing
Índices permiten búsquedas rápidas sin leer toda la tabla.
Aceleran reads, pero ralentizan writes.
16. Replication
Copia una base de datos en varias réplicas:
- Primaria: writes
- Réplicas: reads
Mejora disponibilidad y rendimiento.
17. Sharding
Divide la base de datos en varias piezas (shards) por una clave (ej. user_id).
Permite escalar almacenamiento y velocidad.
18. Vertical Partitioning
Divide columnas de una tabla en varias tablas según uso.
Ejemplo:
- Perfil de usuario
- Historial de login
- Datos de pago
19. Caching
Guarda datos frecuentes en memoria (Redis, Memcached) para respuestas inmediatas.
Estrategia común: Cache Aside.
20. Denormalization
Duplicar datos para evitar JOINs costosos y acelerar lecturas.
Aumenta velocidad, pero también complejidad al actualizar.
21. CAP Theorem
En un sistema distribuido, solo se pueden cumplir 2 de 3:
- Consistency
- Availability
- Partition Tolerance
Ejemplos:
- CP → PostgreSQL
- AP → Cassandra
22. Blob Storage
Para imágenes, PDFs, videos o archivos grandes se usa almacenamiento como Amazon S3 en lugar de bases de datos.
23. CDN
Red global de servidores que cachean contenido estático (videos, imágenes).
Entrega desde el nodo más cercano al usuario → menos latencia.
24. WebSockets
Conexión bidireccional persistente cliente-servidor.
Ideal para:
- Chats
- Trading
- Juegos en tiempo real
25. Webhooks
Permiten que un servidor notifique a otro cuando ocurre un evento.
Ejemplo: Stripe envía un webhook al recibir un pago.
26. Microservices
Aplicación dividida en servicios pequeños y autónomos.
Cada servicio tiene su propia lógica y base de datos.
Permiten escalar y desplegar funciones de forma independiente.
27. Message Queues
Permiten comunicación asíncrona entre servicios.
Ejemplo:
Usuario hace una compra → mensaje en cola → servicios procesan sin bloquear.
Herramientas: Kafka, RabbitMQ, Amazon SQS.
28. Rate Limiting
Limita cuántas solicitudes puede hacer un usuario en un periodo.
Evita abusos, bot attacks y uso excesivo.
29. API Gateways
Punto central para gestionar peticiones en microservicios.
Funciones:
- Autenticación
- Rate limiting
- Logging
- Routing
Ejemplo: Nginx, Kong, AWS API Gateway.
30. Idempotency
Garantiza que solicitudes repetidas produzcan el mismo resultado.
Ejemplo crítico: pagos.
Si un usuario recarga la página, no se debe cobrar dos veces.
🧠 Conclusión
Estos 30 conceptos son la base del diseño de sistemas modernos. No necesitas aprenderlos todos en un día, pero entenderlos te permitirá:
- Diseñar software escalable
- Prepararte para entrevistas técnicas
- Pensar como arquitecto, no solo como programador