System Design¶
Cómo diseñar sistemas que escalan, aguantan fallos y se pueden operar.
- Empieza por el marco de 4 pasos.
- Domina los bloques de construcción.
- Practica con casos resueltos:
| Caso | Conceptos principales |
|---|---|
| Rate limiter | Token bucket, Redis + Lua, fail-open |
| Acortador de URLs | Base62, generación de IDs, caché, analítica asíncrona |
| Almacén clave-valor | Consistent hashing, quórum, relojes vectoriales, gossip, Merkle, LSM |
| Notificaciones | Colas por canal, reintentos, idempotencia, agrupación |
| Chat | WebSockets, orden por conversación, presencia, varios dispositivos |
| Web crawler | URL frontier, educación por host, Bloom filter, deduplicación |
| News feed | Fan-out on write / on read, híbrido para celebridades |
| Autocompletado | Trie con top-k precalculado, construcción offline, caché |
| Plataforma de vídeo | Subida prefirmada, transcodificación en DAG, HLS/DASH, CDN |
| Proximidad | Geohash, quadtree, PostGIS, Redis GEO |
| Pagos | Idempotencia, estados, libro de doble entrada, reconciliación |
Diagrama base de casi cualquier sistema web¶
flowchart LR
U[Usuarios] --> DNS
U --> CDN[CDN<br/>estáticos]
U --> LB[Load balancer]
LB --> A1[App 1]
LB --> A2[App 2]
LB --> A3[App N]
A1 & A2 & A3 --> C[(Caché<br/>Redis)]
A1 & A2 & A3 --> DBL[(BBDD líder)]
DBL --> DBR1[(Réplica)]
DBL --> DBR2[(Réplica)]
A1 & A2 & A3 --> Q[[Cola / Kafka]]
Q --> W[Workers]
W --> OBJ[(Object storage<br/>S3)]
Cada caja de este diagrama es una decisión con trade-offs. Ser capaz de justificar por qué está cada una (y cuándo sobra) es lo que se evalúa.