Arquitectura básica en la nube

Tres personajes del elenco vestidos de arquitectos discutiendo principios de arquitectura cloud

En la Unidad 2 vimos las dos capas técnicas que sostienen la nube (virtualización y containerización). En esta unidad subimos un nivel: ¿qué principios guían las decisiones de arquitectura cuando diseñamos para la nube? Vamos a ver tres leyes empíricas que, una y otra vez, predicen por qué los sistemas distribuidos funcionan o fracasan: la Ley de Conway, la Ley de Gall y el Principio CAP.

1. ¿Por qué leyes y no recetas?

A diferencia de la Unidad 2, acá no hay comandos para copiar. Las leyes que siguen son observaciones sobre cómo se comportan los sistemas distribuidos y las organizaciones que los construyen. Conocerlas no te dice qué elegir, te dice por qué tu elección va a salir bien o mal. Diseñar arquitectura cloud sin estas leyes es como diseñar un puente sin entender de física: a veces se aguanta, pero no sabés por qué.

Concepto clave

La arquitectura cloud está moldeada por fuerzas que no son técnicas.

La idea de fondo

La forma de tu sistema distribuido depende tanto de cómo se organiza tu equipo (Conway) y de cómo evolucionó tu producto (Gall) como de las tecnologías que elijas. Y una vez en producción, la física de las redes te obliga a hacer trade-offs (CAP) que no podés evitar.

Las tres leyes

ConwayEl sistema reflejará la estructura de comunicación de quienes lo construyen.

GallLos sistemas complejos que funcionan evolucionaron desde sistemas simples que funcionaban.

CAPEn sistemas distribuidos, no podés tener consistencia, disponibilidad y tolerancia a particiones al mismo tiempo.

Para tener en cuenta

2. Ley de Conway

Enunciada por Melvin Conway en 1967, antes de que existiera "la nube". Conway era programador y notó un patrón inquietante: la arquitectura del software refleja la arquitectura social del equipo que lo construye.

Concepto clave

"Las organizaciones que diseñan sistemas están condenadas a producir diseños que copian la estructura de comunicación de dichas organizaciones." — Melvin Conway, 1967

Por qué importa en la nube

La nube favorece sistemas distribuidos: microservicios, serverless, contenedores orquestados. Cada uno de esos componentes tiene un dueño humano. Si los humanos no se comunican de forma desacoplada, los componentes tampoco lo harán. Es por eso que dos empresas con la misma stack pueden terminar con arquitecturas radicalmente distintas.

Las consecuencias en cloud

Equipos aisladosArquitectura desacoplada, microservicios bien definidos.

Equipo único y grandeMonolito o sistema con acoplamiento fuerte.

Comunicación rígidaIntegraciones pesadas, contratos fijos, APIs poco evolutivas.

Para tener en cuenta

  • La "Inverse Conway Maneuver": si querés cierta arquitectura, primero diseñá los equipos que la producirán.
  • Conway aplica también a la cultura: un equipo que no confía entre sí va a construir contratos defensivos.
Personaje del elenco vestido de operador de centralita conectando varias cajas con cables

Ejemplos de Conway en la nube

Los patrones más comunes que se ven en la práctica son cuatro. Cuando una empresa tiene equipos independientes para pagos, catálogo y usuarios, cada uno termina desplegando su propio servicio con la tecnología que mejor le sienta: pagos con AWS Lambda + API Gateway, catálogo con contenedores en EKS, usuarios con Firebase. El resultado es una arquitectura multi-cloud desacoplada, con escalado y despliegues independientes por servicio. En el otro extremo, un equipo único y grande que gestiona toda la aplicación produce un monolito en una VM. Tiene sentido organizacional —una sola reunión, una sola release— pero arrastra cuellos de botella en los deploys, escalado horizontal limitado y la fragilidad de que un bug en cualquier módulo tumba todo.

Cuando dos equipos necesitan integrarse pero la comunicación es rígida, la solución típica es una cola de mensajes (SNS/SQS, Pub/Sub) con un contrato fijo. Parece desacoplar, pero solo cambia el lugar del acoplamiento: ahora vive en el contrato del mensaje, y si un equipo lo cambia, el otro se rompe igual. Por último, cuando hay DevOps por producto —cada equipo construye, opera y monitorea su propio servicio de punta a punta— la tendencia natural es elegir servicios serverless (Lambda + DynamoDB) por equipo, con la mínima dependencia cruzada posible.

Tip

Si querés una arquitectura cloud determinada, diseñá primero la organización. Cambiar arquitectura es difícil; cambiar la estructura humana que la produce es todavía más difícil, pero es lo que sostiene el cambio técnico.

3. Ley de Gall

Enunciada por John Gall en 1975 (en Systemantics), es la ley que más arquitectos cloud ignoran y más caro pagan cuando lo hacen. Tiene tres formulaciones complementarias:

