Me encuentro con este artículo de Kai Wähner sobre la papel de ESB en una arquitectura con microservicios que llama mi atención. Evidentemente, el tema de los microservicios está de moda en los “ambientes”, y una de las cosas que quiero saber es como encaja esta forma de diseñar el software con SOA (si es que encaja de alguna manera).
Como en casi todo, hay opiniones para todos los gustos. La mía es que si dejamos a un lado la tradicional implementación de SOA (basados en web services tipo SOAP) y aplicamos únicamente los 8 principios de Thomas Erl y sus colegas, los microservicios deben verse como una implementación más de SOA.
Por supuesto, hay algunas “fricciones” entre los conceptos que hemos manejados hasta ahora y los propugnados por gurús como Martin Fowler. Y uno de los primeros que me llamó la atención es este “endpoints inteligentes y tuberías tontas”.
¿Quién es el tonto de la película?
En el artículo, Fowler dice que las “tuberías”, es decir, lo que se entiende que hace el Bus (el enrutado de mensajes) deben ser tontas. La inteligencia debe estar en los servicios (en los endpoints).
Sobre este particular, yo tengo el corazón partío (como diría el poeta). Creo entender las ventajas de hacerlo como dice Martin (que en la práctica prescinde del ESB) pero también entiendo que el uso de una tubería inteligente (el ESB) tiene varias ventajas:
- Los servicios pueden ocuparse únicamente de la lógica de negocio, no de la lógica de integración. Esto da como resultado que los servicios son más sencillos de implementar y de mantener.
- Se supone que los servicios deben ser agnósticos. Es decir, que se pueden reutilizar lo máximo posible en varios contextos (digamos que en varios servicios compuestos a lo largo de la empresa). Si la lógica de integración la hace el propio servicio ¿no serían estos menos reutilizables?
Por otra parte, creo también que el ESB (la tubería inteligente) debería ser lo más simple posible. Cada vez soy más de la opinión que mucha veces usamos unos auténticos monstruos como ESB (me refiero a las suites de los principales fabricantes) cuando en realidad nos sirve con uno mucho más sencillo o con un simple framework de integración (como Spring Integration o Apache Camel).
En definitiva, en mi particular “arquitectura soñada”, yo utilizaría una solución sencilla de integración (como un framework de integración) y no dejaría toda la inteligencia de la integración dentro de los servicios.
Volviendo al artículo de Kai, lo primero que hace mención es precisamente que se ha abusado de la marca “ESB” por parte de los grandes fabricantes y consultoras, convirtiéndolo más en una producto de marketing que tecnológico. Viene de a decir que agotados los anteriores “productos” como el Enterprise Application Integration (EAI) había que inventarse un nuevo concepto para seguir vendiendo. No le falta razón.
Siguiendo con las opiniones del artículo, dice que el ESB no está muerto. Es necesario simplemente por lo mucho que aporta:
- integración
- orquestación
- enrutado
- procesamiento de eventos
- correlación de mensajes
- monitorización de negocio
Tengo que remarcar que el término ESB hay que entenderlo como un patrón de diseño, con muchas implementaciones que podemos usar, más que un producto concreto.
Kai describe 6 desafíos que tienen que afrontar los microservicios. Son conceptos a los que estamos acostumbrados a tratar en SOA, pero que los microservicios ponen en tela de juicio ¿son realmente necesarios? ahí va mi opinión:
Contratos de servicios
El contrato de los servicios es una de las primeras cosas que ya estaban resueltas en los web services SOAP. Tenemos una definición de contrato basado en WSDL que describe perfectamente los parámetros de entrada y salida y las operaciones que hace el servicio en cuestión.
El WSDL por supuesto no es ninguna maravilla y es bastante complejo de entender pero ahí está. Un contrato que puede ser analizado por herramientas de manera automática, que no es ambiguo (hasta cierto punto) y que cumple con su cometido.
Con los servicios REST, los microservicios se suelen hacer así, no tenemos un contrato estándar como el WSDL. Hay algunos intentos como el WADL, pero en la práctica creo que se usa bastante poco.
Ya sé que en teoría un servicio REST se puede autodescribir (ver HATEOAS), pero en la práctica lo que más he visto para la descripción del contrato es el clásico documento de texto con algunos mensajes de ejemplo.
¿Hemos perdido en este caso al pasar de SOAP a REST? yo creo que sí.
Exponer microservicios desde aplicaciones existentes
¿Qué sucede con las aplicaciones ya existentes? sobre todo las implementadas en lenguajes como COBOL o PL/SQL. Estaremos de acuerdo que estos lenguajes o plataformas no son muy amigables respecto a exponer sus lógicas como servicios sobre HTTP.
En teoría un ESB comercial incorpora “conectores” que de manera declarativa, sin programar, pueden exponer una transacción COBOL o un procedimiento PL como servicio. Y digo en teoría porque yo al menos no he visto ningún ESB que funcione bien en este caso. Pero si es así (podríamos implementar un conector ad-hoc), ¿no se justificaría el uso de un ESB para la exposición “automática” de lógicas legacy.
Descubrimiento de servicios
Soy tremendamente escéptico respecto a las bondades de los Registry o Inventario de servicios en runtime que ofrecen los grandes productos. En teoría, en tiempo de ejecución un servicio o aplicación podría preguntar al registry por tal o cual servicio (con unos criterios de selección) y automáticamente devolver un endpoint con el servicio más adecuado. Tampoco he visto nunca esto funcionar, la verdad.
Al final, un registro se reduce en la práctica a una tabla con unos campos para seleccionar en en la consulta y un endpoint como resultado. Nada sofisticado, pero sin embargo necesario para desacoplar el cliente del servicio (como dicen los principios de SOA).
Aquí sí que creo que aporta bastante el concepto de HATEOAS en REST. Es decir, la respuesta de un servicio me da “pistas” en forma de links a otros servicios relacionados. Así por ejemplo, podría partir de un servicio que me devuelva la información de un cliente, y este devolver en el mensaje un link al servicio de consulta de dirección de ese cliente, otro a la consulta de productos contratados, etc. etc. Me parece un concepto tremendamente sencillo y muy potente.
Coordinación entre servicios
También aquí soy un poco incrédulo sobre las herramientas de productividad que dan las suites de integración para la creación de servicios compuestos. Se supone que únicamente con el ratón se pueden hacer maravillas pero mi experiencia es que muchas veces es más fácil hacer esto tirando líneas de código que con la dichosa herramienta.
En fin, que aquí sí que creo que no echaría de menos las herramientas que dan los ESB comerciales. Yo seguiría llamándoles “integraciones” pero quizás las implementaría con un programa normal y corriente y/o con las facilidades que pueden dar los frameworks de integración.
Gestión de despliegues complejos y su escalabilidad
Yo aquí, y al día de hoy, prefiero la visión que proporcionan los microservicios. En lugar de un servidor centralizado (el bus) donde se despliegan las lógicas de integración, me gustaría que estas lógicas estuvieran implementadas de manera desacoplada y que fuese posible su manera desacoplada del resto.
Sólo así podremos lidiar con los despliegues complejos, mejorar la escalabilidad y sobre todo el mantenimiento.
Visibilidad a través de los servicios
Sobre la gestión de eventos en tiempo real, al menos aplicaciones de negocio que suelo ver, no he visto esta necesidad más allá de algunas implementaciones de soluciones de chat.
Sin embargo, creo que tienen mucho potencial por delante a medida de que los “aparatos” y aplicaciones que pueden generar estos eventos incrementen su número por cientos de miles y millones (smartphones, coches, wearables, domótica, etc. etc.)
Conclusión
En definitiva, y como casi en todos los casos donde se afirma que tal o cual cosa en SOA, yo diría más bien que el ESB no estaba muerto, estaba de parranda ;), o lo que es lo mismo, los conceptos que justifican el patrón de Bus siguen estando vigentes y que quizás hemos fallado en el uso de un producto y en su implementación.
26/01/2015 at 14:28
Gracias Andres por el artículo, me ha sorprendido tu comentario sobre el registry, creía que solo a mi me pasaba que nunca he visto funcionar la resolución dinámica de endpoints, en inicios he visto que se pretende implementar pero siempre hubo maneras mas simples de hacerlo, ahora puedo dormir tranquilo!!!, las casas comerciales nos venden cosas que en la práctica no se usan.
26/01/2015 at 17:03
Seguro que hay algún escenario donde se podría utilizar (suponiendo que el producto cumpla lo que promete). Sin embargo, como dices, creo que muchas veces se compran los productos «completos» cuando en realidad lo que usa en la práctica es un 10% del mismo. Peor aún incluso, se incurre en el 100% del gasto de compra y de mantenimiento, y sobre todo, en una sobrecarga de gestión y metodología como si se usara el producto completo cuando realmente se acaba usando un fracción de su funcionalidad.
26/01/2015 at 14:37
Reblogueó esto en Oracle Middleware en españoly comentado:
Buen inicio de semana, estimados lectores, hoy les comparto un gran artículo, con el sabor y elegancia de Andrés Hevia de pensandoensoa.com, disfruten el artículo, el cual nos lleva a contraponer los conceptos de SOA versús el nuevo concepto de microservicios… excellente tema
26/01/2015 at 15:01
Muchas gracias por tus comentarios Ricardo 😉
02/02/2015 at 14:09
ha esta hora tomandome un juan valdez y aprendiendo de tu blog….buen articulo
15/03/2016 at 12:59
Buenas a todos,
muchas gracias por el artículo, y las opiniones que das. Conocer las experiencias y las opiniones de los demás, es un aprendizaje enorme.
En mi opinión, el problema está en las modas, y en las nomenclaturas utilizadas.
Por ejemplo, es normal que al decir Microservicios, piensen automáticamente en REST (ya lo he visto y leído en varios lados), y eso es un gran error.
En mi opinión, y para hablar claro y sin tecnicismos, tanto «Microservicios», como «SOA», debieran ser pensados como «Buenas Prácticas» y/o «Arquitecturas», que ayuden al correcto diseño de una solución. Y al re uso de los activos de un desarrollo.
Tanto REST como SOAP son meros protocolos. Con ambos, como con cualquier otro protocolo, se podrían desarrollar Microservicios, o WebServices.
Sobre este tema de Microservicios, algo que me ayudó mucho a mi, es dejar de pensar en que el producto final es el activo, y hacer que cada una de las piezas que se construyen para dicho producto, es un activo. Es un cambio de paradigma muy grande, y que muy pocas veces he visto en una organización.
El tema con el ESB es similar. Siempre va a haber diferentes opiniones y formas de usarlo.
A mi entender tendría que ser una pieza mas en la infraestructura, que resuelve ciertas problemáticas técnicas, que no tienen que ver con el negocio en sí. Integración, protocolos, seguridad, visibilidad, desacoplamiento, creo son sus principales ventajas.
¿Se puede evitar? claramente si. No lo veo como algo obligatorio, sino que aplica o no, según la envergadura de la organización.
Yo claramente prefiero un producto que funcione de ESB, y me resuelva las integraciones y desacoplamiento (junto con todas sus problemáticas comunes), que un desarrollo ad-hoc.
A primera vista, un programador siempre va a querer desarrollar algo, que resuelva la problemática. Lo ve mas rápido y entendible que un producto de terceros (propietario u open source); pero a largo plazo, tiene un costo de mantenimiento y evolución que pocas veces es pagado.
Por lo que nos queda una solución desactualizada o, en el mejor de los casos, con un equipo enfocado en su evolución; en lugar de estar enfocados en resolver problemáticas del negocio.
En resumen, sobre el tema principal del post, no creo que el ESB muera por los Microservicios. Estos últimos son también servicios, que podría estar siendo expuestos a terceros, a través de un ESB, que resuelve problemas de protocolo, seguridad y desacoplamiento. De hecho, si tengo un ESB disponible, los expondría siempre a través del mismo, y me ahorraría mucho trabajo y tiempo en resolver problemáticas y lógicas técnicas, que quizá de otra forma, estaría incluyendo en cada uno de los servicios.
Espero que mi punto de vista les aporte algo y gracias a todos por los comentarios que dan siempre en estos blogs, que como dije antes, nos ayuda a mejorar día a día.
Saludos!
Javier Paredes
15/03/2016 at 13:07
Un debate muy interesante. Gracias por tu aportación… Y como dices hay mucho de moda en esto…