Patrones de Arquitectura de Software: Tipos, Ventajas y Desventajas

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 21,05 KB

Requerimientos No Funcionales (RNF)

RNF:

  • Performance: Eficiencia con la que el sistema realiza sus tareas. Se mide en throughput y tiempo de respuesta.
  • Escalabilidad: Capacidad del sistema para adecuarse de forma dinámica a la carga. Esto puede ser respecto a concurrencia de conexiones, volumen de datos, escalabilidad horizontal y vertical.
  • Mantenibilidad: Facilidad para modificar una pieza o función del sistema.
  • Seguridad: Capacidad del sistema para resistir ataques. Esto puede ser respecto a usuarios o datos.
  • Confiabilidad: Confianza en que el sistema está operable. Regla de 5-9s.
  • Integrabilidad: Capacidad del sistema para agregar componentes externos. Interoperable.
  • Portabilidad: Capacidad del sistema para ejecutarse en más de un entorno.
  • Verificabilidad: Capacidad del sistema de auto chequearse.
  • Soportabilidad: Diagnóstico y corrección de incidencias.

Patrones de Arquitectura

Un patrón es una herramienta, no una solución.

Objetivos del Patrón

  • Proporcionar directrices para implementar una arquitectura específica.
  • Ofrecer una solución de diseño para un problema.

Características

  • Tiene un esquema genérico.
  • Ha sido probado y validado anteriormente.
  • Es recurrente (se puede aplicar en múltiples situaciones).

Descripción de un Patrón

  1. Nombre del patrón.
  2. Contexto: La situación que origina el problema. No todos los patrones son adecuados para todos los contextos. Es necesario describir el entorno de trabajo de manera genérica y detallada. Es difícil proporcionar todo el contexto, por lo que la solución varía según la especificidad del contexto.
  3. Requerimiento o problema: Describe de forma general el problema a resolver, incluyendo:
    • Fuerzas presentes en el contexto: propiedades del problema, los requisitos necesarios para la solución y las restricciones operativas que limitan la solución.
    • Descripción genérica de la necesidad.
    • Definición de lo que se debe resolver.
  4. Solución:
    • Esquema de la solución para la necesidad.
    • Balance de fuerzas.
    • Definir la estructura de los componentes y sus relaciones.
    • Definir el comportamiento de los componentes y cómo se relacionan.
    • Priorizar las fuerzas en juego para equilibrar las diversas opciones y determinar la mejor solución.

Clasificación de Patrones

Patrones Simples

Capas o Layers

Estructura aplicaciones descomponiéndolas en tareas con diferentes niveles de abstracción.

  • Contexto: Sistemas estructurados con diferentes niveles de acción (jerarquía de distintos niveles con acciones).
  • Requerimiento: Una organización inadecuada genera problemas de escalabilidad y mantenibilidad.
  • Solución: Usar una estructura de múltiples capas. Capa base con el nivel de abstracción más bajo (dividir el sistema en distintos niveles de funcionalidad, donde la capa más baja es el "núcleo"). Avanzar capa por capa utilizando los servicios de la capa anterior. Componentes organizados en módulos relacionados.
  • Características:
    • Cada capa solo se relaciona con la capa inmediatamente anterior (capa K se relaciona con la capa K-1).
    • No hay dependencias adicionales entre capas.
    • Cada capa puede tener distintos componentes.
    • Los componentes pueden interactuar, pero quedan acoplados.
    • Cada capa ofrece una interfaz con sus servicios.
    • El comportamiento puede ser de arriba hacia abajo (top-down) o de abajo hacia arriba (bottom-up).
  • Implementación:
    • Determinar el número de capas según el nivel de abstracción requerido.
    • Asignar responsabilidades a cada capa.
    • Especificar los servicios ofrecidos por cada capa.
    • Definir la estructura de cada capa.
    • Especificar la interfaz de cada capa.
    • Definir el método de comunicación entre capas.
    • Establecer un esquema para el manejo de errores.
  • Ventajas:
    • Componentes estandarizados
    • Cambios solo afectan el nivel local
    • Reutilización de capas y componentes
  • Desventajas:
    • Cambios afectan en cascada
    • Ineficiencia
    • Complejidad en la definición

Tubos y Filtros

