01 / Entender
Arquitecturas y sus intercambios.
02 / Decidir
Preguntas que cambian el diseño.
03 / Publicar
Servicios, servidores y operación.
Cómo organizar una aplicación, elegir sus piezas y publicarla con criterio.
Arquitecturas y sus intercambios.
Preguntas que cambian el diseño.
Servicios, servidores y operación.
Una buena arquitectura responde a un problema concreto.
Es la organización del sistema: sus partes, sus responsabilidades y cómo se comunican.
Interfaz, lógica, datos e integraciones.
Quién llama a quién y qué información intercambian.
Qué priorizamos y qué costo aceptamos.
No es solo un dibujo: también son límites y decisiones.
Primero separa responsabilidades. Después decide dónde ejecutarlas.
La interfaz que ve y usa la persona: una web, una app o un juego.
La lógica y los endpoints que reciben solicitudes y devuelven respuestas.
Lo que debe durar: registros en una base de datos y archivos en un storage.
API = una forma definida de pedirle algo a otro componente.
Ejemplo: guardar el progreso de un jugador.
El cliente envía el progreso y una credencial al endpoint.
El backend comprueba identidad, permisos y reglas del juego.
Guarda los datos y confirma el resultado, o devuelve un error.
El cliente no debe poder decidir por sí solo que tiene permisos.
El código, las máquinas y los datos no son lo mismo.
Cómo separas las responsabilidades: capas, módulos o servicios.
Dónde corre cada parte: navegador, función, contenedor o servidor.
Quién es dueño de la información y cómo mantiene su consistencia.
Un monolito puede correr en un contenedor y usar una base administrada.
El cliente pide; el servidor procesa y responde.
Centraliza reglas y datos. Puedes actualizar el servidor sin reinstalar cada cliente.
Depende de la red. Debes manejar latencia, errores y disponibilidad.
Apps web y juegos online: un cliente consulta su perfil a una API.
Una aplicación reúne la lógica y se despliega como una unidad.
Arranque sencillo, menos piezas y fácil seguimiento de una solicitud.
Cambios y despliegues comparten la misma aplicación; el acoplamiento puede crecer.
MVP y equipos pequeños: catálogo, pedidos y usuarios en un backend.
Monolito no significa código desordenado.
Cada capa tiene una responsabilidad y usa interfaces para comunicarse.
Separa presentación, reglas y acceso a datos; facilita pruebas y mantenimiento.
Capas innecesarias agregan pasos. Si filtras detalles entre ellas, pierdes la separación.
Sistemas con reglas claras: una API llama a negocio y negocio a persistencia.
Capas lógicas ≠ máquinas distintas. Pueden vivir en un monolito.
Un despliegue, con módulos que tienen límites explícitos.
Conserva una operación sencilla y organiza el dominio en piezas claras.
Hay que cuidar los límites; importar todo desde cualquier módulo los rompe.
Producto que crece con un equipo pequeño. Shopify ha documentado este enfoque.
El diagrama es didáctico: muestra módulos dentro de una sola aplicación.
Usas servicios preparados para datos, identidad y archivos.
Construyes antes: menos infraestructura y funcionalidades comunes listas.
Dependes de límites y APIs del proveedor. Los permisos siguen siendo tu responsabilidad.
Prototipos y apps CRUD: frontend + Supabase Auth, Postgres y Storage.
CRUD = crear, leer, actualizar y borrar registros.
Tu código responde a solicitudes o eventos; la plataforma gestiona la ejecución.
Reduce la administración de servidores y puede escalar con la demanda.
Límites de ejecución, arranque y dependencia del proveedor. Revisa el modelo de cobro.
Webhooks, una API breve o procesar una imagen al subirla: AWS Lambda Functions.
Serverless sigue usando servidores: la plataforma se encarga de ellos.
Servicios independientes, organizados por capacidades del negocio.
Equipos pueden desplegar y escalar capacidades con mayor independencia.
Red, coordinación de datos, versiones y observabilidad hacen más difícil la operación.
Varios equipos con límites claros. Netflix documenta una arquitectura de microservicios.
Separar procesos no elimina el acoplamiento: también importan los contratos.
Una parte publica algo que ocurrió; otras reaccionan.
Desacopla trabajos y permite procesarlos en segundo plano.
Puede haber retrasos, duplicados y desorden. Necesitas reintentos y seguimiento.
Un pedido creado dispara correo, inventario y analítica mediante una cola.
Un evento dice lo que ocurrió. Un comando pide que ocurra algo.
La comunicación síncrona y la asíncrona resuelven necesidades diferentes.
Pides y esperas la respuesta. Ejemplo: consultar el saldo antes de mostrarlo.
Aceptas el trabajo y lo procesas después. Ejemplo: generar un reporte pesado.
¿La persona necesita el resultado ahora? ¿Qué pasa si el trabajo falla después?
Una solicitud puede llegar dos veces aunque el usuario haya hecho un solo clic.
Se guarda un pedido, falla la respuesta y el cliente vuelve a intentarlo.
Usa un identificador de operación y reconoce si ya la procesaste: idempotencia.
Limita los reintentos, espera entre ellos y conserva los fallos para revisarlos.
No supongas que una cola o la red entregan todo exactamente una vez.
No tienes que escoger una sola etiqueta para toda la aplicación.
Un monolito modular con capas para las reglas de negocio.
La API en un servidor; una función para procesar archivos.
HTTP para leer datos y eventos para tareas en segundo plano.
Explica qué problema resuelve cada pieza.
Antes del diagrama: entiende el producto y al equipo.
¿Qué debe hacer hoy? ¿Qué funciones son esenciales para la primera versión?
¿Cuántas personas construyen y operan? ¿Qué tecnologías conocen?
¿Cuánto pueden gastar y cuánto tiempo tienen para lanzar?
Para una app sencilla, empieza evaluando un monolito modular o un BaaS.
Las respuestas pueden cambiar la arquitectura más que una preferencia técnica.
¿Quién usa el sistema, desde dónde y con qué conexión? ¿Cuáles son los picos?
¿Qué recorrido es crítico? ¿Necesita respuesta inmediata o puede esperar?
¿Quién despliega y atiende fallos? ¿Necesitamos que varios equipos publiquen por separado?
Diseña lo que ocurre cuando algo sale mal.
¿Qué es sensible? ¿Dónde debe almacenarse? ¿Qué no puede perderse ni duplicarse?
¿Todos deben ver el mismo estado inmediatamente? ¿Se tolera un retraso?
¿Cuánto tiempo podemos estar caídos? ¿Cuántos datos podemos perder? ¿Cómo restauramos?
Pregunta por el impacto del fallo, no solo por la cantidad de usuarios.
Ejemplo de requisitos para un ejercicio; estos números no son recomendaciones universales.
El 95 % de las consultas de perfil responde en menos de 500 ms.
Restaurar el servicio en 1 hora; perder como máximo 24 horas de datos.
Un presupuesto mensual acordado, con alertas y revisión del consumo.
Un objetivo medible permite probar si el diseño cumple.
Un documento corto conserva el porqué de una elección.
Equipo de dos personas; necesitamos cuentas, perfiles y una primera versión web.
Vercel + Supabase. Alternativa: API propia + Postgres en un VPS.
Lanzamos pronto; aceptamos dependencia del proveedor y revisaremos límites y costo.
Incluye una señal para revisarla: límites, costos o nuevas necesidades.
Primero mide: CPU, memoria, consultas, tiempos y errores.
Corrige consultas, índices o trabajo repetido antes de multiplicar servidores.
Una máquina con más capacidad. Sencillo, pero tiene un techo.
Varias instancias distribuyen trabajo. Requiere coordinar tráfico y estado.
Más usuarios no significa automáticamente microservicios.
Si una instancia desaparece, la información importante no debería desaparecer con ella.
Memoria y disco local pueden ser temporales. No guardes ahí la única copia del progreso.
Datos en una base; archivos en storage; sesiones compartidas cuando sea necesario.
Con estado externo, varias instancias pueden atender solicitudes del mismo usuario.
Stateless: una instancia no necesita recordar solicitudes anteriores para atender la próxima.
Tu máquina puede servir la app mientras está encendida; publicar requiere una dirección accesible y una operación estable.
Generas los archivos o la imagen ejecutable de la aplicación.
Los colocas en una plataforma o servidor conectado a internet.
Configuras dominio, HTTPS, variables, datos y servicios externos.
Publicar la interfaz no publica automáticamente el backend ni la base de datos.
Esta diferencia ayuda a elegir dónde alojar cada pieza.
HTML, CSS, JavaScript e imágenes ya generados. Un hosting o CDN entrega archivos.
Código del servidor responde según el usuario o los datos: API y renderizado del servidor.
Una interfaz estática puede llamar a una API dinámica. No necesitas alojarlas juntas.
Una app hecha con un framework no es necesariamente solo estática.
Cuanto más control tomas, más operación asumes.
Gestiona gran parte de la infraestructura. Tú cuidas código, permisos, datos y consumo.
Recibes una máquina virtual. Tú configuras sistema, procesos, actualizaciones y backups.
Puedes tener hardware exclusivo. Debes definir quién cuida red, hardware y sistema.
Administrado no significa libre de responsabilidades.
Una ruta directa del repositorio a una web publicada.
Frontend, sitios y aplicaciones con funciones del servidor compatibles con su plataforma.
Conecta Git, configura el proyecto y las variables. Cada cambio puede generar un despliegue.
Build, previews, runtime, límites y costo. Un proceso persistente de juego necesita otra evaluación.
Una preview permite probar un cambio antes de llevarlo a producción.
Una base Postgres acompañada de servicios para construir una aplicación.
Postgres para registros relacionados: usuarios, perfiles, productos y pedidos.
Auth para identidad; Storage para archivos; Realtime y Edge Functions según la necesidad.
Configura políticas de acceso. Con RLS, cada fila tiene reglas sobre quién puede leerla o cambiarla.
RLS = seguridad a nivel de fila. Tener login no define todos los permisos.
Vercel + Supabase: una combinación para una app web con cuentas y datos.
Publica el frontend en Vercel y configura la URL del proyecto.
Crea tablas, Auth y políticas RLS en Supabase; usa Storage para los archivos.
Ejecuta operaciones privilegiadas en backend o funciones; conserva allí los secretos.
Prueba con dos cuentas: una no debe ver ni modificar los datos privados de la otra.
Dos puntos de entrada con responsabilidades diferentes.
Publicación web con flujo desde Git, builds y distribución. Útil para frontends compatibles.
Instancias y recursos con una experiencia más simple que armar cada pieza por separado.
Si solo necesitas publicar una web, evalúa hosting. Si necesitas controlar una máquina, evalúa Lightsail.
AWS es un catálogo de servicios: empieza con las piezas que necesitas.
Una máquina virtual frente a funciones que atienden solicitudes o eventos.
Control sobre una VM y sus procesos. Puedes alojar una API o un servidor persistente.
Ejecuta código por solicitudes o eventos; revisa tiempos, recursos y modelo de ejecución.
Expone endpoints y conecta solicitudes con un backend como Lambda.
EC2 exige más administración; las funciones exigen adaptarte a su runtime.
Almacenamiento de objetos y distribución de contenido.
Guarda archivos como objetos: imágenes, videos, exportaciones y respaldos.
Una CDN distribuye contenido desde ubicaciones cercanas a los usuarios.
Los avatares viven en S3 y se entregan mediante CloudFront; sus metadatos viven en una base.
S3 no sustituye a una base relacional ni ejecuta tu backend.
Elige según las consultas y relaciones que requiere tu aplicación.
Bases relacionales administradas. Útil para SQL, relaciones y transacciones.
Base NoSQL de clave-valor y documentos. Diseña sus claves según los accesos previstos.
¿Cómo leerás y actualizarás los datos? No elijas solo por la promesa de escalar.
Administrado reduce trabajo operativo; todavía debes diseñar y proteger tus datos.
Tres servicios frecuentes alrededor de una aplicación.
Registro e inicio de sesión. Tu aplicación sigue decidiendo qué puede hacer cada usuario.
Colas para trabajo en segundo plano. Diseña consumidores capaces de manejar reintentos.
Logs, métricas y alarmas para entender qué ocurre y detectar fallos.
Añade cada servicio cuando resuelva una necesidad concreta.
Publicar una interfaz y ejecutar un backend administrado.
Hosting para archivos web, con HTTPS y distribución. Útil para el frontend.
Ejecuta contenedores en una plataforma administrada; permite publicar un servicio HTTP.
Auth, una base y almacenamiento de objetos según tus necesidades. Conserva los datos fuera del contenedor.
Un contenedor que arranca bien en local todavía necesita configuración y permisos en la nube.
Servicios administrados para cada responsabilidad.
Publica aplicaciones web con archivos estáticos e integración de backend según la configuración.
Aloja aplicaciones y APIs; admite distintos runtimes y contenedores compatibles.
Azure Database for PostgreSQL para datos relacionales; Blob Storage para objetos.
Escoge por requisitos, experiencia del equipo y costo de operar.
Archivos estáticos, código y almacenamiento dentro de otra plataforma.
Publica los archivos de una web junto con un Worker cuando necesitas lógica.
Ejecuta código en el runtime de la plataforma. Revisa compatibilidad y límites.
Almacenamiento de objetos para archivos. No reemplaza tu modelo de datos relacional.
Antes de migrar, verifica que tu aplicación sea compatible con el entorno de ejecución.
Un servidor virtual que puedes configurar para tu aplicación.
Control del sistema y los procesos; útil para backends y servicios persistentes.
Actualizaciones, seguridad, monitoreo, certificados, backups y recuperación.
API o servidor de juego con necesidades concretas. Un proveedor como DigitalOcean ofrece VMs.
CPU dedicada en una VM no implica un servidor físico completo para ti.
Hardware reservado para un cliente; la administración depende del contrato.
Mayor control del hardware y capacidad exclusiva para cargas sostenidas.
Menos flexibilidad inmediata; debes prever fallos y quién mantiene el equipo.
Requisitos de hardware, aislamiento o consumo sostenido que justifican esa operación.
“Servidor dedicado de juego” también puede ser un proceso que corre en una VM.
Una imagen contiene la aplicación y sus dependencias; un contenedor la ejecuta.
Repite el entorno y facilita entregar la app a plataformas que aceptan contenedores.
No gestiona por sí solo dominio, escalado, backups ni toda la seguridad.
El contenedor se puede reemplazar. Usa volúmenes o servicios externos para persistir información.
Un contenedor comparte el kernel del host; no es una máquina virtual completa.
Deja una ruta clara desde un cambio hasta una aplicación comprobada.
Repositorio, build reproducible, variables y migraciones de datos planificadas.
Despliega una versión identificable y conecta los servicios necesarios.
Abre la URL, inicia sesión, prueba el recorrido crítico y comprueba logs y errores.
Conserva una versión anterior que puedas volver a desplegar.
Una dirección fácil de recordar necesita apuntar al destino correcto.
El nombre: por ejemplo, miapp.com. Se registra y renueva.
Indica a qué destino corresponde ese nombre mediante registros.
Cifra la conexión con un certificado válido; muchas plataformas lo gestionan.
Si el dominio abre la web pero falla la API, revisa también las URLs y la configuración del backend.
Son tres responsabilidades distintas.
Autenticación: ¿quién eres? Un login o token demuestra una identidad.
Autorización: ¿qué puedes hacer? Comprueba cada acción y cada acceso a datos.
Claves privadas en el servidor. Una clave publishable de Supabase requiere RLS; service_role no va en el cliente.
Lo que incluyes en el JavaScript del navegador puede ser visto por el usuario.
El sistema necesita señales y una forma de recuperarse.
Logs para eventos, métricas para tendencias y alertas para problemas que requieren acción.
Backups y pruebas de restauración; versiones identificables y un plan de rollback.
Revisa cómputo, almacenamiento y transferencia. Una alerta de presupuesto no es un tope automático.
Un respaldo que nunca has restaurado todavía no prueba que puedas recuperar el sistema.
Guardar un perfil y simular una partida en tiempo real son trabajos diferentes.
Una API y una base persistente guardan información entre sesiones.
Un proceso autoritativo valida acciones y mantiene el estado compartido durante la sesión.
Evalúa latencia, regiones, sesiones y capacidad. Amazon GameLift Servers es una opción especializada.
El proceso autoritativo decide el estado válido; el cliente envía acciones.
La complejidad y los fallos suelen aparecer en decisiones pequeñas.
Microservicios sin equipos ni necesidades independientes aumentan el trabajo de coordinación.
Ocultar un botón no protege una operación. El servidor o las políticas deben validarla.
Disco local, secretos expuestos o backups sin pruebas pueden convertir un fallo en pérdida de datos.
La arquitectura incluye lo que pasa después del primer despliegue.
Elige una app pequeña: perfiles de jugadores, una tienda o una lista de tareas.
Cliente, lógica y datos. Marca quién se comunica con quién y qué se guarda.
Una opción, una alternativa, una ventaja y un costo. Añade una señal para evolucionar.
Elige servicios, protege permisos y secretos, y prueba un recorrido completo en una URL.
La mejor elección es la que puedes explicar, operar y comprobar.