Empresas que trabajan en dominios diferentes están descubriendo de
manera independiente patrones similares para construir software. Estos sistemas
son más robustos, más flexibles y están mejor posicionados para cumplir
demandas modernas.
Estos cambios están sucediendo porque los requerimientos de las
aplicaciones han cambiado drásticamente en los últimos años. Sólo unos pocos
años atrás, una aplicación grande tenía decenas de servidores, segundos de
tiempo de respuesta, horas de mantenimiento fuera de línea y gigabytes en
datos. Hoy, las aplicaciones se desplegan en cualquier cosa, desde dispositivos
móviles hasta clusters en la nube corriendo en miles de procesadores multi-core.
Los usuarios esperan que los tiempos de respuesta sean de milisegundos y que
sus sistemas estén operativos el 100% del tiempo. Los datos son medidos en
Petabytes. Las demandas de hoy simplemente no están siendo satisfechas por las
arquitecturas software de ayer.
Se necesita un enfoque coherente para la arquitectura de sistemas,
y se cree que todos los aspectos necesarios ya han sido identificados por
separado: queremos sistemas Responsivos, Resilientes, Elásticos y Orientados a
Mensajes. Se les llama Sistemas Reactivos.
Los sistemas construidos como Sistemas Reactivos son más flexibles, con
bajo acoplamiento y escalables. Esto hace que sean más
fáciles de desarrollar y abiertos al cambio. Son significativamente más
tolerantes a fallos y cuando fallan
responden con elegancia y no con un desastre. Los Sistemas Reactivos son
altamente responsivos, dando a los usuarios un
feedback efectivo e interactivo.
Los Sistemas Reactivos
Responsivos
El sistema responde a tiempo en
la medida de lo posible. La responsividad es la piedra angular de la usabilidad
y la utilidad, pero más que esto, responsividad significa que los problemas
pueden ser detectados rápidamente y tratados efectivamente. Los sistemas responsivos
se enfocan en proveer tiempos de respuesta rápidos y consistentes,
estableciendo límites superiores confiables para así proporcionar una calidad
de servicio consistente. Este comportamiento consistente, a su vez, simplifica
el tratamiento de errores, aporta seguridad al usuario final y fomenta una
mayor interacción.
Basicamente un sistema que siempre responde de acuerdo a las exigencias del negocio.
Resilientes
El sistema permanece responsivo
frente a fallos. Esto es aplicable no sólo a
sistemas de alta disponibilidad o de misión crítica - cualquier sistema que no
sea resiliente dejará de ser responsivo después de un fallo. La resiliencia es
alcanzada con replicación, contención, aislamiento y delegación. Los fallos son
manejados dentro de cada componente, aislando cada
componente de los demás, y asegurando así que cualquier parte del sistema pueda
fallar y recuperarse sin comprometer el sistema como un todo. La recuperación
de cada componente se delega en otro componente (externo) y la alta
disponibilidad se asegura con replicación allí donde sea necesario. El cliente
de un componente no tiene que responsabilizarse del manejo sus fallos.
Tratar de parar la propagacion de errores por todo el sistema y manejarlos individualmente, junto con tecnicas como cluster hacen que el sistema pueda seguir trabajando a pesar de tener problemas internos, es decir el fallo se lo toma como parte del ciclo de produccion.
Elásticos
El sistema se mantiene responsivo
bajo variaciones en la carga de trabajo. Los Sistemas Reactivos pueden
reaccionar a cambios en la frecuencia de peticiones incrementando o reduciendo
los recursos asignados para servir
dichas peticiones. Esto implica diseños que no tengan puntos de contención o
cuellos de botella centralizados, resultando en la capacidad de dividir o
replicar componentes y distribuir las peticiones entre ellos. Los Sistemas
Reactivos soportan algoritmos de escalado predictivos, así como Reactivos, al
proporcionar relevantes medidas de rendimiento en tiempo real. La elasticidad se consigue de
forma rentable haciendo uso de plataformas con hardware y software genéricos.
Poder variar sus capacidades de respuesta de acuerdo a condiciones temporales a veces creciendo y otras decreciendo en infraestructura puede significar ahorros en costos y poder responder al negocio de forma optima.
Orientados a Mensajes
Los Sistemas
Reactivos confían en el intercambio de mensajes asíncrono para establecer
fronteras entre componentes, lo que asegura bajo acoplamiento, aislamiento
y transparencia de ubicación. Estas
fronteras también proporcionan los medios para delegar fallos como mensajes. El uso
del intercambio de mensajes explícito posibilita la gestión de la carga, la
elasticidad, y el control de flujo, gracias al modelado y monitorización de las
colas de mensajes en el sistema, y la aplicación de back-pressure cuando sea
necesario. La mensajería basada en ubicaciones transparentes como medio de
comunicación permite que la gestión de fallos pueda trabajar con los mismos
bloques y semánticas a través de un cluster o dentro de un solo nodo. La
comunicación No-bloqueante permite a los destinatarios
consumir recursos sólo mientras estén
activos, llevando a una menor sobrecarga del sistema.
Trabajar de forma asincrona y delimitando los contextos de cada componente a traves de fronteras, este tipo de mensajeria puede ser implementada de diferentes formas una de ella es un ESB (Bus de Servicios Empresariales) donde la transparencia de ubicacion, conversion de protocolos y tecnologias es crucial, sin embargo existen otras formas APIs, gateways, brokers de mensajeria
Conclusiones
Los sistemas grandes están compuestos de otros más pequeños y por lo tanto dependen
de las propiedades Reactivas de sus partes. Esto significa que los Sistemas
Reactivos aplican principios de diseño para que estas propiedades sean válidas
a cualquier escala, haciéndolas componibles. Los sistemas más grandes del mundo
confían en arquitecturas basadas en estas propiedades y atienden las
necesidades de miles de millones de personas diariamente. Es tiempo de aplicar
estos principios de diseño conscientemente desde el inicio, en vez de
redescubrirlos cada vez.
Aunque el manifiesto no habla específicamente de microservicios, al decir que los grandes sistemas estarán compuestos de otros más pequeños con las mismas características ya dejan entrever la constitución de un sistema a través de pequeños elementos o unidades que se mantengan aislados y operantes, responsivos, resilientes y elásticos de forma individual para conseguir un sistema como un conjunto igualmente responsivo, resiliente y elástico e igualmente orientado a mensajes asíncronos en toda su interacción.
No olvidemos que la premisa de este tipo de arquitecturas es responder a las necesidades del dominio o negocio por lo que por ejemplo "tiempos de respuesta optimos" van acorde a lo que se espera dentro del negocio, y lo principal es tener disponibilidad, poder crecer o decrecer de acuerdo a la carga, aislar la propagacion de errores y tener bajo acoplamiento en cada uno de los componentes por todo lo anterior, el diseño, desarrollo e implantacion de este tipo de sistemas puede parecer costoso pero si es de una ayuda para el negocio podria convertirse en nuevas oportunidades y modelos de negocio que apoyarian la gestion empresarial.
No hay comentarios.:
Publicar un comentario
Déjame tus mensajes y recomendaciones