Estructura aplicaciones en actividades para procesar flujos de datos en que cada actividad (o transformación) es un filtro que está unido por un tubo a los filtros contiguos.

  • Contexto: Procesamiento de información (flujos de datos).
  • Requerimiento: Descomponer el procesamiento en una serie de actividades (filtros) que transforman datos de entrada (recibidos desde un tubo) en datos de salida (entregados en un tubo). Las transformaciones son independientes y no tienen estado. Cada actividad es un filtro. Los filtros se comunican entre sí mediante tubos.
  • Solución:
    • Los tubos conectan filtros, con el fin de comunicar.
    • Los filtros provocan cambios en el input/output con el fin de trabajar con información de forma más cómoda.
    • Tubos:
      • Conecta origen de datos con un filtro.
      • Conecta filtro con filtro.
      • Conecta filtro con salida de datos.
      • Esquema de procesamiento FIFO.
    • Filtro:
      • Aplica procesos de transformación de datos de entrada en datos de salida.
      • Implementa un flujo que solicita datos (al filtro anterior).
      • Implementa un flujo que entrega datos (al filtro siguiente).
      • Filtros independientes.
      • Estado no compartido.
      • Desconocimiento de otros filtros.
      • Filtros activos o pasivos.
  • Implementación:
    • Dividir el sistema en una secuencia de procesos ordenados e independientes.
    • Definir el formato de los datos transmitidos por los tubos (rendimiento o flexibilidad).
    • Especificar el procesamiento de cada filtro.
    • Construir los filtros.
    • Definir el esquema para el manejo de errores.
  • Ventajas:
    • Arquitectura flexible.
    • No requiere de archivos intermedios.
    • Filtros reutilizables.
    • Procesamiento paralelo (eficiencia).
    • Generar nuevas instancias de filtros manteniendo la misma cantidad de tubos.
    • Construcción independiente (Cada tubo o filtro puede funcionar de forma independiente).
  • Desventajas:
    • Información no compartida.
    • Conversión de datos (ineficiencia).
    • Errores pueden afectar el flujo de procesamiento.

Pizarrón

Resuelve problemas complejos que pueden ser descompuestos en partes más pequeñas y manejables, las partes trabajan independientemente pero comparten y colaboran a través de un repositorio común (pizarrón).

  • Útil cuando:
    • No hay solución completa y específica al problema.
    • Varios sistemas aportan conocimiento.
  • Problema:
    • Abarca muchas especialidades/disciplinas.
    • Conocimiento parcial de la solución.
  • Solución:
    • Sistemas independientes contribuyen al problema en su área.
    • Trabajo colaborativo y coordinado.
    • Datos compartidos.
    • Control centralizado coordina la ejecución de los sistemas.
    • Sistemas leen y escriben en el pizarrón.
    • Se determina si la solución es aceptable o insoluble.
  • Ventajas:
    • Flexibilidad para incorporar nuevas perspectivas.
    • Fácil contribución.
    • "Divide y conquista".
    • Integra soluciones parciales para tener una solución más completa.
  • Desventajas:
    • Coordinación compleja entre múltiples sistemas.
    • Soluciones parciales en conjunto pueden no funcionar.
    • Exige ancho de banda y recursos computacionales.

Patrones para Sistemas Interactivos

MVC (Modelo Vista Controlador)

Separa una aplicación en tres componentes principales: Modelo, Vista y Controlador. Es útil para aplicaciones con UI complejas y flexibles.

  • Definición de las partes:
    • Modelo: datos y funcionalidad esencial.
    • Vista: Comunicación con el usuario.
    • Controlador: Controla los cambios al modelo.
    • UI: Vista + Controlador.
    • Lógica de negocio: Controlador + Modelo.
  • Requerimientos:
    • Interfaz con diferente representación.
    • Paradigmas de ingresos diversos.
    • Interfaz cambiante.
    • Facilidad para modificar la interfaz.
    • Funcionalidad nueva implica modificar la interfaz.
    • Información se presenta en multi-formato.
  • Solución: Separar responsabilidades en 3 componentes:
    1. Comunicación (Vista):
      • Envía requerimientos del usuario.
      • Recibe datos y los envía al usuario.
    2. Administración (Controlador):
      • Define el comportamiento del sistema.
      • Recibe eventos desde la UI y solicita servicios (Coordina Vista y Modelo).
    3. Procesamiento (Modelo):
      • Provee la funcionalidad requerida por las vistas.
      • Encapsula el manejo de datos.
  • Implementación:
    • Separar la funcionalidad de la interacción del usuario.
    • Diseñar e implementar: Modelo, Vista, Controlador y la relación entre Vista y Controlador.
  • Ventajas:
    • El modelo soporta múltiples vistas.
    • Flexible, mantenible, adaptable:
      • Facilita cambios y adaptaciones en la interfaz sin afectar la lógica del negocio.
    • Frameworks implementan MVC.
  • Desventajas:
    • Modelo, Vista y Controlador están intrínsecamente relacionados; uno no funciona bien sin los otros.
    • Vista sin acceso a los datos genera dependencia del Controlador.
    • La separación de responsabilidades aumenta la complejidad del sistema.

PAC (Presentación Abstracción y Control)

