¡Maravilloso este punto, tantas opciones para elegir puede hacer que tomes una decisi贸n no acertada… pero si basamos nuestra decisi贸n en la experiencia ajena (exitosamente probada), seguro que llegamos a puerto seguro!
Dominio: Arquitectura de Software.
Primer paso para crear una arquitectura. Pararse en hombros de gigantes Aprovechar el conocimiento existente para nuestra soluci贸n.
- Productos “de la estanter铆a”. Productos ya echos que resuelvan parte de nuestros problemas.
- Frameworks y librer铆as. Ayuda a empezar/proponer desde una arquitectura m谩s especifica.
- Arquitecturas especificas del dominio. Decisiones de dise帽o ya tomadas para ciertos dominios del problema.
- Patrones de arquitectura. Empezar desde un punto mas solido y restringir nuestro dise帽o a las partes importantes que quedan por resolver.
Herramientas y partes de un dise帽o: Tipos de conectores
La arquitectura est谩 separada en dos partes fundamentales:
- Componentes: Son partes de nuestro sistema que cumplen una funci贸n espec铆fica. Estos mismos componentes “modulares” pueden estar formados por m谩s componentes, ya bien objetos o capas, que actuan como subcomponentes en su interior. La comunicaci贸n existente entre ellos se lleva a cabo por medio de conectores.
- Conectores: Estos no est谩n asociados a un dominio espec铆fico y son independientes a la hora de su an谩lisis, pudiendo un e-commerce o una red social el mismo tipo de conector.
Tipos de conectores:
- Llamado a procedimiento: Invocan de un componente a otro componente y esperan una respuesta.
- Enlace: Vinculan fuertemente un componente a otro, incluso para la compilaci贸n. Visto en lenguajes compilados, y en componentes que forman parte de un monolito
- Evento: Permiten a un componente notificar un evento (que algo sucedi贸), y a otros componentes escuchar y reaccionar ante un evento.
- Adaptador: Ayudan a compatibilizar la interfaz de un componente con la de otro componente
- Acceso a datos: Nos ayudan a acceder a recursos compartidos de datos, como APIs, sistemas de archivos y bases de datos. Compatibiliza la interfaz del dato con la interfaz que espera el componente que estamos usando.
- Flujo: Permite la recolecci贸n de datos en un flujo de informaci贸n continuo por parte de otro componente que tiene intereses en obtener varios o todos los datos del flujo.
- Arbitraje: Coordinan los permisos de acceso a un recurso entre componentes y deciden quien se encarga de distribuir dichos comportamientos. Ej: Test A/B, teniendo varios componentes disponibles recibimos un pedido y se decide qu茅 versi贸n enviar para comparar diferentes atributos de calidad.
- Distribuidor: Facilita la distribuci贸n de un mensaje a varios componentes a trav茅s de un solo conector.
Conectores
Llamado asincr贸nico / sincr贸nico. Modelo Cliente servidor
- Llamado asincr贸nico: Un componente llama a otro. pero no espera a que termine esta ejecuci贸n, sigue con su trabajo y en alg煤n momento evaluara cual fue el resultado. T铆pico en sistemas desconectados.
- Llamado sincr贸nico: El emisor env铆a un mensaje al receptor y no sigue ejecutando hasta que no reciba el resultado. T铆pico en lenguajes orientado a objetos
- Cliente/Servidor: La comunicaci贸n es del cliente al servidor y el cliente queda esperando la respuesta.
Enrutador, difusi贸n
- Enrutador: Facilita la conexi贸n entre un componente que emite un mensaje y entre un set especifico de componentes que les interesa el mensaje. El enrutador sabe de entre todos los componentes a cuales les interesa.
- Difusi贸n: Dado el mensaje de un emisor, lo difunde a muchos otros componentes interesados.
Pizarra, repositorio, colas, modelo PUBSUB
- Cola. Cuando se tiene un productor que tiene mas velocidad que el consumidos. Para conectarlos, se debe compatibilizar su velocidad. Para eso se debe encolar/agendar el procesamiento de los mensajes. y por eso el consumidor puede ir leyendo esos mensajes a medida que su velocidad se lo permita.
- Repositorio / Pizarra. Orientado a escribir o leer datos de un componente que funciona como base de datos
- Publicar suscribir (PUBSUB). Permite mandar mensajes desde un componente que publica eventos a uno que se suscriba a esos eventos sin necesidad que se conozcan.
Escenarios y t谩cticas
Framework de dise帽o orientado a atributos plantea una estructura de Escenarios y t谩cticas en donde cada escenario ayudar谩 a conectar atributos con diferentes t谩cticas de implementaci贸n.
La estructura b谩sica de todo escenario del framework en donde un escenario que va a estar asociado a un atributo de calidad especifico va a plantear un est铆mulo, el cual va a tener que ver con algo que afecta directamente a este atributo de calidad y luego va a plantear diferentes t谩cticas para controlar la respuesta a este est铆mulo, por 煤ltimo la respuesta es lo que esperamos o nuestro caso de 茅xito como pudimos resolver este estimulo con la implementaci贸n de algunas de estas t谩cticas.
Escenarios: Disponibilidad, detecci贸n, reparaci贸n
Escenario de disponibilidad. En este caso el est铆mulo es la falla, algo pas贸 que compromete la disponibilidad. vamos a ver las diferentes t谩cticas que podemos usar para trabajar con este posible escenario.
Detecci贸n, en este caso contamos con varias t谩cticas:
- Ping / Eco. que se trata de como un componente env铆a un mensaje gen茅rico a otro componente para saber si el otro componente esta disponible o no.
- Latido. Esta t谩ctica es similar pero en vez de que haya interacci贸n entre dos componentes, cada uno de estos env铆an una se帽al propia que indica que continua activo.
- Excepciones. Un m茅todo para reconocer fallas es encontrar una excepci贸n, que se produce cuando se reconoce una de las clases de fallas. El manejador de excepciones generalmente se ejecuta en el mismo proceso que introdujo la excepci贸n.
Recuperaci贸n, como podemos estar listos para que si algo falla podamos recuperar r谩pidamente el sistema.
- Votaci贸n. El algoritmo de votaci贸n puede ser “reglas de mayor铆a” o “componente preferido” o alg煤n otro algoritmo. Este m茅todo se usa para corregir el funcionamiento defectuoso de algoritmos o fallas de un procesador y se usa a menudo en sistemas de control.
- Redundancia activa. Cuando se produce una falla, el tiempo de inactividad de los sistemas que utilizan esta t谩ctica suele ser de milisegundos, ya que la copia de seguridad es actual y el 煤nico momento de recuperaci贸n es el tiempo de conmutaci贸n. La redundancia activa a menudo se utiliza en una configuraci贸n cliente / servidor, como los sistemas de administraci贸n de bases de datos, donde las respuestas r谩pidas son necesarias incluso cuando ocurre una falla.
- Redundancia pasiva. Un componente (el primario) responde a los eventos e informa a los otros componentes (los recursos) de las actualizaciones de estado que deben realizar. Cuando ocurre una falla, el sistema primero debe asegurarse de que el estado de la copia de seguridad sea lo suficientemente reciente antes de reanudar los servicios.
- Repuesto. Una plataforma de computaci贸n de reserva en espera est谩 configurada para reemplazar muchos componentes diferentes que fallaron. Debe reiniciarse a la configuraci贸n de software apropiada y debe tener su estado inicializado cuando ocurre una falla.
Escenarios: Reintroducci贸n y prevenci贸n
Reintroducci贸n, Hay t谩cticas de reparaci贸n que se basan en la reintroducci贸n de componentes. Cuando un componente redundante falla, puede reintroducirse despu茅s de haber sido corregido. Tales t谩cticas son el funcionamiento en la sombra, la resincronizaci贸n del estado y la reversi贸n.
- Modo sombra. Un componente previamente fallido puede ejecutarse en “modo sombra” durante un corto per铆odo de tiempo para asegurarse de que imita el comportamiento de los componentes en funcionamiento antes de restaurarlo al servicio.
- Resincronizaci贸n del estado. Las t谩cticas de redundancia pasiva y activa requieren que el componente que se est谩 restaurando tenga su estado actualizado antes de su regreso al servicio.
- Punto de control / retroceso. Un punto de control es una grabaci贸n de un estado consistente creado peri贸dicamente o en respuesta a eventos espec铆ficos.
Prevenci贸n, Las siguientes son algunas t谩cticas de prevenci贸n de fallas.
- Remoci贸n del servicio. Esta t谩ctica elimina un componente del sistema de la operaci贸n para someterse a algunas actividades para evitar fallas anticipadas. Un ejemplo es reiniciar un componente para evitar que las p茅rdidas de memoria causen una falla.
- Transacciones. Una transacci贸n es la agrupaci贸n de varios pasos secuenciales, de modo que todo el paquete se puede deshacer a la vez. Las transacciones se utilizan para evitar que cualquier dato se vea afectado si falla un paso de un proceso y tambi茅n para evitar colisiones entre varios subprocesos simult谩neos que acceden a los mismos datos.
- Monitor de proceso. Una vez que se ha detectado un error en un proceso, un proceso de supervisi贸n puede eliminar el proceso no productivo y crear una nueva instancia del mismo, inicializado en un estado apropiado como en la t谩ctica de repuesto.
Escenarios: Mantenibilidad
En este caso el estimulo es un pedido de cambio (llega un requerimiento y tenemos que cambiar el sistema).
Familias de t谩cticas:
Confinar modificaciones. Las t谩cticas van a intentar trabajar sobre nuestros m贸dulos para que cada cambio que nos pidan est茅 confinado a s贸lo un m贸dulo. Cuando logramos esto logramos que las dependencias entre m贸dulos sean m谩s ligeras y el cambio que nos proponen no afecte a muchas partes del sistema.
- Coherencia sem谩ntica. Habla de la relaci贸n entre las responsabilidades de los m贸dulos. Hablamos de acoplamiento y cohesi贸n. Si logramos encontrar la cohesi贸n en un m贸dulo entonces vamos a poder hacer que ese m贸dulo sea m谩s mantenible. De lo contrario es posible que ese m贸dulo cambie por diferentes razones. Abstraer servicios comunes. Cuando encontramos que la aplicaci贸n tiene servicios m谩s gen茅ricos de no necesario podemos abstraerlos a un punto com煤n y que las dependencias vayan de los m贸dulos cohesivos a un servicio o modulo externo.
- Generalizar. Al generalizar un m贸dulo podemos separar lo espec铆fico de lo gen茅rico.
- Limitar opciones disponibles. Limitar el rango de modificaci贸n nos ayuda a que sea m谩s mantenible.
- Anticipar cambios. Prepararnos para alg煤n cambio que nosotros mismo sepamos que se deber谩 de dar en el futuro tomando en cuenta una estrategia sobre como incorporar el nuevo cambio. Los patrones de dise帽o suelen estar orientados a esto (Patr贸n estrategia).
Prevenir efectos domino. Trabaja estrictamente con las dependencias, es decir cuando podemos detectar que un cambio generar铆a problemas en otros m贸dulos o dependencias.
Diferir enlace. C贸mo podemos hacer para que un cambio en el c贸digo no requiera desplegar toda la aplicaci贸n.
Escenarios: Prevenir efectos domin贸 y diferir enlace
Prevenir efectos domin贸. Trabaja estrictamente con las dependencias. Es decir, cu谩ndo podemos detectar que un cambio generar铆a problemas en otros m贸dulos u otras dependencias.
- Ocultar informaci贸n. Cualquier m贸dulo u objeto que dise帽emos, tenga la capacidad de ocultar cierta parte de la informaci贸n para que los agentes externos no dependan de esa informaci贸n puntual sino de una interfaz clara que no puedan cambiar por m谩s que la informaci贸n cambie. De esta forma podemos garantizar que, si el cambio de la informaci贸n es importante, los dependientes no necesiten cambiar porque est谩n pasando por una interfaz que no cambi贸.
- Mantener la interfaz. Si tengo un servicio que hace algo, la dependencia a ese servicio va a ser a trav茅s de una interfaz clara, de lo contrario cualquier acci贸n cuando cambie puede poner en riesgo el m贸dulo.
- Restringir comunicaci贸n. Para generar sistemas que est茅n acoplados de forma ligeras, en vez de conocer las dependencias de tus dependencias, siempre te limites a tus dependencias directas, de esta forma cualquier cambio en la forma que tus dependencias trabajan no afecta al m贸dulo en el que est谩s trabajando.
- Intermediarios. Hablamos de un punto donde podamos compatibilizar a un m贸dulo con otro y si dejan de ser compatibles, estos intermediarios puedan servir como punto de compatibilidad.
Diferir enlace. Habla sobre c贸mo podemos hacer para que un cambio en nuestro c贸digo no requiera desplegar toda la aplicaci贸n completa.
- Registro en ejecuci贸n. Cuando un m贸dulo o servicio depende de otro, si dependen fuertemente van a requerir estar compilados juntos. Si nosotros podemos diferir esa compilaci贸n y que se registre un servicio en momento de ejecuci贸n, es decir que se ponga disponible a sus dependencias en el momento de ejecuci贸n, podemos hacer que estos servicios se puedan desplegar independientemente.
- Archivos de configuraci贸n. Van a servir para en momento de ejecuci贸n saber c贸mo conectar varias partes. Es imprescindible que nuestros m贸dulos dependan de interfaces y no de implementaciones espec铆ficas.
- Polimorfismos. Un objeto pueda comportarse de forma diferente en base a su estado. A trav茅s del polimorfismo podemos postergar la forma en que se resuelve un problema dependiendo de qu茅 instancia del objeto ser谩.
- Reemplazo de componentes. Tener la capacidad de desplegar un componente y luego desplegar su reemplazo, o quiz谩s otro componente que respete esa interfaz, y que todo el resto de nuestra aplicaci贸n no necesite cambiar.
- Adherir a protocolos. Nos permite tener un protocolo claro entre dos m贸dulos y no necesitar saber la instancia espec铆fica o el tipo espec铆fico de un m贸dulo.
Escenarios: Eficiencia de ejecuci贸n
En el caso de eficiencia de ejecuci贸n vamos a tener eventos ingresando a nuestro sistema como est铆mulo y luego vamos a trabajar sobre las t谩cticas para controlar esta eficiencia para que la respuesta sea dentro del tiempo esperado.
Demanda de recursos. Trata sobre cu谩ndo entra un evento, c贸mo hacemos para que ese evento tenga los recursos disponibles y cu谩nto de esos recursos necesita.
- Mejorar la eficiencia computacional. Podemos analizar nuestros algoritmos y podemos analizar nuestro procedimiento para encontrar cu谩les son los puntos en d贸nde no estamos siendo eficientes.
- Reducir sobrecarga. Habla sobre cu谩ntos pasos o qu茅 acciones estamos tomando para una misma tarea o responder a un mismo evento.
- Manejar tasa de eventos. Cu谩ntos eventos vamos a emitir a un componente espec铆fico y si es necesario ser tan fino en estos eventos. Si podemos reducir esa tasa de eventos podemos optimizar esa comunicaci贸n.
- Frecuencia de muestreo. Si yo s铆 estoy recibiendo todo este stream, c贸mo puedo hacer para decidir procesar esos eventos en una forma grupal, entonces en lugar de hacer una tarea por evento puedo hacer una tarea cada cierta cantidad de tiempo y agrupar todos los eventos en una tarea 煤nica puedo hacer mejor uso de los recursos procesando una sola vez un grupo de eventos.
Gesti贸n de recursos. C贸mo ponemos disponibles m谩s o menos recursos y c贸mo hacemos para que est茅n cuando se le necesitan.
- Concurrencia. Trabajamos sobre c贸mo paralelizar nuestro proceso para que se pueda responder en menor tiempo usando recursos de forma paralela o en menor tiempo.
- R茅plicas. C贸mo podemos duplicar el procesamiento o los datos para hacer m谩s accesibles estos recursos a nuestro proceso.
- Aumentar recursos. El poder medir y decidir cu谩ndo crecer la cantidad de recursos que tenemos disponibles.
- Pol铆ticas de planificaci贸n de tareas. Yo puedo decidir que cada recurso tiene que responder en el momento entonces tiene que tener un acceso sincr贸nico, un acceso prioritario a cada uno de esos recursos o puede postergar tareas y agendarlas para que se hagan en un momento futuro. Incluso puedo priorizar esos pedidos paralelos y decidir si un pedido es m谩s importante que otro o el orden en que se van a resolver.
Escenarios: Seguridad
Nuestro estimulo de entrada es un ataque, nuestras t谩cticas para controlar la seguridad y tener como resultado la detecci贸n, resistencia o recuperaci贸n en nuestro sistema. Tendremos tres familias:
- Detectar ataques: Van a tratar de identificar que el estado actual de la aplicaci贸n est谩 bajo un ataque, puede ser por medio de sensores.
- Detectores de intrusos: Ayuda a tener implementaciones para saber cu谩ndo se est谩 usando de manera no apropiada. Levantar谩 alertas para tomar decisiones sobre nuestro sistema (pueden ser complejas, automatizadas o simples). Podremos ir descendiendo en niveles cuanto m谩s complejo sea.
Recuperaci贸n de ataques: Trata de tener bases o t谩cticas para regresar a un estado basal y tambi茅n poder comprender cu谩les fueron las acciones del atacante para poder evitarlas a futuro
- Restauraci贸n: C贸mo hacemos para entender nuestros estados del sistema y entender qu茅 pasa con mi sistema. Es muy similar a la estrategia de Disponibilidad (estados conocidos, estados diferentes para comparar)
- Identificaci贸n: Saber qu茅 espec铆ficamente hizo el atacante. La traza de auditoria sirve para que cuando detectamos un atacante tengamos todo el rastro de nuestro usuario y poder restablecer mi sistema a ese punto basal, ignorando lo que hizo el atacante
Resistencia de ataques: Va a tratar que el atacante no tenga 茅xito.
- Autenticaci贸n: C贸mo sabemos que el usuario es quien realmente die ser (Contrase帽as, datos biom茅tricos, RS, etc.)
- Autorizaci贸n: Saber qui茅n es y qu茅 puede o no hacer esa persona (Roles entre sistemas)
- Confidencialidad de datos: C贸mo garantizamos que el dato sea visto por quien debe verlo (encriptaci贸n)
- Integridad: C贸mo garantizo que el mensaje es 铆ntegro, es decir, c贸mo el emisor lo envi贸 (Hashes para comprobar informaci贸n)
- Limitar exposici贸n: Si un atacante entra podemos determinar que este no pueda (por lo menos) entrar a consultar la informaci贸n mas sensible del usuario. Lo podemos hacer separando informaci贸n (separar info sensible de info “normal”).
- Limitar acceso: Entender cu谩les son los vectores de acceso y restringir lo menor posible esos accesos que pueden ser puntos iniciales de penetraci贸n (Puertos de red: 8080, SSH, etc.)
Escenarios: Capacidad de prueba
Capacidad de prueba: Nuestro estimulo de entrada ser谩 una nueva funcionalidad para implementar, tendremos t茅cnicas para controlar la capacidad de prueba y nuestro resultado ser谩 detectar fallas para repararla y volver a iterar. Tendremos dos grandes familias, entradas/salidas y monitoreo que tiene en cuenta m谩s que nada la ejecuci贸n.
Entrada/Salida: C贸mo hacer para dado un est铆mulo de entrada, evaluar una salida.
- Captura y reproducci贸n: Sirve para, en un escenario de comunicaci贸n, grabarla para poder usar esa comunicaci贸n en un test de prueba. De esta forma podemos garantizar que el uso normal est谩 cubierto por un test y sabemos qu茅 es lo que tiene que dar mi sistema. Es muy 煤til cuando queremos trabajar con sistemas externos. VCR (librer铆a: video cam recording) es una herramienta muy 煤til aqu铆.
- Separar la interfaz de la implementaci贸n: De esta forma podemos evaluar si la implementaci贸n est谩 recibiendo lo que se espera. Podemos hacer pruebas con diferentes implementaciones.
- Acceso exclusivo para pruebas: Trata sobre partes de la aplicaci贸n que no podemos funcionar desde fuera de la aplicaci贸n, para esto es posible que tenga que escribir c贸digo espec铆fico para el contexto de test, es importante garantizar que no llegue a ambientes productivos. Son 煤tiles para probar microservicios.
Monitoreo: Tendr谩 en cuenta la ejecuci贸n y que se est谩 ejecutando exitosamente
- Monitoreo interno: Significa incorporar a la misma aplicaci贸n funcionalidades que nos permiten tener informaci贸n de lo que se est谩 ejecutando para mantener el control de lo que est谩 consumiendo cada aplicaci贸n.
Escenarios: Usabilidad
Separar la interfaz de usuario. Que cualquier otro artefacto que haya dentro de nuestra aplicaci贸n, cualquier m贸dulo que hagamos, est茅 separado de la interfaz de usuario. De esta forma podemos iterar y podemos revisar la cantidad de veces que sea necesario la interfaz de usuario para poder trabajar constantemente sobre la usabilidad de lo que estamos proponiendo, y esto puede trabajarse independientemente de la l贸gica de negocios o de la estructura de datos.
Iniciativas de usuarios. Acciones que el usuario va a hacer y c贸mo el sistema puede ayudarlo.
- Cancelar. Permite a un usuario dada una acci贸n previa el poder arrepentirse.
- Deshacer. Volver para atr谩s al estado anterior le permite al usuario re evaluar lo que va a hacer y luego tomar mejores decisiones.
- Agregaci贸n. Tiene que ver con entender cu谩ndo las funcionalidades que estamos presentando al usuario en realidad deber铆an estar agrupadas.
- M煤ltiples vistas. Refiere a c贸mo hacemos para que el usuario tenga solamente la informaci贸n necesaria para poder hacer sus acciones de la forma m谩s eficiente posible.
Iniciativas del sistema. La idea es poder entender del lado del sistema cu谩l es el estado actual de la aplicaci贸n.
- Modelo del usuario. Esto significa que del lado del sistema entendamos cu谩l es el estado actual del usuario para poder empezar una iniciativa, es decir, enviar un mensaje del lado del sistema y que tenga sentido con lo que est谩 viendo.
- Modelo del sistema. Implica qu茅 sabemos de nosotros mismos, qu茅 sabemos como aplicaci贸n de lo que est谩 pasando en este momento.
- Modelo de la tarea. Tiene que ver con cu谩nto entiende el sistema de la tarea que est谩 realizando el usuario.
Validar las decisiones de dise帽o: Arquitectura en evoluci贸n
Validar decisiones. Dependiendo el contexto, la validaci贸n de arquitectura, es un proceso que tenemos que hacer antes de entrar en desarrollo o bien como un proceso continuo cada vez que desarrollamos.
En metodolog铆as tradicionales, el dise帽o de la arquitectura es importante antes de empezar a desarrollar
En metodolog铆as 谩giles se reval煤a la arquitectura en cada iteraci贸n.
M茅todo ATAM (M茅todo de an谩lisis de Trade-off)
Los objetivos de negocio, atributos de calidad y los escenarios planteados se combinan con la arquitectura que definamos, sus estrategias y decisiones. Se analizan para que las partes interesadas tengan voz y voto y decidir sobre la misma.
Comentarios
Publicar un comentario