Estilos Arquitectónicos
Arquitectura del Software · UDC · Material de estudio — examen final
Arquitecturas No Distribuidas — todos los componentes en una misma máquina física
Capas
No distribuidaEl sistema se divide en grupos (capas), cada una con una responsabilidad concreta. Las peticiones entran por la capa exterior, recorren todas las capas en orden y vuelven por el mismo camino. Cada capa solo habla con la adyacente.
Ventajas
- Mantenibilidad: cambiar una capa sin afectar a las demás
- Reutilización de capas en otros sistemas
- Fiabilidad: mecanismos de seguridad por capa
- Portabilidad y soporte multi-plataforma
- Divide el trabajo entre equipos (uno por capa)
Inconvenientes
- Rendimiento limitado: la petición recorre todo aunque no necesite todas las capas
- La seguridad hay que añadirla explícitamente
- No todos los sistemas encajan bien en capas
Diagramas C4
C4: Contexto
C4: Contenedor
Pipe & Filter
No distribuidaEstructura similar a capas, pero cada etapa se llama filtro. La diferencia clave: la entrada y la salida están en puntos diferentes. El cliente envía la petición, esta recorre los filtros en secuencia y sale por el último — no vuelve al punto de partida.
Ventajas
- Mejor rendimiento que capas (paralelismo)
- Filtros reutilizables e intercambiables
- Fácil añadir o quitar filtros sin afectar al resto
Inconvenientes
- No sirve para sistemas interactivos
- Encajar el sistema en filtros puede ser difícil
Diagramas C4
C4: Contexto
C4: Contenedor
Repositorio
No distribuidaExiste un componente central que centraliza toda la información. Los demás componentes no se conocen entre sí — solo conocen al repositorio. El objetivo principal es el máximo desacoplamiento entre componentes.
Ventajas
- N componentes solo necesitan 1 comunicación, no N×N
- Componentes independientes e intercambiables
- Bueno cuando la información es lo central del sistema
Inconvenientes
- El repositorio es punto único de fallo
- Si el repositorio cae, toda la comunicación se detiene
- Puede ser cuello de botella de rendimiento
Diagramas C4
C4: Contexto
C4: Contenedor
Arquitecturas Distribuidas — componentes en máquinas físicas diferentes
Cliente / Servidor
DistribuidaFuncionalidades divididas en servicios independientes. Un directorio intermediario sabe qué servicios están levantados y redirige peticiones. En la versión distribuida, cada servicio está en una máquina física diferente.
Ventajas
- Robustez: si un servicio cae, el resto sigue
- Escalabilidad: múltiples instancias del mismo servicio
- Se puede lanzar con un solo servicio operativo
Inconvenientes
- El directorio intermediario es punto único de fallo
- Varios servicios pueden necesitar la misma BD
Diagramas C4
C4: Contexto
C4: Contenedor (distribuida)
Líder / Trabajador
DistribuidaEl Líder no trabaja — solo recibe peticiones y las distribuye entre los Trabajadores. A diferencia del directorio en C/S, el líder tiene gestión activa: puede levantar o apagar trabajadores según la carga.
Ventajas
- Gran rendimiento: el líder solo organiza, no trabaja
- Escalabilidad elástica a cambios de carga
- Trabajadores intercambiables
Inconvenientes
- El líder es punto único de fallo
- Mal reparto si hay desajuste líder/trabajadores
Diagramas C4
C4: Contexto
C4: Contenedor
Peer-to-Peer (P2P)
DistribuidaNo hay directorio ni líder. Todos los nodos son iguales (peers) y tienen la misma funcionalidad completa. Una petición llega a un peer; si está disponible la atiende, si no la reenvía al peer más disponible que conozca.
Ventajas
- Escalabilidad y disponibilidad casi infinitas
- No hay punto único de fallo
- Reparto de carga distribuido y uniforme
Inconvenientes
- Seguridad muy difícil: cualquiera puede levantar un peer malicioso
- No se puede verificar la autoría/veracidad de los datos
- Ausencia total de control y sincronización central
Diagramas C4
C4: Contexto
C4: Contenedor
Tácticas Arquitectónicas — estrategias complementarias para atender RNFs
Tácticas de Rendimiento
PerformanceObjetivo: reducir la latencia de las respuestas. Actúan sobre tres ejes: la demanda de recursos que llega al sistema, cómo se gestionan los recursos disponibles, y cómo se arbitra entre peticiones que compiten.
1. Demanda de recursos — reducir el trabajo que entra
- →Eficiencia computacional: mejorar los algoritmos (O(n) en vez de O(n²)), usar estructuras de datos mejores.
- →Reducir sobrecarga de comunicaciones: agrupar mensajes, comprimir datos, evitar llamadas innecesarias entre componentes.
- →Gestionar la tasa de eventos (tasa de muestreo): limitar cuántos eventos por segundo procesa el sistema; descartar o encolar el exceso.
- →Limitar la respuesta: poner topes a la cantidad de recursos que consume cada petición (timeouts, máx. registros devueltos…).
2. Gestión de recursos — optimizar lo que ya tenemos
- →Concurrencia: procesar peticiones en paralelo usando hilos, procesos o workers. Evita que una petición lenta bloquee al resto.
- →Mantener múltiples copias de datos (cache/replicación): evitar recalcular o refetchar lo mismo repetidamente.
- →Aumentar recursos: añadir más CPU, RAM, nodos. Es la solución más directa pero la menos sostenible sin las otras.
- →Planificador (scheduler): asignar recursos según política: Round-Robin, prioridad, basado en deadlines…
3. Arbitraje de recursos — decidir quién pasa primero
- →FIFO: las peticiones se atienden en orden de llegada. Simple y justo, pero no distingue urgencia.
- →Prioridad fija: cada tipo de petición tiene una prioridad asignada. Las de mayor prioridad siempre se procesan antes.
- →Plazo límite (deadline scheduling): las peticiones con fecha límite más cercana tienen más prioridad.
Tácticas de Disponibilidad
AvailabilityObjetivo: minimizar el tiempo fuera de servicio. Actúan en tres momentos distintos: detectar el fallo antes de que el sistema caiga, recuperarse cuando ya ha caído, y prevenir que ocurra en primer lugar.
1. Detección de errores — saber que algo ha fallado
- →Ping / Echo: un componente envía un ping periódico a otro; si no responde en un tiempo, se marca como caído. Simple y muy común.
- →Heartbeat (latido): el componente vigilado envía señales de vida periódicas. Si deja de enviar, el monitor actúa. Diferencia con Ping: aquí es el propio componente quien avisa.
- →Excepciones del sistema: capturar excepciones no controladas para detectar estados inesperados del sistema antes de que colapsen.
2. Recuperación de errores — volver a funcionar
- →Votación (voting): tres o más componentes hacen el mismo cálculo; el resultado mayoritario es el válido. Si uno discrepa, se descarta. Caro pero muy fiable (usado en aviación, medicina).
- →Redundancia activa (hot standby): el componente de respaldo procesa las mismas peticiones que el principal en paralelo. Si el principal falla, el paso a respaldo es inmediato (0 downtime).
- →Redundancia pasiva (warm/cold standby): el respaldo existe pero solo se activa cuando el principal falla. Hay pequeña ventana de downtime mientras se activa.
- →Repuesto (spare): componente de reserva que se activa manualmente o automáticamente. Similar a pasivo pero la activación puede ser más lenta.
- →Operación en sombra (shadow operation): ejecutar en paralelo el sistema nuevo y el viejo; comparar resultados antes de hacer la transición completa.
3. Prevención de errores — evitar que ocurran
- →Retirada de servicio (service removal): sacar temporalmente del sistema un componente para mantenimiento sin afectar a los demás. Requiere que el sistema siga funcionando sin él.
- →Transacciones: agrupar operaciones en unidades atómicas (todo o nada). Si algo falla a mitad, se hace rollback y el sistema queda en estado consistente.
- →Monitor de procesos: un proceso guardian que supervisa el sistema y lo reinicia automáticamente si detecta que un proceso ha muerto o está bloqueado.
Tácticas de Seguridad
SecurityObjetivo: proteger el sistema de accesos y modificaciones no autorizadas. El enfoque es en tres capas: resistir el ataque, detectarlo mientras ocurre, y recuperar el sistema después.
1. Resistir ataques — hacer difícil el ataque
- →Autenticación de usuarios: verificar que quien dice ser X es realmente X. Contraseñas, tokens, certificados, biometría.
- →Autorización de usuarios: verificar que X tiene permiso para hacer la operación Y. RBAC, ACLs, políticas.
- →Confidencialidad de datos: cifrar los datos en tránsito (TLS) y en reposo (AES). Nadie sin la clave puede leerlos.
- →Integridad de datos: checksums, firmas digitales, hashes. Detectar si los datos han sido modificados en tránsito.
- →Exposición limitada: minimizar la superficie de ataque. Exponer solo los puertos/servicios/endpoints estrictamente necesarios.
- →Limitación de acceso: firewalls, DMZs, redes privadas. Controlar de dónde puede llegar tráfico al sistema.
2. Detección de ataques — saber que te están atacando
- →Detección de intrusos (IDS): monitorizar patrones de acceso anómalos (muchos intentos fallidos, accesos en horarios inusuales, peticiones a recursos no existentes). Genera alertas.
3. Recuperación de ataques — volver al estado seguro
- →Restauración de estado: backups, snapshots, puntos de restauración. Permiten volver a un estado previo al ataque cuando se detecta que el sistema ha sido comprometido.
- →Identificación de atacantes: logs de auditoría detallados, trazabilidad completa. No previene el ataque, pero permite analizar qué pasó y perseguir responsabilidades.
Tabla comparativa
| Estilo | Punto único fallo | Escalabilidad | Rendimiento | Seguridad | Disponibilidad |
|---|---|---|---|---|---|
| Capas | No | Baja | Limitado | Media | Media |
| Pipe & Filter | No | Media | Alta (paralelo) | Media | Media |
| Repositorio | Sí (repositorio) | Media | Media | Media | Baja si cae |
| C/S Distribuida | Sí (directorio) | Alta | Alta | Media | Alta |
| Líder / Trabajador | Sí (líder) | Muy alta | Muy alta | Media | Alta |
| P2P | No | Muy alta | Variable | Muy baja | Muy alta |
Guía para el examen
— Si el enunciado menciona seguridad, autoría, control de quién publica: elige Repositorio.
— Si el enunciado prioriza disponibilidad, millones de usuarios, sin datos sensibles: elige P2P.
— P2P + necesidad de seguridad = menciona tácticas de seguridad como compensación.
— Si la petición necesita respuesta directa al mismo cliente: Capas.
— Si el procesamiento es en etapas y la salida va a otro lugar: Pipe & Filter.
— C/S: cuando los servicios son heterogéneos (cada uno hace cosas distintas).
— L/T: cuando las tareas son homogéneas y paralelizables y la carga varía mucho.
(a) Ventajas e inconvenientes de la opción elegida, argumentando cómo responde a los RNF del enunciado.
(b) Tácticas complementarias: qué tácticas de disponibilidad / rendimiento / seguridad aplicarías y cómo. Siempre nombrar la táctica y explicar cómo se aplica al sistema concreto del enunciado.
(c) Dibujar los 3 primeros niveles C4: Contexto → Contenedor → Componentes.
— Disponibilidad: Ping/Echo o Heartbeat para detectar fallos + Redundancia activa/pasiva para recuperarse + Monitor de procesos.
— Rendimiento: Concurrencia + Cache (múltiples copias de datos) + Limitar tasa de eventos.
— Seguridad: Autenticación + Autorización + Confidencialidad (cifrado) + IDS para detección.
— "El sistema debe estar disponible 24/7" → Redundancia activa + Heartbeat + Monitor de procesos.
— "Miles de usuarios concurrentes" → Concurrencia + Cache + Aumentar recursos + Limitar tasa.
— "Datos sensibles / privacidad" → Autenticación + Autorización + Confidencialidad + Exposición limitada.
— "Si un nodo falla, el sistema sigue" → Redundancia pasiva / Repuesto + Ping/Echo.
— "Auditoría / trazabilidad" → Identificación de atacantes (logs) + Integridad de datos.