Se utiliza para separar una aplicación en diferentes componentes, similar a MVC. PAC introduce "agentes" para mayor modularidad y desacoplamiento. Útil para sistemas grandes y complejos, donde la modularidad y el desacoplamiento son cruciales.

  • Componentes: Presentación (Interfaz), Abstracción (funcionalidad) y Control (comunicación con agentes).
  • Contexto: Sistemas interactivos desarrollados utilizando agentes. Sistemas interactivos que requieren una separación clara de funcionalidades. Útil en sistemas donde la colaboración entre agentes es crucial.
  • Requerimiento:
    • Estructurar un sistema interactivo mediante agentes funcionando de forma integrada.
    • Generar interfaces flexibles de usuario.
    • Separar la presentación de la funcionalidad.
    • Bajo acoplamiento.
    • Agentes con interfaces propias de comunicación.
    • Agentes con estado y datos privados.
    • Trabajo cooperativo de los agentes.
  • Solución:
    • Definir una estructura jerárquica de tres niveles de agentes:
      • Alto nivel: funcionalidad central del sistema, interfaz global de usuario.
      • Bajo nivel: manejo de la interfaz específica de usuarios.
      • Intermedio: relaciona agentes de bajo nivel.
    • Cada agente es responsable de una parte de la funcionalidad del sistema.
    • Un agente está compuesto por:
      • Presentación: aspecto visible del agente (Definir la interfaz que expone un agente a los otros agentes para la utilización de sus servicios. No es exclusivamente la interfaz de usuario.)
      • Abstracción: modelo de datos interno y operaciones sobre ellos.
      • Control: conexión entre presentación y abstracción, comunicación con otros agentes (Coordina la comunicación entre la presentación y la abstracción, así como con otros agentes.)
  • Implementación:
    • Definir la funcionalidad central del sistema.
    • Estructurar la jerarquía de agentes.
    • Definir e implementar cada agente:
      • Funcionalidad.
      • Interfaz.
      • Modelo de datos.
      • Mecanismo de control.
  • Ventajas:
    • Asigna responsabilidades específicas (Cada agente tiene una funcionalidad y responsabilidad específica, lo que simplifica la comprensión del sistema.)
    • Funcionamiento independiente (Cada agente funciona de manera autónoma, lo que facilita la mantenibilidad y la incorporación de nuevos agentes.)
    • Soporta multitarea.
  • Desventajas:
    • Sistema complejo (La estructura jerárquica y la coordinación entre agentes pueden complicar el sistema.)
    • Baja eficiencia (Puede ser menos eficiente que un sistema monolítico debido a la necesidad de coordinación y comunicación entre agentes.)
    • Complejo mecanismo de control.

Patrones para Sistemas Adaptables

MicroKernel

Se utiliza para diseñar sistemas operativos y otros sistemas de software donde se busca un alto grado de modularidad, flexibilidad y robustez. Divide el sistema en un núcleo mínimo (microkernel) que proporciona los servicios más básicos y esenciales, y otros componentes o servidores que se ejecutan en el espacio de usuario y manejan las funcionalidades restantes del sistema. Microkernel: núcleo que realiza funciones básicas y plugins que hacen que el núcleo se adapte a distintos entornos. Estructura mínima: núcleo. Extendida: plugins. Si se quiere que el sistema pueda añadir cosas como escuchar música, se hacen con plugins.

  • Sistemas que deben adaptarse a cambios en los requerimientos.
  • Requisitos cambiantes.
  • Separa la funcionalidad en:
    • Mínima: Común a todos los clientes (no es mínimo, es lo común, lo que es para todo el mundo).
    • Extendida: específica de un cliente.
  • Usa plugins para conectarse e incorporar funcionalidades, etc.
  • Contexto:
    • Este patrón adaptable sirve para:
      • Sistemas con interfaces de programación parecidas.
      • Basados en el mismo núcleo funcional.
      • Linux, por ejemplo, su núcleo, su parte central se diseñó con esta arquitectura en mente. Si quiero que haga algo, se le agrega.
      • VSCode como “sistema core” y plugins como módulos.
  • Problema:
    • Sistemas que perduran con el tiempo (legacy → legado, sistemas que han perdurado mucho tiempo, ej. Linux).
    • Deben adaptarse a cambios en la infraestructura (hardware/software).
    • Debe ser:
      • Extensible a nuevas tecnologías.
      • Portable: debo hacer un plugin hacia el contexto que debe ser portable.
      • Adaptable: que se vaya adaptando a los tiempos.
  • Solución:
    • Microkernel: componente central (núcleo) → todo lo independiente a la plataforma donde va a correr.
      • Funcionalidad básica.
      • Administración de recursos.
      • Servicio de comunicación entre componentes.
    • Servidores internos: servicios específicos de la plataforma.
      • Conversan con la plataforma, los plugins.
    • Servidores externos: Interfaz de acceso al núcleo.
      • Los que nos permiten acceder al núcleo.
    • Adaptadores: Mecanismo de comunicación cliente con servidor externo.
    • Clientes:
      • Tiene un adaptador que permite que los clientes…
      • Cliente es un proceso que va a recibir requerimientos de los usuarios.
  • Ventajas:
    • Adaptabilidad.
    • Portabilidad, si es diseñado de forma independiente del hardware.
    • Flexibilidad para responder a distintas necesidades, mediante la inclusión de servidores específicos.
    • Escalabilidad horizontal, confiabilidad.
  • Desventajas:
    • Sistema complejo.
    • Baja eficiencia.
    • Compleja implementación.
    • Punto único de falla: Microkernel, pero depende de cómo esté definido puede que haya solo en una parte.

