el punto de partida correcto para casi todos
Monolito
Una sola aplicación y un solo deploy con todo adentro: UI o API, lógica y acceso a datos. Django, Rails, Laravel, NestJS o Express "todo en uno".
Explicado fácil: un restaurante con una sola cocina donde se hace todo: entradas, platos y postres. Fácil de manejar. Si se rompe el horno, no sale nada.
A favor
- Simple de desarrollar y debuggear
- Un deploy, transacciones fáciles
- Barato
En contra
- Escala como un bloque
- Con equipos grandes, conflictos
- Un bug puede tirar todo
Usalo cuando: MVP, startup, equipo de 1 a 15 devs, dominio que todavía cambia.
lo que recomienda un senior hoy
Monolito modular
Un solo deploy, pero dividido internamente en módulos con límites claros (usuarios, pagos, catálogo) que solo se hablan por interfaces públicas.
Explicado fácil: la misma cocina única, pero dividida en estaciones con su propio cocinero (pastas, parrilla, postres) que se pasan los platos por una ventanilla. Si mañana querés mudar la parrilla a otro local, ya está separada.
A favor
- Orden sin costo de red
- Fácil extraer un servicio después
En contra
- Requiere disciplina
- Sigue siendo un deploy
Usalo cuando: el producto crece y querés prepararte para microservicios sin pagar su costo todavía.
escala organizacional, no solo técnica
Microservicios
Muchos servicios chicos, cada uno con su propia base de datos y su deploy, que se comunican por HTTP/gRPC o eventos.
Explicado fácil: un patio de comidas: cada local es independiente, tiene su cocina, su caja y su personal. Si se cae la pizzería, el resto sigue vendiendo. Pero coordinar un combo entre tres locales es más complicado.
A favor
- Equipos autónomos
- Escalás solo lo que lo necesita
- Cada servicio en su lenguaje
En contra
- Complejidad de red, latencia
- Transacciones distribuidas (sagas)
- Observabilidad obligatoria
Usalo cuando: muchos equipos trabajan sobre el mismo producto y el monolito ya frena los deploys.
pagás por ejecución
Serverless
Funciones que corren ante un evento (request HTTP, archivo subido, cron). AWS Lambda, Vercel Functions, Cloudflare Workers, Google Cloud Functions.
Explicado fácil: en vez de tener tu cocina, pedís un cocinero por delivery cada vez que llega un cliente. Si no viene nadie, no pagás nada. Si vienen mil, te mandan mil. El primero puede tardar un poco en llegar (cold start).
A favor
- Cero servidores que mantener
- Escala automática a cero y a mil
- Barato con tráfico irregular
En contra
- Cold starts
- Límites de tiempo y memoria
- Conexiones a DB necesitan pooling
Usalo cuando: tráfico variable, webhooks, tareas puntuales, landings con API chica.
desacoplar con eventos
Event-driven
Los componentes publican eventos ("pedido_creado") en un broker (Kafka, RabbitMQ, SQS) y otros los consumen sin conocerse entre sí.
Explicado fácil: una cocina con comandas colgadas en un riel. El mozo cuelga "pedido mesa 4" y se va; la parrilla, la caja y el que arma el ticket la ven y cada uno hace su parte, sin hablar entre ellos.
A favor
- Desacople total
- Absorbe picos
- Fácil agregar consumidores
En contra
- Consistencia eventual
- Difícil seguir el flujo
- Hay que manejar duplicados
Usalo cuando: procesos asíncronos (mails, facturación, notificaciones), integraciones entre sistemas.
patrones de organización del código
Capas / Hexagonal / Clean
No definen cómo se despliega, sino cómo se ordena el código. En capas: controlador → servicio → repositorio. Hexagonal: el dominio en el centro y la DB, HTTP o colas como "adaptadores" intercambiables. Ver hexagonal en detalle.
Explicado fácil: la receta (lógica de negocio) no depende de qué horno uses. Hoy cocinás con gas, mañana con eléctrico, y la receta no cambia. En código: hoy Postgres, mañana Mongo, y la lógica sigue igual.
A favor
- Lógica testeable sin DB
- Cambiar de proveedor es barato
En contra
- Más archivos y abstracciones
- Excesivo para un CRUD
Usalo cuando: la lógica de negocio es rica y va a vivir años.
un backend por cada cliente
BFF (Backend for Frontend)
Una capa de API pensada para un frontend específico (web, mobile) que agrega y adapta datos de varios servicios internos.
Explicado fácil: un mozo distinto para el salón y otro para el delivery. Los dos piden a la misma cocina, pero cada uno arma la entrega como la necesita su cliente.
A favor
- Respuestas a medida de cada pantalla
- Menos requests desde mobile
En contra
- Lógica duplicada entre BFFs
Usalo cuando: web y app mobile necesitan datos muy distintos del mismo backend.
tiempo real
Real-time (WebSockets / SSE)
Conexión persistente para empujar datos al cliente: chats, dashboards en vivo, juegos, streaming de respuestas de IA.
Explicado fácil: en vez de que el cliente pregunte cada 5 segundos "¿ya está mi pedido?", queda una línea telefónica abierta y la cocina avisa apenas está. Es lo que usa WhatsApp Web.
A favor
- Latencia mínima
- Sin polling
En contra
- Conexiones con estado, más difícil escalar
- Necesita pub/sub (Redis) entre nodos
Usalo cuando: el usuario necesita ver cambios al instante. Node.js brilla acá.