Arquitectura · Microservicios

De un monolito
a muchos servicios

Por qué se parte una aplicación en servicios, qué se gana y qué problema nuevo aparece del lado del cliente.

→ avanzar · S notas del orador · F pantalla completa · O vista general

Deslizá hacia abajo para recorrerla. Las simulaciones se activan al llegar a cada una.

github.com/gastonprieto/presentacion-microservicios
Punto de partida

Una app, una dirección

/usuarios/ordenes/pagos

Una sola aplicación hace todo: usuarios, órdenes y pagos son módulos del mismo programa. El cliente conoce una sola dirección: tienda.com.

Tráfico entrante
3 req/s
  • Un solo código, un solo deploy, una sola base de datos.
  • Para muchos sistemas, esto está bien: es simple de entender, probar y operar.
  • Si hace falta más capacidad, ya lo vimos: copias detrás de un load balancer.
Límite

Se satura una parte, escalás todo

/usuarios/ordenes/pagos

Llega un pico de pagos. La única forma de atenderlo es clonar la app entera.

  • Cada copia carga los tres módulos, aunque solo pagos esté saturado.
  • Pagamos memoria y CPU para usuarios y órdenes que nadie está pidiendo.
Límite

Cambiás una parte, deployás todo

/usuarios/ordenes/pagos

Cambia una línea de pagos. Para que llegue a producción hay que redeployar la app entera, copia por copia.

Se redeployaron
—
  • No hay caída: el deploy es gradual, como vimos con el LB. El costo es coordinar y arriesgar todo por un cambio chico.
  • Si el cambio trae un bug, el bug llega a todas las copias.
Partir

Cada parte, su propio servicio

/usuarios/ordenes/pagos

Los módulos del monolito pasan a ser programas separados, que se hablan por la red.

  • Cada servicio tiene su código, su deploy y su escalado.
  • Cada uno puede tener su propio load balancer y sus réplicas.
  • Idealmente, sus propios datos: nadie más toca su base.
  • Suele seguir la forma de los equipos: un equipo, uno o pocos servicios.
Ganancia

Escalar, deployar y fallar por separado

/usuarios/ordenes/pagos

Las mismas pruebas de antes, ahora servicio por servicio.

  • El pico se absorbe con réplicas solo de pagos: 5 unidades contra 9 del monolito.
  • Un deploy de órdenes no toca a usuarios ni a pagos.
  • Si pagos se cae, el resto sigue andando.
Ganancia

Cada servicio elige su tecnología

Monolito un stack para todo

usuariosJava 8MySQL órdenesJava 8MySQL pagosJava 8MySQL
  • Un lenguaje, un framework y una base para todos los módulos.
  • Actualizar el framework es actualizar todo a la vez.
  • Si un módulo necesita otra cosa, se arregla con lo que hay.

Servicios cada uno el suyo

usuariosJava 21PostgreSQL órdenesNode.jsMongoDB pagosGoPostgreSQL + Redis
  • Lo único que comparten es el contrato: HTTP y JSON.
  • Cada uno usa la base que le sirve y se puede reescribir sin tocar a los demás.
  • Poder no es deber: cada stack nuevo es algo más para aprender, monitorear y mantener.
Organización

Los servicios siguen a los equipos

Monolito todos en el mismo código

👥 Equipo A👥 Equipo B👥 Equipo C
↘ ↓ ↙
tienda
  • Un cambio de un equipo espera el deploy de todos.
  • Para salir hay que coordinar: reuniones, ramas, congelamientos.

Servicios un equipo, sus servicios

👥 Usuarios👥 Órdenes👥 Pagos ↓↓↓ usuariosórdenespagos
  • Cada equipo lo construye, lo deploya y lo opera.
  • Entre equipos se acuerda el contrato, no la fecha de salida.

“Las organizaciones diseñan sistemas que copian su estructura de comunicación.” — Ley de Conway, 1967

El costo

El cliente conoce tres direcciones

/usuarios/ordenes/pagos/ordenes/envios

Cada servicio tiene su propia dirección, y el cliente (el navegador, la app del celular) tiene que conocerlas todas.

  • Mover o partir un servicio rompe a los clientes hasta que se actualicen. Y una app de celular no se actualiza cuando nosotros queremos.
  • Todos los servicios quedan expuestos a internet, y cada uno repite HTTPS, autenticación y límites.
Una sola dirección

Una app web que orquesta

páginausuariosórdenespagosenvíos

El cliente le habla solo a la app web, en tienda.com. Ella llama a cada servicio y arma la página.

Tráfico entrante (páginas)
2 req/s
Código de la app web
  • El cliente vuelve a conocer una sola dirección.
  • Los servicios ya no están expuestos: solo la app web los ve.
  • Esto tiene nombre: orquestación. La app web es el orquestador: decide a quién llamar, en qué orden, y arma el resultado.
Orquestar

El orquestador decide el orden

páginausuariosórdenespagos

La misma página, con las mismas tres llamadas. Lo único que cambia es cómo las hace la app web.

Última página, llamada por llamada
  • Orquestar = una pieza central que dirige cada paso.
  • El orden y las dependencias (la orden antes que su envío) viven en su código.
Orquestar

Cuando falta una parte

páginausuariosórdenespagos

Se cae Órdenes. ¿La página sale igual, o falla entera? Lo decide el orquestador.

Lo que ve el cliente
  • Con un hueco, Usuarios y Pagos siguen sirviendo.
  • Esa decisión también es código del orquestador, página por página.
Grietas

El orquestador se volvió un mini-monolito

páginausuariosórdenespagosenvíos

Funciona, pero todo lo que cambia atrás pasa por la app web.

Código de la app web
  • Cada servicio nuevo = código nuevo + deploy de la app web.
  • HTTPS, autenticación, límites: todo acá, para todos.
  • Si se cae la app web, se cae todo, aunque los servicios estén sanos.
Cierre

Lo que nos llevamos

🧱

Monolito

Simple, pero se escala, se deploya y se cae todo junto.

🧩

Servicios

Cada parte escala, se deploya y falla por su cuenta, con su tecnología y su equipo.

🎼

Orquestador

El cliente conoce una sola dirección: la app web llama a los servicios, decide el orden y qué hacer si falta una parte. A cambio, cada servicio nuevo es código y deploy suyo, y si se cae, cae todo.

Seguir explorando

Llevátela y probala

QR a la presentación publicada
Escaneá para abrirla en el celular
gastonprieto.github.io/
presentacion-microservicios

🧪 Animate a probar tu propia arquitectura

En el Architecture Playground armás un sistema con las piezas que vimos (clientes, servicios, load balancers, proxies, cachés, colas, brokers) y lo ponés bajo carga.

Arrancá por el preset Orden de compra y compará la versión orquestada con la coreografiada.

Abrir el playground →
github.com/gastonprieto/presentacion-microservicios

🐳 En el repo también hay un laboratorio con Docker para probar lo mismo con servicios de verdad.