Reflection

Técnica utilizada en programación que permite a un programa inspeccionarse y modificarse a sí mismo mientras se está ejecutando. Separa la aplicación en dos niveles:

  1. Nivel Base: Maneja la funcionalidad principal del sistema.
  2. Nivel Meta: Gestiona información sobre el nivel base y proporciona herramientas para modificarlo.
  • Características:
    • La adaptación se hace en tiempo real, es decir, mientras el sistema está en funcionamiento.
    • Esto permite que el sistema se adapte, cambie y evolucione sin necesidad de detenerse o reiniciarse.
  • Aplicaciones comunes:
    • Frameworks: Conjuntos de herramientas y bibliotecas que ayudan a desarrollar aplicaciones.
    • IDE's (Entornos de Desarrollo Integrado): Herramientas que los desarrolladores utilizan para escribir código.
    • Middleware: Software que conecta diferentes componentes o aplicaciones para que funcionen juntas.
  • Problemas que soluciona:
    • Necesidad de adaptar el comportamiento de un sistema durante su ejecución para responder a cambios en su entorno.
    • Flexibilidad para hacer modificaciones sin una reingeniería completa del sistema.
  • Ventajas:
    • Adaptabilidad: Permite que el sistema cambie su comportamiento basado en lo que sucede a su alrededor.
    • Flexibilidad: Puede hacer y deshacer cambios sin detenerse.
    • Extensibilidad: Facilita la adición de nuevas funcionalidades mientras el sistema está funcionando.
  • Desventajas:
    • Complejidad en el Diseño: Crear un sistema que pueda auto-modificarse es complicado.
    • Complejidad en la Implementación: Puede ser más costoso y difícil de implementar y mantener.
    • Seguridad: Si no se maneja bien, puede ser un riesgo de seguridad, ya que usuarios malintencionados podrían hacer cambios no deseados.

Patrones para Sistemas Distribuidos

Microservicios

Son una forma de diseñar sistemas distribuidos donde cada componente del sistema (microservicio) es independiente y realiza una función específica.

  • Características:
    • Autónomos: Cada microservicio funciona por sí mismo.
    • Independientes: Pueden ser instalados y ejecutados en diferentes plataformas sin depender unos de otros.
    • Manejo de Datos: Cada microservicio gestiona sus propios datos.
    • Interfaz API: Se comunican entre ellos y con otros sistemas a través de interfaces de programación de aplicaciones (APIs) usando protocolos como HTTP o REST.
  • Implementación:
    1. Dividir el Sistema: Separar el sistema en módulos y submódulos.
    2. Elegir Tecnología: Decidir qué tecnología usar en cada microservicio.
    3. Definir Datos: Establecer qué datos necesita cada microservicio.
    4. Definir Interfaz: Crear una interfaz para que los microservicios se comuniquen entre sí y con el resto del sistema.
    5. Interacción: Definir cómo interactuarán los microservicios entre ellos.
    6. Protocolo de Comunicación: Elegir el protocolo de comunicación adecuado.
    7. Tracing: Implementar un mecanismo para seguir las transacciones.
    8. Manejo de Errores: Establecer un esquema para manejar los errores.
  • Ventajas:
    • Desarrollo Independiente: Cada microservicio puede ser desarrollado de forma independiente.
    • Flexibilidad: Permite usar diferentes tecnologías para diferentes microservicios.
    • Nuevas Funcionalidades: Facilita la adición de nuevas funcionalidades sin afectar todo el sistema.
    • Escalabilidad: Cada microservicio puede escalarse de forma individual.
  • Desventajas:
    • Integración Compleja: La integración de todos los microservicios puede ser complicada.
    • Gestión Compleja: Administrar un sistema compuesto de muchos microservicios puede ser difícil.
    • Uso de Red: Puede haber un alto uso de la red debido a la comunicación entre microservicios.
    • Consistencia de Datos: Manejar la consistencia de datos entre microservicios es un desafío.

Entradas relacionadas: