Adsence

lunes, 24 de septiembre de 2018

Manifiesto de Sistemas Reactivos




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.

martes, 29 de mayo de 2018

Microservicios Ventajas y desventajas



Los microservicios se han barajado en los últimos años, pero ¿cuáles son las ventajas y desventajas reales de implementarlos y ejecutarlos? Al igual que cualquier arquitectura de servicio, existen pros y contras, beneficios y compensaciones. Entonces, ¿cómo se comparan los microservicios con otras arquitecturas de aplicaciones como monolitos, arquitectura orientada a servicios (SOA) y funcional?


Este es un analisis no demasiado profundo pero sirve para arrojar algo de luz sobre por qué el desarrollador y la comunidad DevOps están presionando contra la arquitectura de que microservicios es la solución para todo en 2018.

¿Qué es un microservicio?

Está más allá del alcance de este artículo proporcionar una definición exhaustiva de un microservicio. Dicho esto, permítanme seguir adelante y dar un intento de definición simple: "Los microservicios son componentes individuales y distintos de un programa de software que existen para cumplir la función más pequeña posible de una aplicación sin dejar de ser independientes y útiles para el negocio. Desde un punto de vista práctico , cada servicio es un código pequeño, altamente definido y discreto que es responsable de una tarea (por ejemplo, la autorización del usuario final) ".



El lado bueno

Los microservicios, cuando se implementan correctamente, pueden mejorar enormemente la confiabilidad y la escalabilidad del software. Uno de los aspectos más convincentes de los microservicios, cuando se los compara con los monolitos, por ejemplo, es que un error o error en un servicio no debería afectar la capacidad de otros servicios para seguir trabajando según lo previsto. Tenga en cuenta que lo excluí diciendo que no debería, pero más sobre eso más adelante.

Los microservicios tienen una serie de ventajas, como:
  •  Capaz de escalar de forma independiente
  •  Tolerante a fallos
  •  Se puede intercambiar o reescribir fácilmente
  •  Marco y lenguaje agnóstico
  •  Adherirse al principio KISS

Lo que esto significa desde un punto de vista práctico es que una aplicación debería:

  1. Escale fácilmente y de una manera altamente eficiente.
  2. No tener un único punto de falla.
  3. Ser retirado, refactorizado o reescrito sin comprometer la integridad de toda la aplicación.
  4. Estar escrito en muchos idiomas y marcos para adaptarse a los requisitos de cada servicio.
  5. Sé simple y discreto.
  6. Satisface fácilmente los requisitos para los entornos modernos de PaaS(plataforma como servicio) y SaaS (software como servicio).
Muchos equipos de ingeniería conocidos y respetados de empresas como Amazon, Netflix, eBay y otros han adoptado microservicios. Por lo tanto, tiene sentido que cada desarrollador o nueva empresa de software deba reflexionar sobre si adoptar una arquitectura de microservicio. Si somos honestos acerca de esto, ¿quién no admira la destreza de ingeniería de estas empresas con visión de futuro? (personalmente admiro esa visión).

Si es lo suficientemente bueno para Netflix, entonces seguramente debe ser lo suficientemente bueno para nosotros. Pues, a lo mejor no. Como veremos, la mentalidad de "por qué no nosotros" debe dejarse de lado. Todo depende de la realidad empresarial y del contexto de desarrollo.

El lado malo

El hecho de que algo sea una tendencia en la industria no significa necesariamente que sea una solución viable para cada caso de uso. Una de las principales desventajas es toda la publicidad que rodea a los microservicios.  Algunas de las dificultades más superficiales con microservicios incluyen:
  • Más complejidad, gracias a la experiencia requerida para mantener una aplicación basada en micro servicio con todas sus partes móviles.
  • Si la aplicación no necesita escalar o no está basada en la nube, la arquitectura basada en microservicios puede no proporcionar ningún beneficio significativo.
  • No hay opciones nuevas, porque los microservicios necesitan conectarse a los sistemas existentes (y posiblemente monolíticos).
  • Las unidades de funcionalidad más pequeñas que se comunican mediante API necesitan métodos de prueba más robustos, así como la aceptación de todo el equipo de ingeniería.
  • La necesidad de una mayor gestión y comunicación del equipo para garantizar que todos, no solo ciertos ingenieros, comprendan cada servicio y el sistema en su conjunto.
  • Mayor complejidad en entornos de infraestructura con la inclusión de gateways, contenerizacion y equipos.

El lado feo

El hecho de que Netflix o alguna startup de Silicon Valley haya adoptado microservicios no significa que sea el estilo arquitectónico correcto para todas las aplicaciones. La arquitectura de la aplicación debe basarse no solo en lo que está en boga en este momento, sino también en la eficacia y extensibilidad. Cuando se trata de eso, los puntos dolorosos verdaderamente intrínsecos que los microservicios vienen de la mano son:

  • Tratar con los gastos generales de desarrollo, despliegue y gestión operativa de los sistemas distribuidos puede ser costoso y requiere una inversión inicial elevada.
  • Elegir un equipo tecnológico diferente para diferentes componentes conduce a un diseño y arquitectura de aplicación no uniforme.
  • Documentación interminable en forma de esquemas actualizados y documentos de interfaz para cada aplicación de componente individual.
  • Los costos de mantenimiento, costos operacionales y monitoreo en entornos de producción son mucho más altos, y este último también adolece de una escasez de herramientas disponibles.
  • Las pruebas de automatización se vuelven difíciles cuando cada componente de microservicio se ejecuta en un entorno de tiempo de ejecución diferente.
  • Mayor consumo de recursos y memoria de todos los componentes de funcionamiento independiente que necesitan sus propios contenedores de tiempo de ejecución con más memoria y CPU.
  • Los microservicios, cuando se implementan incorrectamente, pueden hacer que las aplicaciones mal escritas sean aún más disfuncionales, es decir los malos habitos del equipo de desarrollo se extrapolan con mas componentes.
Los microservicios son una verdadera espada de doble filo para cualquier consideración de arquitectura de aplicación. Si está pensando en migrar, bloquee el ruido que rodea toda la publicidad y lleve a cabo su propia investigación debida para ver si los microservicios son la solución adecuada para las necesidades de su aplicación.