Software-Architecture-Patterns en Es
Software-Architecture-Patterns en Es
Recursos
4 formas fáciles de aprender más y mantenerse actualizado
Boletín de programación
Reciba semanalmente noticias y contenido relacionado con la programación en su bandeja de entrada.
oreilly.com/programming/newsletter
Serie FreeWebcast
Obtenga información sobre temas de programación populares de parte de expertos en vivo, en línea.
webcasts.oreilly.com
Radar O'Reilly
Lea más información y análisis sobre tecnologías emergentes.
radar.oreilly.com
Conferencias
Sumérjase en el aprendizaje en una próxima conferencia de O'Reilly.
conferencias.oreilly.com
© 2015 O'Reilly Media, Inc. El logotipo de O'Reilly es una marca comercial registrada de O'Reilly Media, Inc. # 15305
Arquitectura de software
Patrones
Comprensión de la arquitectura común
Patrones y cuándo usarlos
Mark Richards
Patrones de arquitectura de software
por Mark Richards
Copyright © 2015 O'Reilly Media, Inc. Todos los derechos reservados. Impreso en
Publicado por O'Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA
95472.
Los libros de O'Reilly se pueden comprar con fines educativos, comerciales o promocionales de ventas. Las ediciones en línea
también están disponibles para la mayoría de los títulos ( http://safaribooksonline.com ). Para obtener más información,
El logotipo de O'Reilly es una marca registrada de O'Reilly Media, Inc. Patrones de arquitectura de software, la imagen de
portada y la imagen comercial relacionada son marcas comerciales de O'Reilly Media, Inc.
Si bien el editor y el autor han realizado esfuerzos de buena fe para garantizar que la información y las
instrucciones contenidas en este trabajo sean precisas, el editor y el autor renuncian a toda responsabilidad
por errores u omisiones, incluida, sin limitación, la responsabilidad por daños resultantes del uso. de o
confianza en este trabajo. El uso de la información y las instrucciones contenidas en este trabajo es bajo su
propio riesgo. Si alguna muestra de código u otra tecnología que este trabajo contiene o describe está sujeta a
licencias de código abierto o derechos de propiedad intelectual de otros, es su responsabilidad asegurarse de
que su uso cumpla con dichas licencias y / o derechos.
978-1-491-92424-2
[LSI]
Tabla de contenido
Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v
1. Arquitectura en capas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Descripción del patrón 1
Conceptos clave 3
Ejemplo de patrón 5
Consideraciones 7
Análisis de patrones 8
3. Arquitectura de microkernel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Descripción del patrón 21
Ejemplos de patrones 23
Consideraciones 24
Análisis de patrones 25
iii
5. Arquitectura basada en el espacio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Descripción del patrón 38
Dinámica de patrones 39
Consideraciones 42
Análisis de patrones 43
iv | Tabla de contenido
Introducción
Es muy común que los desarrolladores comiencen a codificar una aplicación sin una
arquitectura formal establecida. Sin una arquitectura clara y bien definida, la mayoría de los
desarrolladores y arquitectos recurrirán al patrón de arquitectura en capas tradicional
estándar de facto (también llamado arquitectura de n niveles), creando capas implícitas al
separar los módulos de código fuente en paquetes. Desafortunadamente, lo que a menudo
resulta de esta práctica es una colección de módulos de código fuente desorganizados que
carecen de roles, responsabilidades y relaciones claras entre sí. Esto se conoce
comúnmente como el gran bola de barro
arquitectura anti-patrón.
Las aplicaciones que carecen de una arquitectura formal suelen estar estrechamente
acopladas, frágiles, difíciles de cambiar y sin una visión o una dirección claras. Como
resultado, es muy difícil determinar las características arquitectónicas de la aplicación sin
comprender completamente el funcionamiento interno de cada componente y módulo del
sistema. Las preguntas básicas sobre implementación y mantenimiento son difíciles de
responder: ¿Se escala la arquitectura? ¿Cuáles son las características de rendimiento de
la aplicación? ¿Con qué facilidad responde la aplicación al cambio? ¿Cuáles son las
características de implementación de la aplicación? ¿Qué tan receptiva es la arquitectura?
v
sary para elegir el que se adapte a sus necesidades y objetivos comerciales específicos.
vi | Introducción
CAPÍTULO 1
Arquitectura en capas
El patrón de arquitectura más común es el patrón de arquitectura en capas, también conocido como
patrón de arquitectura de n niveles. Este patrón es el estándar de facto para la mayoría de las
empresas, por lo que es una opción natural para la mayoría de los esfuerzos de desarrollo de
aplicaciones empresariales.
Cada capa del patrón de arquitectura en capas tiene un rol y una responsabilidad
específicos dentro de la aplicación. Por ejemplo, una capa de presentación sería
responsable de manejar toda la interfaz de usuario y
1
lógica de comunicación del navegador, mientras que una capa empresarial sería
responsable de ejecutar reglas empresariales específicas asociadas con la solicitud. Cada
capa de la arquitectura forma una abstracción en torno al trabajo que debe realizarse para
satisfacer una solicitud comercial en particular. Por ejemplo, la capa de presentación no
necesita saber ni preocuparse por cómo para obtener datos del cliente; solo necesita
mostrar esa información en una pantalla en un formato particular. De manera similar, la
capa empresarial no necesita preocuparse por cómo formatear los datos del cliente para
mostrarlos en una pantalla o incluso de dónde provienen los datos del cliente; solo necesita
obtener los datos de la capa de persistencia, realizar la lógica empresarial contra los datos
(por ejemplo, calcular valores o agregar datos) y pasar esa información a la capa de
presentación.
Entonces, ¿por qué no permitir que la capa de presentación acceda directamente a la capa de persistencia
o la capa de base de datos? Después de todo, el acceso directo a la base de datos desde la capa de
presentación es mucho más rápido que atravesar un montón de capas innecesarias solo para recuperar o
guardar información de la base de datos. La respuesta a esta pregunta radica en un concepto clave
El concepto de capas de aislamiento significa que los cambios realizados en una capa de la
arquitectura generalmente no afectan ni afectan a los componentes de otras capas: el cambio
se aísla a los componentes dentro de esa capa y posiblemente a otra capa asociada (como
una capa de persistencia que contenga SQL). Si permite que la capa de presentación acceda
directamente a la capa de persistencia, los cambios realizados en SQL dentro del
Conceptos clave | 3
La capa de persistencia afectaría tanto a la capa empresarial como a la capa de
presentación, produciendo así una aplicación muy estrechamente acoplada con muchas
interdependencias entre los componentes. Este tipo de arquitectura se vuelve muy difícil y
costoso de cambiar.
El concepto de capas de aislamiento también significa que cada capa es independiente de las
otras capas, por lo que tiene poco o ningún conocimiento del funcionamiento interno de otras
capas en la arquitectura. Para comprender el poder y la importancia de este concepto,
considere un gran esfuerzo de refactorización para convertir el marco de presentación de JSP
(Java Server Pages) a JSF (Java Server Faces). Suponiendo que los contratos (p. Ej., Modelo)
utilizados entre la capa de presentación y la capa empresarial siguen siendo los mismos, la
capa empresarial no se ve afectada por la refabricación y permanece completamente
independiente del tipo de marco de interfaz de usuario utilizado por la capa de presentación .
Si bien las capas cerradas facilitan las capas de aislamiento y, por lo tanto, ayudan a aislar el
cambio dentro de la arquitectura, hay ocasiones en las que tiene sentido que ciertas capas estén
abiertas. Por ejemplo, suponga que desea agregar una capa de servicios compartidos a una
arquitectura que contiene componentes de servicios comunes a los que acceden los
componentes dentro de la capa empresarial (por ejemplo, clases de servicios de datos y cadenas
o clases de auditoría y registro). Crear una capa de servicios suele ser una buena idea en este
caso porque arquitectónicamente restringe el acceso a los servicios compartidos a la capa
empresarial (y no a la capa de presentación). Sin una capa separada, no hay nada
arquitectónicamente que restrinja el acceso de la capa de presentación a estos servicios
comunes, lo que dificulta el control de esta restricción de acceso.
En este ejemplo, la nueva capa de servicios probablemente residiría abajo la capa empresarial
para indicar que los componentes de esta capa de servicios no son accesibles desde la capa
de presentación. Sin embargo, esto presenta un problema, ya que ahora se requiere que la
capa empresarial pase por la capa de servicios para llegar a la capa de persistencia, lo que no
tiene ningún sentido. Este es un viejo problema con la arquitectura en capas y se resuelve
creando capas abiertas dentro de la arquitectura.
Como se ilustra en Figura 1-3 , la capa de servicios en este caso está marcada como abierta, lo
que significa que las solicitudes pueden omitir esta capa abierta e ir directamente a la capa
debajo de ella. En el siguiente ejemplo, dado que la capa de servicios está abierta, la capa
empresarial ahora puede omitirla e ir directamente a la capa de persistencia, lo que tiene mucho
sentido.
Aprovechar el concepto de capas abiertas y cerradas ayuda a definir la relación entre las capas
de la arquitectura y los flujos de solicitud y también proporciona a los diseñadores y
desarrolladores la información necesaria para comprender las diversas restricciones de acceso a
las capas dentro de la arquitectura. No documentar o comunicar correctamente qué capas de la
arquitectura están abiertas y cerradas (y por qué) generalmente da como resultado arquitecturas
frágiles y estrechamente acopladas que son muy difíciles de probar, mantener e implementar.
Ejemplo de patrón
Para ilustrar cómo funciona la arquitectura en capas, considere una solicitud de un usuario
empresarial para recuperar la información del cliente de un individuo en particular, como se
ilustra en Figura 1-4 . Las flechas negras muestran la solicitud fluyendo hacia la base de
datos para recuperar los datos del cliente, y las flechas rojas muestran la respuesta fluyendo
de regreso a la pantalla para mostrar los datos. En este ejemplo, la información del cliente
consta de datos del cliente y datos del pedido (pedidos realizados por el cliente).
Ejemplo de patrón | 5
los pantalla del cliente es responsable de aceptar la solicitud y mostrar la información
del cliente. No sabe dónde están los datos, cómo se recuperan o cuántas tablas de la
base de datos deben ser consultas para obtener los datos. Una vez que la pantalla del
cliente recibe una solicitud para obtener información del cliente para un individuo en
particular, reenvía esa solicitud al delegado del cliente módulo. Este módulo es
responsable de saber qué módulos de la capa empresarial pueden procesar esa
solicitud y también cómo llegar a ese módulo y qué datos necesita (el contrato). los objeto
del cliente en la capa empresarial es responsable de agregar toda la información
necesaria para la solicitud empresarial (en este caso, para obtener información del
cliente). Este módulo llama a la dao del cliente objeto de acceso a datos) en la capa de
persistencia para obtener datos del cliente, y también el orden dao
módulo para obtener información sobre el pedido. Estos módulos, a su vez, ejecutan
declaraciones SQL para recuperar los datos correspondientes y devolverlos al objeto del
cliente en la capa empresarial. Una vez que el objeto del cliente recibe los datos, agrega
los datos y pasa esa información de vuelta al delegado del cliente, que luego pasa esos
datos a la pantalla del cliente para ser presentados al usuario.
Desde una perspectiva tecnológica, hay literalmente decenas de formas en que estos módulos
se pueden implementar. Por ejemplo, en la plataforma Java, la pantalla del cliente puede ser
una pantalla (JSF) Java Server Faces
Consideraciones
El patrón de arquitectura en capas es un patrón sólido de uso general, lo que lo convierte en un
buen punto de partida para la mayoría de las aplicaciones, especialmente cuando no está
seguro de qué patrón de arquitectura es el más adecuado para su aplicación. Sin embargo, hay
un par de cosas a considerar desde el punto de vista de la arquitectura al elegir este patrón.
Lo primero que hay que tener en cuenta es lo que se conoce como arquitectura anti-patrón
de sumidero. Este anti-patrón describe la situación en la que las solicitudes fluyen a través
de múltiples capas de la arquitectura como un simple procesamiento de paso con poca o
ninguna lógica realizada dentro de cada capa. Por ejemplo, suponga que la capa de
presentación responde a una solicitud del usuario para recuperar datos del cliente. La capa
de presentación pasa la solicitud a la capa empresarial, que simplemente pasa la solicitud a
la capa de persistencia, que luego realiza una simple llamada SQL a la capa de base de
datos para recuperar los datos del cliente. Luego, los datos se devuelven a la pila sin ningún
procesamiento o lógica adicional para agregar, calcular o transformar los datos.
Cada arquitectura en capas tendrá al menos algunos escenarios que caen en el anti-patrón
de sumidero de arquitectura. Sin embargo, la clave es analizar el porcentaje de solicitudes
que entran en esta categoría. La regla 80-20 suele ser una buena práctica a seguir para
determinar si está experimentando o no el antipatrón de sumidero de arquitectura. Es típico
tener alrededor del 20 por ciento de las solicitudes como procesamiento simple de paso y el
80 por ciento de las solicitudes con alguna lógica de negocios asociada con la solicitud. Sin
embargo, si encuentra que esta proporción se invierte y la mayoría de sus solicitudes son
un simple procesamiento de transferencia, es posible que desee considerar hacer algunas
de las
Consideraciones | 7
Las capas de arquitectura se abren, teniendo en cuenta que será más difícil controlar el cambio
debido a la falta de aislamiento de capas.
Análisis de patrones
La siguiente tabla contiene una calificación y un análisis de las características de
arquitectura comunes para el patrón de arquitectura en capas. La calificación de cada
característica se basa en la tendencia natural de esa característica como una capacidad
basada en una implementación típica del patrón, así como en lo que generalmente se
conoce al patrón. Para obtener una comparación en paralelo de cómo se relaciona este
patrón con otros patrones de este informe, consulte Apéndice A al final de este informe.
Agilidad general
Clasificación: Bajo
Facilidad de implementación
Clasificación: Bajo
Clasificación: Alto
Análisis: Debido a que los componentes pertenecen a capas específicas en la arquitectura, otras
capas se pueden simular o eliminar, por lo que este patrón es relativamente fácil de probar. Un
desarrollador puede simular un componente de presentación o una pantalla para aislar las
pruebas dentro de un componente empresarial, así como simular la capa empresarial para
Actuación
Clasificación: Bajo
Análisis: Si bien es cierto que algunas arquitecturas en capas pueden funcionar bien,
el patrón no se presta a aplicaciones de alto rendimiento debido a las ineficiencias
de tener que pasar por múltiples capas de la arquitectura para cumplir con una
solicitud comercial.
Escalabilidad
Clasificación: Bajo
Facilidad de desarrollo
Clasificación: Alto
Análisis de patrones | 9
CAPITULO 2
11
mía el orden de los pasos y cuáles se pueden hacer en serie y en paralelo.
Es común tener entre una docena y varios cientos de colas de eventos en una arquitectura
impulsada por eventos. El patrón no especifica la implementación del componente de cola
de eventos; puede ser una cola de mensajes, un punto final de servicio web o cualquier
combinación de los mismos.
Hay dos tipos de eventos dentro de este patrón: un evento inicial y un evento de
procesamiento. El evento inicial es el evento original recibido por
Los canales de eventos son utilizados por el mediador de eventos para pasar de forma asincrónica eventos
de procesamiento específicos relacionados con cada paso en el evento inicial a los procesadores de
eventos. Los canales de eventos pueden ser colas de mensajes o temas de mensajes, aunque los temas de
mensajes se utilizan más ampliamente con la topología de mediador, de modo que los eventos de
procesamiento pueden ser procesados por múltiples procesadores de eventos (cada uno de ellos
Los componentes del procesador de eventos contienen la lógica empresarial de la aplicación necesaria
para procesar el evento de procesamiento. Los procesadores de eventos son componentes de
arquitectura autónomos, independientes y altamente desacoplados que realizan una tarea específica
en la aplicación o el sistema. Si bien la granularidad del componente del procesador de eventos puede
variar de detallada (por ejemplo, calcular el impuesto sobre las ventas en un pedido) a granularidad
(por ejemplo, procesar una reclamación de seguro), es importante tener en cuenta que, en general,
cada El componente procesador de eventos debe realizar una sola tarea comercial y no depender de
otros procesadores de eventos para completar su tarea específica.
Para ilustrar cómo funciona la topología del mediador, suponga que está asegurado a través de una
compañía de seguros y decide mudarse. En este caso, el evento inicial podría llamarse algo como evento
de reubicación. Los pasos involucrados en el procesamiento de un evento de reubicación están
contenidos dentro del mediador de eventos como se muestra en Figura 2-2 . Para cada paso del
evento inicial, el mediador del evento crea un evento de procesamiento (por ejemplo,
cambiar dirección, recalcar cotización, etc.), envía ese evento de procesamiento al canal de eventos y
espera a que el evento de procesamiento sea procesado por el procesador de eventos
correspondiente (por ejemplo, proceso del cliente, proceso de cotización, etc.). Este proceso continúa
hasta que se hayan procesado todos los pasos del evento inicial. La barra única sobre los pasos de
cotización recalc y actualización de reclamos en el mediador de eventos indica que estos pasos se
pueden ejecutar al mismo tiempo.
Hay dos tipos principales de componentes de arquitectura dentro de la topología del intermediario:
a corredor componente y un procesador de eventos componente. El componente de intermediario
se puede centralizar o federar y contiene todos los canales de eventos que se utilizan dentro del
flujo de eventos.
Esta topología se ilustra en Figura 2-3 . Como puede ver en el diagrama, no hay un
componente central de evento-mediador que controle y orquesta el evento inicial; más bien,
cada componente del procesador de eventos es responsable de procesar un evento y
publicar un nuevo evento que indica la acción que acaba de realizar. Por ejemplo, un
procesador de eventos que equilibra una cartera de acciones puede recibir un evento inicial
llamado división de acciones. Basado en ese evento inicial, el procesador de eventos puede
hacer un reequilibrio de la cartera y luego publicar un nuevo evento para el corredor llamado reequilibrar
la cartera, que luego sería recogido por un procesador de eventos diferente. Tenga en cuenta
que puede haber ocasiones en las que un procesador de eventos publique un evento, pero
ningún otro procesador de eventos lo recoja. Esto es común cuando está desarrollando una
aplicación o proporcionando funcionalidades y extensiones futuras.
Para ilustrar cómo funciona la topología del corredor, usaremos el mismo ejemplo que en la
topología del mediador (una persona asegurada se muda). Dado que no hay un mediador de
eventos central para recibir el evento inicial en la topología del corredor, el componente de
proceso del cliente recibe el evento directamente, cambia la dirección del cliente y envía un
evento diciendo que cambió la dirección de un cliente (por ejemplo, cambiar dirección evento). En
este ejemplo, hay dos procesadores de eventos que están interesados en el cambiar dirección evento:
el proceso de cotización y el proceso de reclamaciones. El componente del procesador de
cotizaciones vuelve a calcular las nuevas tarifas de seguro de automóvil en función del cambio de
dirección y publica un evento al resto del sistema que indica lo que hizo (por ejemplo, cita recalc
evento). El componente de procesamiento de reclamos, por otro lado, recibe el mismo cambiar
dirección evento, pero en este caso, actualiza una reclamación de seguro pendiente y publica
un evento en el sistema como un actualizar reclamo evento. Estos nuevos eventos son luego
recogidos por otros componentes del procesador de eventos, y la cadena de eventos continúa
a través del sistema hasta que no se publican más eventos para ese evento de inicio en
particular.
Como puedes ver en Figura 2-4 , la topología del corredor se trata del encadenamiento de eventos
para realizar una función comercial. La mejor manera de comprender la topología del corredor es
pensar en ella como una carrera de relevos. En una carrera de relevos, los corredores sostienen un
testigo y corren una cierta distancia, luego entregan el testigo al siguiente corredor y así
sucesivamente hasta que el último corredor cruza la línea de meta. En las carreras de relevos, una
vez que un corredor entrega el testigo, termina la carrera. Esto también es cierto con la topología
del intermediario: una vez que un procesador de eventos entrega el evento, ya no está involucrado
en el procesamiento de ese evento específico.
Consideraciones
El patrón de arquitectura impulsada por eventos es un patrón relativamente complejo de
implementar, principalmente debido a su naturaleza distribuida asincrónica. Al implementar este
patrón, debe abordar varios problemas de arquitectura distribuida, como la disponibilidad de
procesos remotos, la falta de capacidad de respuesta y la lógica de reconexión del intermediario
en caso de falla de un intermediario o mediador.
Consideraciones | 17
Una consideración a tener en cuenta al elegir este patrón de arquitectura es la falta de
transacciones atómicas para un solo proceso empresarial. Debido a que los componentes
del procesador de eventos están altamente desacoplados y distribuidos, es muy difícil
mantener una unidad de trabajo transaccional entre ellos. Por esta razón, al diseñar su
aplicación utilizando este patrón, debe pensar continuamente en qué eventos pueden y no
pueden ejecutarse de forma independiente y planificar la granularidad de sus procesadores
de eventos en consecuencia. Si encuentra que necesita dividir una sola unidad de trabajo
entre procesadores de eventos, es decir, si está usando procesadores separados para algo
que debería ser una transacción no dividida, probablemente este no sea el patrón correcto
para su aplicación.
Quizás uno de los aspectos más difíciles del patrón de arquitectura impulsada por eventos es la
creación, el mantenimiento y la gobernanza de los contratos de los componentes del procesador de
eventos. Cada evento suele tener un contrato específico asociado (por ejemplo, los valores de los
datos y el formato de los datos que se pasan al procesador de eventos). Al utilizar este patrón, es
de vital importancia establecer un formato de datos estándar (por ejemplo, XML, JSON, Java
Object, etc.) y establecer una política de control de versiones del contrato desde el principio.
Análisis de patrones
La siguiente tabla contiene una calificación y análisis de las características de la arquitectura
común para el patrón de arquitectura impulsada por eventos. La calificación de cada
característica se basa en la tendencia natural de esa característica como una capacidad
basada en una implementación típica del patrón, así como en lo que generalmente se
conoce al patrón. Para obtener una comparación en paralelo de cómo se relaciona este
patrón con otros patrones de este informe, consulte Apéndice A al final de este informe.
Agilidad general
Clasificación: Alto
Clasificación: Alto
a ser más fácil de implementar que la topología del mediador, principalmente porque el
cambio en el mediador de eventos, requiriendo ambos para ser implementado para cualquier
cambio dado.
Probabilidad
Clasificación: Bajo
Análisis: Si bien la prueba de unidad individual no es demasiado difícil, requiere algún tipo
de cliente de prueba especializado o herramienta de prueba para generar eventos. Las
pruebas también se complican por la naturaleza asincrónica de este patrón.
Actuación
Clasificación: Alto
Escalabilidad
Clasificación: Alto
Facilidad de desarrollo
Clasificación: Bajo
Análisis de patrones | 19
CAPÍTULO 3
Arquitectura de microkernel
21
definida como la lógica empresarial general sin código personalizado para casos especiales, reglas
El sistema central necesita saber qué módulos enchufables están disponibles y cómo acceder
a ellos. Una forma común de implementar esto es a través de algún tipo de registro de
complementos. Este registro contiene información sobre cada módulo de complemento,
incluidos aspectos como su nombre, contrato de datos y detalles del protocolo de acceso
remoto (dependiendo de cómo esté conectado el complemento al sistema central). Por
ejemplo, un complemento para software fiscal que marca elementos de auditoría fiscal de alto
riesgo puede tener una entrada de registro que contenga el nombre del servicio
(AuditChecker), el contrato de datos (datos de entrada y datos de salida) y el contrato. formato
(XML). También puede contener un WSDL (lenguaje de definición de servicios web) si se
accede al complemento a través de SOAP.
Los módulos enchufables se pueden conectar al sistema central a través de una variedad de
formas, incluyendo OSGi (iniciativa de puerta de enlace de servicio abierto), mensajería, servicios
web o incluso enlace directo punto a punto (es decir, instanciación de objetos). El tipo de conexión
que utiliza depende del tipo de aplicación que está creando (producto pequeño o aplicación de
gran empresa) y sus necesidades específicas (p. Ej., Implementación única o distribución
Los contratos entre los módulos enchufables y el sistema central pueden variar desde contratos
estándar hasta personalizados. Los contratos personalizados se encuentran típicamente en
situaciones en las que los componentes del complemento son desarrollados por un tercero
donde usted no tiene control sobre el contrato utilizado por el complemento. En tales casos, es
común crear un adaptador entre el contacto del complemento y su contrato estándar para que
el sistema central no necesite un código especializado para cada complemento. Al crear
contratos estándar (generalmente implementados a través de XML o un mapa de Java), es
importante recordar crear una estrategia de control de versiones desde el principio.
Ejemplos de patrones
Quizás el mejor ejemplo de la arquitectura de microkernel es el IDE de Eclipse. La descarga del
producto básico de Eclipse le proporciona poco más que un editor elegante. Sin embargo, una
vez que comience a agregar complementos, se convertirá en un producto altamente
personalizable y útil. Los navegadores de Internet son otro ejemplo de producto común que utiliza
la arquitectura de microkernel: los visores y otros complementos agregan capacidades adicionales
que de otro modo no se encuentran en el navegador básico (es decir, el sistema central).
Los ejemplos son infinitos para el software basado en productos, pero ¿qué pasa con las grandes
aplicaciones empresariales? La arquitectura del microkernel también se aplica a estas
situaciones. Para ilustrar este punto, usemos otro ejemplo de compañía de seguros, pero esta
vez uno que involucra el procesamiento de reclamos de seguros.
de reglas grandes y complejos para manejar gran parte de esta complejidad. Sin embargo, estos motores de
reglas pueden convertirse en una gran bola de barro compleja donde el cambio de una regla impacta otras
Ejemplos de patrones | 23
El simple cambio de reglas requiere un ejército de analistas, desarrolladores y evaluadores. El uso del
La pila de carpetas que ves en Figura 3-2 representa el sistema central para el procesamiento de
reclamaciones. Contiene la lógica empresarial básica requerida por la compañía de seguros para
procesar un reclamo, excepto sin ningún procesamiento personalizado. Cada módulo de complemento
contiene las reglas específicas para ese estado. En este ejemplo, los módulos de complemento se
pueden implementar utilizando código fuente personalizado o instancias de motor de reglas separadas.
específicos del estado están separados del sistema de reclamos central y se pueden agregar, eliminar y
cambiar con poco o ningún efecto en el resto del sistema central u otros módulos complementarios. .
Consideraciones
Una gran cosa sobre el patrón de arquitectura de microkernel es que se puede incrustar o
usar como parte de otro patrón de arquitectura. Por ejemplo, si este patrón resuelve un
problema particular que tiene con un área volátil específica de la aplicación, es posible que
no pueda implementar el todo arquitectura usando este patrón. En este caso, puede
incrustar el patrón de arquitectura de microservicios en otro patrón que esté utilizando (por
ejemplo, arquitectura en capas). De manera similar, los componentes del procesador de
eventos descritos en la sección anterior sobre arquitectura dirigida por eventos podrían
implementarse utilizando el patrón de arquitectura de microservicios.
Análisis de patrones
La siguiente tabla contiene una calificación y un análisis de las características de la
arquitectura común para el patrón de arquitectura del microkernel. La calificación de cada
característica se basa en la tendencia natural de esa característica como una capacidad
basada en una implementación típica del patrón, así como en lo que generalmente se
conoce al patrón. Para obtener una comparación en paralelo de cómo se relaciona este
patrón con otros patrones de este informe, consulte Apéndice A al final de este informe.
Agilidad general
Clasificación: Alto
Facilidad de implementación
Clasificación: Alto
Análisis de patrones | 25
Probabilidad
Clasificación: Alto
Análisis: Los módulos enchufables se pueden probar de forma aislada y el sistema central puede
burlarse fácilmente de ellos para demostrar o crear un prototipo de una característica en particular
Actuación
Clasificación: Alto
Escalabilidad
Clasificación: Bajo
individuales y, por lo tanto, no son altamente escalables. Dependiendo de cómo implemente los
de complemento, pero en general este patrón no es conocido por producir aplicaciones altamente
escalables.
Facilidad de desarrollo
Clasificación: Bajo
Análisis: La arquitectura del microkernel requiere un diseño cuidadoso y una gobernanza del
contrato, lo que la hace bastante compleja de implementar. El control de versiones de los
Quizás el concepto más importante de entender con este patrón es la noción de componente
de servicio. En lugar de pensar en servicios dentro de una arquitectura de microservicios,
es mejor pensar en componentes de servicio, que pueden variar en granularidad desde un
solo módulo hasta una gran parte de la aplicación. Los componentes del servicio contienen
uno o más módulos (por ejemplo, clases de Java) que representan
27
una función de propósito único (p. ej., proporcionar el clima para una ciudad o pueblo específico)
o una parte independiente de una aplicación comercial grande (p. ej., colocación de acciones o
determinación de tarifas de seguros de automóviles). Diseñar el nivel correcto de granularidad de
los componentes del servicio es uno de los mayores desafíos dentro de una arquitectura de
microservicios. Este desafío se analiza con más detalle en la siguiente subsección de
orquestación de componentes de servicio.
Otro concepto clave dentro del patrón de arquitectura de microservicios es que es un repartido arquitectura,
lo que significa que todos los componentes dentro de la arquitectura están completamente
desacoplados entre sí y se accede a ellos a través de algún tipo de protocolo de acceso
remoto (por ejemplo, JMS, AMQP, REST, SOAP, RMI, etc.). La naturaleza distribuida de este
patrón de arquitectura es cómo logra algunas de sus características superiores de
escalabilidad y despliegue.
Topologías de patrones
Si bien hay literalmente docenas de formas de implementar un patrón de arquitectura de
microservicios, tres topologías principales se destacan como las más comunes y populares: la Basado
en API REST topología, aplicación basada en REST topología, y la mensajería centralizada topología.
los Basado en API REST La topología es útil para sitios web que exponen servicios
individuales pequeños e independientes a través de algún tipo de API (interfaz de
programación de aplicaciones). Esta topología, que se ilustra en Figura 4-2 , consta de
componentes de servicio muy detallados (de ahí el nombre microservicios) que contienen
uno o dos módulos que realizan funciones comerciales específicas independientes del
resto de servicios. En esta topología, normalmente se accede a estos componentes de
servicio detallados mediante una interfaz basada en REST implementada a través de una
capa de API basada en web implementada por separado. Ejemplos de esta topología
incluyen algunos de los
Topologías de patrones | 29
servicios web RESTful basados en la nube de propósito encontrados por Yahoo, Google y Amazon.
La topología basada en REST de la aplicación difiere del enfoque basado en API REST en que
las solicitudes de los clientes se reciben a través de pantallas de aplicaciones comerciales
tradicionales basadas en web o de clientes pesados en lugar de a través de una simple capa de
API. Como se ilustra en Figura 4-3 , la capa de interfaz de usuario de la aplicación se implementa
como una aplicación web separada que accede de forma remota a componentes de servicio
implementados por separado (funcionalidad empresarial) a través de interfaces simples basadas
en REST. Los componentes de servicio en esta topología difieren de los de la topología basada
en API-REST en que estos componentes de servicio tienden a ser más grandes, más detallados y
representan una pequeña porción de la aplicación empresarial general en lugar de una sola
servicios de acción. Esta topología es común para aplicaciones de empresas pequeñas y
medianas que tienen un grado de complejidad relativamente bajo.
Topologías de patrones | 31
Figura 4-4. Topología de mensajería centralizada
Si descubre que necesita orquestar sus componentes de servicio desde la interfaz de usuario
o la capa de API de la aplicación, es posible que sus componentes de servicio sean
demasiado precisos. De manera similar, si encuentra que necesita realizar una comunicación
entre servicios entre componentes de servicio para procesar una sola solicitud, es probable
que sus componentes de servicio sean demasiado detallados o no estén divididos
correctamente desde el punto de vista de la funcionalidad empresarial.
La base de datos compartida puede manejar las necesidades de información, pero ¿qué pasa con
la funcionalidad compartida? Si un componente de servicio necesita una funcionalidad contenida
en otro componente de servicio o común a todos los componentes de servicio, a veces puede
copiar la funcionalidad compartida entre los componentes de servicio (violando así el principio
DRY: no lo repita). Esta es una práctica bastante común en la mayoría de las aplicaciones
empresariales que implementan el patrón de arquitectura de microservicios, y se compensa la
redundancia de repetir pequeñas porciones de la lógica empresarial con el fin de mantener
independientes los componentes del servicio y separar su implementación. Las pequeñas clases
de servicios públicos pueden caer en esta categoría de código repetido.
Consideraciones
El patrón de arquitectura de microservicios resuelve muchos de los problemas comunes que se
encuentran tanto en aplicaciones monolíticas como en arquitecturas orientadas a servicios. Dado que
los principales componentes de las aplicaciones se dividen en unidades más pequeñas que se
microservicios son generalmente más robustas, brindan una mejor escalabilidad y pueden admitir más
Consideraciones | 33
componente, puede escribir código especializado en la aplicación de interfaz de usuario para detectar
una implementación en caliente activa y redirigir a los usuarios a una página de error o página de
espera. Alternativamente, puede intercambiar múltiples instancias de un componente de servicio
dentro y fuera durante una implementación en tiempo real, lo que permite una disponibilidad continua
durante los ciclos de implementación (algo que es muy difícil de hacer con el patrón de arquitectura en
capas).
Una última consideración a tener en cuenta es que, dado que el patrón de arquitectura de
microservicios es una arquitectura distribuida, comparte algunos de los mismos problemas
complejos que se encuentran en el patrón de arquitectura impulsada por eventos, incluida la
creación de contratos, el mantenimiento y el gobierno. , disponibilidad del sistema remoto y
autenticación y autorización de acceso remoto.
Análisis de patrones
La siguiente tabla contiene una calificación y análisis de las características de la
arquitectura común para el patrón de arquitectura de microservicios. La calificación de
cada característica se basa en la tendencia natural de esa característica como una
capacidad basada en una implementación típica del patrón, así como por lo que el patrón
es generalmente conocido. Para obtener una comparación en paralelo de cómo se
relaciona este patrón con otros patrones de este informe, consulte Apéndice A al final de
este informe.
Agilidad general
Clasificación: Alto
Facilidad de implementación
Clasificación: Alto
a ser más fácil de implementar que la topología del mediador, principalmente porque el
componente del mediador de eventos está estrechamente acoplado a los procesadores de eventos:
Probabilidad
Clasificación: Alto
Actuación
Clasificación: Bajo
Análisis: Si bien puede crear aplicaciones implementadas a partir de este patrón que
funcionan muy bien, en general, este patrón no se presta naturalmente a aplicaciones
de alto rendimiento debido a la naturaleza distribuida del patrón de arquitectura de
microservicios.
Escalabilidad
Clasificación: Alto
Análisis: Debido a que la aplicación se divide en unidades implementadas por separado, cada
componente de servicio se puede escalar individualmente, lo que permite un escalado preciso de la
aplicación. Por ejemplo, es posible que el área de administración de una aplicación de comercio de
acciones no necesite escalar debido a los bajos volúmenes de usuarios para esa funcionalidad,
pero el componente de servicio de colocación de comercio puede necesitar escalar debido al alto
rendimiento que necesitan la mayoría de las aplicaciones de comercio para esto. funcionalidad.
Facilidad de desarrollo
Clasificación: Alto
Análisis de patrones | 35
CAPÍTULO 5
La mayoría de las aplicaciones comerciales basadas en web siguen el mismo flujo de solicitudes
general: una solicitud de un navegador llega al servidor web, luego a un servidor de aplicaciones y
finalmente al servidor de la base de datos. Si bien este patrón funciona muy bien para un grupo pequeño
de usuarios, comienzan a aparecer cuellos de botella a medida que aumenta la carga de usuarios,
primero en la capa del servidor web, luego en la capa del servidor de aplicaciones y finalmente en la
capa del servidor de base de datos. La respuesta habitual a los cuellos de botella basados en un
aumento en la carga de usuarios es escalar los servidores web. Esto es relativamente fácil y económico
y, a veces, funciona para solucionar los problemas de cuello de botella. Sin embargo, en la mayoría de
los casos de alta carga de usuarios, la ampliación de la capa del servidor web solo mueve el cuello de
botella al servidor de aplicaciones. El escalado de los servidores de aplicaciones puede ser más
complejo y costoso que los servidores web y, por lo general, solo mueve el cuello de botella al servidor
de la base de datos, que es aún más difícil y costoso de escalar. Incluso si puede escalar la base de
datos, lo que finalmente obtendrá es una topología en forma de triángulo, con la parte más ancha del
triángulo siendo los servidores web (más fácil de escalar) y la parte más pequeña es la base de datos
En cualquier aplicación de gran volumen con una carga de usuarios concurrentes extremadamente
grande, la base de datos generalmente será el factor limitante final en la cantidad de transacciones que
de escalado de bases de datos ayudan a abordar estos problemas, el hecho es que escalar una
37
El patrón de arquitectura basada en el espacio está diseñado específicamente para abordar y
resolver problemas de escalabilidad y concurrencia. También es un patrón de arquitectura útil para
aplicaciones que tienen volúmenes de usuarios concurrentes variables e impredecibles.
Resolviendo el problema de escalabilidad extrema y variable arquitectónicamente Suele ser un
método mejor que intentar escalar una base de datos o adaptar tecnologías de almacenamiento en
caché a una arquitectura no escalable.
La mayoría de las aplicaciones que se ajustan a este patrón son sitios web estándar que reciben una
solicitud de un navegador y realizan algún tipo de acción. Un sitio de subastas de ofertas es un buen
ejemplo de esto. El sitio recibe continuamente ofertas de los usuarios de Internet a través de una
solicitud del navegador. La aplicación recibiría una oferta por un artículo en particular, registraría esa
oferta con una marca de tiempo y actualizaría la información de la oferta más reciente para el artículo,
y enviaría la información al navegador.
persistente asíncrono opcional para la conmutación por error. También contiene un motor de replicación
que utiliza el software intermedio virtualizado para replicar los cambios de datos realizados por una
Dinámica de patrones
La magia del patrón de arquitectura basada en el espacio radica en los componentes de middleware
virtualizados y la cuadrícula de datos en memoria contenida dentro de cada unidad de procesamiento. Figura
5-2 muestra la arquitectura típica de la unidad de procesamiento que contiene los módulos de la aplicación,
Dinámica de patrones | 39
la cuadrícula de mensajería, la cuadrícula de datos, la cuadrícula de procesamiento y el administrador de
implementación.
Cuadrícula de mensajería
Cuadrícula de datos
El componente de cuadrícula de datos es quizás el componente más importante y crucial de este patrón.
La cuadrícula de datos interactúa con el motor de replicación de datos en cada unidad de procesamiento
para administrar la replicación de datos entre las unidades de procesamiento cuando ocurren
actualizaciones de datos. Dado que la cuadrícula de mensajes puede reenviar una solicitud a cualquiera
de las unidades de procesamiento disponibles, es esencial que cada unidad de procesamiento contenga exactamente
los mismos datos en su cuadrícula de datos en memoria. A pesar de que Figura 5-4 muestra una
replicación de datos sincrónica entre unidades de procesamiento, en realidad esto se hace en paralelo de
Rejilla de procesamiento
Dinámica de patrones | 41
cuadrícula que media y orquesta la solicitud entre esas dos unidades de procesamiento.
Gerente de implementación
El componente del gestor de despliegue gestiona el inicio y el apagado dinámicos de las unidades de
procesamiento en función de las condiciones de carga. Este componente monitorea continuamente los
tiempos de respuesta y las cargas de los usuarios, y pone en marcha nuevas unidades de procesamiento
cuando aumenta la carga y apaga las unidades de procesamiento cuando la carga disminuye. Es un
componente crítico para lograr necesidades de escalabilidad variable dentro de una aplicación.
Consideraciones
El patrón de arquitectura basada en el espacio es un patrón complejo y costoso de implementar.
Es una buena opción de arquitectura para aplicaciones web más pequeñas con carga variable
(por ejemplo, sitios de redes sociales, sitios de licitación y subastas). Sin embargo, no es
adecuado para aplicaciones tradicionales de bases de datos relacionales a gran escala con
grandes cantidades de datos operativos.
comúnmente se incluye uno para realizar la carga inicial de la cuadrícula de datos en memoria y las
procesamiento. También es una práctica común crear particiones separadas que aíslen volátiles y
ampliamente utilizados
Es importante señalar que, si bien el nombre alternativo de este patrón es arquitectura basada
en la nube, las unidades de procesamiento (así como el middleware virtualizado) no tienen que
residir en servicios alojados en la nube o PaaS (plataforma como Servicio). Puede residir
fácilmente en servidores locales, que es una de las razones por las que prefiero el nombre
"arquitectura basada en el espacio".
Análisis de patrones
La siguiente tabla contiene una clasificación y un análisis de las características de la
arquitectura común para el patrón de arquitectura basada en el espacio. La calificación de
cada característica se basa en la tendencia natural de esa característica como una
capacidad basada en una implementación típica del patrón, así como en lo que
generalmente se conoce al patrón. Para obtener una comparación en paralelo de cómo se
relaciona este patrón con otros patrones de este informe, consulte Apéndice A al final de este
informe.
Agilidad general
Clasificación: Alto
Análisis de patrones | 43
Facilidad de implementación
Clasificación: Alto
Probabilidad
Clasificación: Bajo
Actuación
Clasificación: Alto
Análisis: El alto rendimiento se logra mediante el acceso a datos en memoria y los mecanismos de
almacenamiento en caché integrados en este patrón.
Escalabilidad
Clasificación: Alto
Análisis: La alta escalabilidad proviene del hecho de que existe poca o ninguna
dependencia de una base de datos centralizada, por lo que se elimina esencialmente este
cuello de botella limitante de la ecuación de escalabilidad.
Facilidad de desarrollo
Clasificación: Bajo
Figura A-1 resume la puntuación del análisis de patrones para cada uno de los patrones de
arquitectura descritos en este informe. Este resumen lo ayudará a determinar qué patrón
podría ser mejor para su situación. Por ejemplo, si su principal preocupación arquitectónica es
la escalabilidad, puede observar este gráfico y ver que el patrón controlado por eventos, el
patrón de microservicios y el patrón basado en el espacio son probablemente buenas opciones
de patrones de arquitectura. De manera similar, si elige el patrón de arquitectura en capas para
su aplicación, puede consultar el gráfico para ver que la implementación, el rendimiento y la
escalabilidad pueden ser áreas de riesgo en su arquitectura.
45
Figura A-1. Resumen de análisis de patrones
Si bien este cuadro le ayudará a elegir el patrón correcto, hay mucho más que considerar al
elegir un patrón de arquitectura. Debe analizar todos los aspectos de su entorno, incluido el
soporte de infraestructura, el conjunto de habilidades del desarrollador, el presupuesto del
proyecto, los plazos del proyecto y el tamaño de la aplicación (por nombrar algunos). Elegir el
patrón de arquitectura correcto es fundamental, porque una vez que una arquitectura está en
su lugar, es muy difícil (y costoso) cambiarla.