Concepto clave

"Un sistema complejo que funciona invariablemente ha evolucionado a partir de un sistema simple que funcionaba." — John Gall, 1975

Los dos corolarios

Corolario AUn sistema complejo diseñado desde cero nunca funciona y no puede repararse para hacerlo funcionar: hay que empezar de nuevo desde un sistema simple.

Corolario BLos sistemas tienden a crecer en complejidad hasta superar la capacidad de sus diseñadores para manejarlos.

Por qué importa en la nube

La nube ofrece tantas piezas que es muy tentador armar la arquitectura "perfecta" desde el día 1: Kubernetes multi-región, service mesh, observabilidad completa, GitOps, etc. Gall predice qué va a pasar: el equipo se va a hundir operando esa complejidad antes de tener clientes que la justifiquen.

Para tener en cuenta

  • "Simple primero" no significa "para siempre simple": es el punto de partida desde donde evolucionar.
  • La complejidad debe responder a un problema real ya observado, no a uno anticipado.
Personaje del elenco vestido de jardinero contemplando un brote tierno sobre una cajita simple

Caso: evolución natural de monolito a serverless

Cómo una arquitectura cloud evoluciona bien
  1. Punto de partida. Una startup lanza un MVP: monolito en una VM (EC2 o equivalente), una base de datos. Funciona, pero el equipo no puede escalar features rápido.
  2. Primer dolor real. El módulo de autenticación bloquea releases del resto. Se extrae a un servicio serverless (Lambda + Cognito).
  3. Segundo dolor real. La base de datos no escala en picos. Migran a Aurora Serverless o una base gestionada similar.
  4. Tercer dolor real. El monolito sigue acoplando deploys. Recién ahora dividen el resto en microservicios sobre EKS.
  5. Resultado. Una arquitectura cloud-native compleja que funciona, porque cada paso resolvió un problema concreto y ya validado.

Anti-patrón: la arquitectura "perfecta" del día 1

Overengineering Kubernetes desde el día 1

Qué suele pasar

Un equipo arranca un proyecto chico y monta de entrada Kubernetes con service mesh (Istio), GitOps (ArgoCD), monitoreo completo (Prometheus + Grafana), múltiples namespaces y un esquema de roles RBAC sofisticado. Tres microservicios. Tres.

Por qué

Se confunde "estado final de empresas grandes" con "buena práctica". Se invierte tiempo en operar la infra en lugar de validar la idea del producto.

Cómo evitarlo

Empezá con servicios gestionados simples (App Engine, Fly.io, Render, ECS Fargate). Migrá a Kubernetes cuando el equipo sea grande, las cargas heterogéneas y la portabilidad un requisito, no antes.

Caso: una API que creció bien

De simple a complejo, en fases manejables
  1. Fase 1 — API simple. API Gateway + Lambda. Sin estado, sin base de datos, sin observabilidad cara. Resuelve el caso de uso original.
  2. Fase 2 — persistencia. Aparece la necesidad real de guardar estado. Se agrega DynamoDB. Punto.
  3. Fase 3 — orquestación. Una operación pasa a tener 4 pasos coordinados con reintentos. Se incorpora Step Functions.
  4. Fase 4 — eventos asíncronos. Un equipo tercero necesita escuchar lo que pasa. Se publica a EventBridge.

Caso real ilustrativo: Netflix empezó con un monolito en sus propios data centers. Migró a AWS de a poco, no de un día para el otro, y construyó sus herramientas famosas (Chaos Monkey, Hystrix) para aprender a operar la complejidad emergente, no para evitarla por diseño previo.

4. Principio CAP

Formulado por Eric Brewer en 2000 (conjetura) y demostrado formalmente por Gilbert y Lynch en 2002, el teorema CAP es la ley física de los sistemas distribuidos. No describe una preferencia: describe un límite que no se puede superar.

Concepto clave

En un sistema distribuido solo podés garantizar dos de tres: Consistencia, Disponibilidad y Tolerancia a particiones.

Las tres propiedades

C — ConsistenciaTodos los nodos ven los mismos datos al mismo tiempo.

A — DisponibilidadEl sistema responde siempre, incluso si hay fallos.

P — Partition toleranceEl sistema sigue funcionando aunque se pierda la comunicación entre nodos.

El verdadero dilema en la nube

En cloud, las particiones de red son inevitables: zonas de disponibilidad caídas, latencia variable, cables submarinos cortados. Por eso P no es opcional. El verdadero dilema se reduce a: ¿Consistencia (C) o Disponibilidad (A)?

Para tener en cuenta

  • El trade-off no es siempre el mismo dentro de una misma app: la facturación pide CP, el feed social pide AP.
  • "Consistencia eventual" no es ausencia de consistencia: es consistencia diferida en el tiempo.
Personaje del elenco vestido de malabarista con tres pelotas de colores, una se le escapa

¿Por qué CA es imposible en la nube?

Asumir CA (Consistencia + Disponibilidad sin P) en la nube

Qué suele pasar

Un equipo diseña sobre una base distribuida asumiendo que "la red siempre va a estar". Cuando hay una partición real (un AZ se cae, latencia explota, cable submarino), el sistema entra en un estado indefinido: datos inconsistentes y no disponibles a la vez.

Por qué

Las particiones en cloud no son una rareza: son una certeza estadística. Cualquier proveedor serio mide su SLA en porcentajes que presuponen particiones.

Cómo evitarlo

Asumí siempre que P es obligatorio. Decidí explícitamente C o A para cada componente, y documentá ese trade-off.

CP vs AP: cuándo elegir cada uno

CP Consistencia + Partition tolerance

El sistema prefiere rechazar operaciones antes que devolver datos inconsistentes. Si hay partición, los nodos del lado "minoritario" no aceptan escrituras.

Cuándo conviene

Cuando la exactitud importa más que la disponibilidad: pagos, facturación, inventario, historia clínica.

Ejemplos típicos

Amazon RDS con réplica síncrona Google Cloud Spanner Etcd ZooKeeper

Ejemplo real

AP Availability + Partition tolerance

El sistema prefiere responder siempre, aceptando que algunos clientes vean datos temporalmente desactualizados. La consistencia se alcanza después (consistencia eventual).

Cuándo conviene

Cuando la disponibilidad importa más que la exactitud inmediata: redes sociales, feeds, catálogos, recomendaciones, IoT.

Ejemplos típicos

Amazon DynamoDB Apache Cassandra Redis Cluster CouchDB

Ejemplo real

CP vs AP en producción

CP
  • Datos siempre exactos.
  • Razonamiento simple para el desarrollador.
  • El sistema deja de responder durante particiones.
  • Latencia más alta (consenso entre nodos).
AP
  • Responde siempre, baja latencia.
  • Escala globalmente sin coordinar.
  • Los datos pueden divergir temporalmente.
  • La aplicación debe manejar conflictos (last-write-wins, CRDTs, etc.).

Perfil CAP de algunos servicios cloud comunes

En el bando CP están servicios que prefieren bloquear escrituras antes que devolver datos inconsistentes: Amazon RDS con réplica síncrona, y Google Cloud Spanner, que garantiza consistencia global usando relojes atómicos al precio de rechazar escrituras en particiones graves. Del lado AP, Amazon DynamoDB ofrece consistencia eventual por defecto (con lecturas fuertemente consistentes opcionales a mayor costo), y Redis Cluster permite que los datos diverjan temporalmente entre shards. Azure Cosmos DB es un caso aparte: expone cinco niveles de consistencia configurables, dejando que el desarrollador elija dónde sentarse entre CP estricto y AP puro según el caso.

Ejemplo de uso mixto bien hecho: Netflix usa DynamoDB (AP) para su catálogo —donde lo que importa es responder rápido aunque un título tarde en propagarse— y Aurora (CP) para su facturación, donde una inconsistencia es inaceptable.

PACELC: la extensión moderna de CAP

Una crítica frecuente a CAP es que solo describe qué pasa cuando hay partición. PACELC, formulado por Daniel Abadi en 2010, completa la imagen: si hay partición (P), elegí entre A y C —ese es el caso original de CAP—; else (en operación normal, sin partición), elegí entre L (latencia) y C (consistencia). La idea es que incluso cuando la red anda bien, mantener consistencia entre nodos cuesta tiempo: sincronizar réplicas suma latencia, y muchos sistemas aceptan consistencia eventual también en estado normal para responder más rápido. DynamoDB, por ejemplo, es PA/EL: ante partición prioriza disponibilidad, y en operación normal prioriza latencia sobre consistencia estricta. Spanner es PC/EC: consistencia estricta en ambos casos, al precio de mayor latencia.

Si querés el espectro completo de productos por proveedor —tanto del lado relacional como NoSQL— y cuándo conviene cada perfil, ver el recurso database. Para los almacenes en memoria que aparecen del lado AP cuando hace falta velocidad sobre consistencia, ver el recurso cache. Y para desacoplar productores y consumidores aceptando consistencia eventual a propósito —la herramienta clave para construir sistemas AP sin perder operaciones—, ver el recurso colas de mensajes.

5. Cómo se conectan las tres leyes

Concepto clave

Conway moldea la forma, Gall regula el ritmo, CAP define los límites.

Una historia que combina las tres

Una startup con un equipo único (Conway → monolito) lanza un MVP en una VM (Gall → empezar simple). Funciona. Al crecer, divide el equipo en pagos, catálogo y usuarios (Conway → microservicios). Cuando cada servicio se vuelve distribuido, el equipo descubre que necesita elegir entre CP (pagos) y AP (catálogo) por separado (CAP → no se puede tener las dos cosas a la vez).

Lectura combinada

6. Errores comunes derivados

Ignorar Conway al elegir la arquitectura

Qué suele pasar

Se decide "vamos a microservicios" sin reorganizar al equipo. Resultado: microservicios artificialmente acoplados, donde cada cambio requiere reunir a cuatro personas distintas que antes estaban en la misma sala.

Cómo evitarlo

Antes de cambiar la arquitectura, cambiá la estructura de los equipos. Si no es viable cambiarla, ajustá la arquitectura a la organización real.

Diseñar la arquitectura final desde el día 1

Qué suele pasar

Se invierte 3 meses en montar service mesh, observabilidad y CI/CD avanzado antes de tener una sola línea de producto funcionando. Cuando finalmente se construye el producto, los requerimientos ya cambiaron y la "arquitectura perfecta" no encaja.

Cómo evitarlo

Aplicá Gall: lo mínimo que funcione hoy, expandilo cuando aparezca un dolor real medible.

Asumir consistencia fuerte en todos los componentes

Qué suele pasar

Se usa la misma base de datos relacional con réplicas síncronas para todo, incluyendo módulos donde una consistencia eventual sería suficiente. Los costos explotan, la latencia sube y el throughput cae.

Cómo evitarlo

Aplicá CAP por componente: identificá qué módulos pueden ser AP y reservá CP para los que realmente lo necesitan.

7. Tips y buenas prácticas

Tip

Inverse Conway Maneuver: si querés llegar a microservicios, reorganizá los equipos primero en "células" autónomas cross-funcionales. La arquitectura va a seguir.

Tip

Documentá el trade-off CAP por componente: en el README de cada servicio, dejá explícito si es CP o AP y por qué. Evita debates eternos en code reviews.

Tip

Diseñá para el fallo, no contra el fallo. Las particiones, los timeouts y los nodos muertos no son excepciones: son la realidad operacional. Probá tu sistema con Chaos Engineering desde temprano.

8. Glosario rápido

Inverse Conway Maneuver: diseñar primero la estructura de equipos que produciría la arquitectura deseada, en lugar de imponer la arquitectura sobre equipos existentes.
Microservicios: arquitectura donde la aplicación se descompone en servicios pequeños, autónomos y desplegables independientemente.
Partición de red: situación en la que dos grupos de nodos del cluster pierden comunicación entre sí (aunque cada grupo siga vivo internamente).
Consistencia eventual: garantía de que, en ausencia de nuevas escrituras, todos los nodos terminarán viendo el mismo valor — pero no inmediatamente.
Quórum: mínimo de nodos que deben acordar para considerar válida una operación; mecanismo típico de los sistemas CP.
PACELC: extensión moderna de CAP: si hay partición (P), elegí entre A y C; si no, en operación normal, elegí entre latencia (L) y consistencia (C).

9. Para profundizar

Melvin Conway · 1968 · lectura ~30 min

El artículo original donde Conway formula su ley. Vale la pena leerlo: es corto, claro y sorprendentemente vigente medio siglo después.

Ir al recurso

John Gall · 1975 · libro corto y satírico

El libro de cabecera de Gall. Mezcla teoría de sistemas con humor seco. No es sobre software: es sobre por qué cualquier sistema complejo falla. Imprescindible.

Eric Brewer · 2012 · lectura ~20 min

Brewer revisita su propia conjetura 12 años después y matiza los malentendidos comunes ("CAP no significa elegir 2 de 3 de forma binaria"). Lectura obligatoria si vas a hablar de CAP en serio.

Ir al recurso

Matthew Skelton, Manuel Pais · 2019 · libro

La aplicación moderna de la Ley de Conway. Propone cuatro tipos de equipos y tres modos de interacción para diseñar organizaciones que produzcan arquitecturas sanas.

10. Cierre

Concepto clave

La arquitectura cloud no se elige: se descubre. Lo que podés hacer es no luchar contra las leyes que la moldean.

Qué hay que llevarse

Conway, Gall y CAP no son ideas opuestas a las herramientas que vimos en las unidades anteriores: son los filtros con los que conviene mirarlas. Antes de elegir Kubernetes, preguntate qué dice Conway sobre tu equipo y qué dice Gall sobre la madurez de tu producto. Antes de elegir una base de datos, preguntate qué dice CAP sobre los trade-offs que vas a asumir.

Qué viene

Unidad 4Metodologías ágiles y ciclo de vida del software: el proceso humano que produce sistemas que respetan (o ignoran) estas leyes.

Unidad 5IA generativa y cómo se integra al stack cloud moderno.

Unidad 6Aplicaciones concretas: el catálogo de piezas con las que se arma un producto real.

Antes de seguir