Orquestación de microservicios


¿Cuál es el patrón estándar de orquestación de microservicios?

Si un microservicio solo conoce su propio dominio, pero hay un flujo de datos que requiere que múltiples servicios interactúen de alguna manera, ¿cuál es la forma de hacerlo?

Digamos que tenemos algo como esto:

  • Facturación
  • Envío

Y por el bien del argumento, digamos que una vez que se ha enviado un pedido, se debe crear la factura.

En algún lugar, alguien presiona un botón en una interfaz gráfica de usuario ,"He terminado, vamos a hacer esto!" En una arquitectura de servicio monolith clásica, diría que hay un ESB manejando esto, o el servicio de envío tiene conocimiento del servicio de factura y simplemente lo llama.

Pero, ¿cuál es la forma en que la gente lidia con esto en este nuevo mundo de microservicios?

Entiendo que esto podría considerarse altamente basado en la opinión. pero hay un lado concreto, ya que los microservicios no se suponen para hacer lo anterior. Así que tiene que haber un "qué debería hacer por definición en su lugar", que no se basa en la opinión.

Dispara.
Author: Paulo Merson, 2015-03-18

7 answers

El Libro Building Microservices describe en detalle los estilos mencionados por @RogerAlsing en su respuesta.

En la página 43 bajo Orquestación vs Coreografía el libro dice:

A medida que comenzamos a modelar la lógica más y más compleja, tenemos que lidiar con el problema de la gestión de los procesos de negocio que se extienden a través de la límite de los servicios individuales. Y con microservicios, vamos a golpear este límite antes de lo habitual. [...] When it comes to actually implementando este flujo, hay dos estilos de arquitectura que podríamos seguir. Con la orquestación, dependemos de un cerebro central para guiar y conducir el proceso, al igual que el director de una orquesta. Con coreografía, informamos a cada parte del sistema de su trabajo, y lo dejamos resolver los detalles, como bailarines que encuentran su camino y reaccionando a otros a su alrededor en un ballet.

El libro entonces procede a explicar los dos estilos. El estilo de orquestación corresponde más a la idea SOA de orchestration/task services, mientras que el estilo coreográfico corresponde a los dumb pipes y smart endpoints mencionados en el artículo de Martin Fowler.

Estilo de orquestación

Bajo este estilo, el libro anterior menciona:

Pensemos en cómo se vería una solución de orquestación este flujo. Aquí, probablemente lo más simple sería tener nuestro servicio al cliente actúa como el cerebro central. En creación, habla al banco de puntos de fidelidad, servicio de correo electrónico y servicio postal [...], a través de una serie de llamadas de solicitud / respuesta. El el servicio al cliente en sí puede rastrear dónde se encuentra un cliente en este proceso. Se puede comprobar para ver si la cuenta del cliente se ha establecido arriba, o el correo electrónico enviado, o el correo entregado. Tenemos que tomar el diagrama de flujo [...] y modélalo directamente en código. Incluso podríamos usar herramientas que implementa esto para nosotros, tal vez utilizando un adecuado motor de reglas. Existen herramientas comerciales para este propósito en la forma de software de modelado de procesos de negocio. Suponiendo que usemos síncronos solicitud / respuesta, incluso podríamos saber si cada etapa ha funcionado [...] La desventaja de este enfoque de orquestación es que el cliente el servicio puede convertirse en una autoridad de gobierno central. Puede convertirse en el centro en medio de una red, y un punto central donde la lógica empieza a vivir. He visto que este enfoque resulta en un pequeño número de smart "dios" servicios diciéndole a los servicios basados en CRUD anémicos qué hacer.

Nota: Supongo que cuando el autor menciona herramientas se está refiriendo a algo como BPM (por ejemplo, Actividad, ODA Apache, Camunda ). De hecho, el Sitio web de Patrones de flujo de trabajo tiene un impresionante conjunto de patrones para hacer este tipo de orquestación y también ofrece detalles de evaluación de diferentes herramientas de proveedores que ayudan a implementarlo de esta manera. No creo que el autor implica que se requiere el uso de una de estas herramientas para implementar este estilo de integración, aunque se podrían usar otros marcos de orquestación livianos, por ejemplo, Spring Integration, Apache Camel o Mule ESB

Sin embargo, otros libros que he leído sobre el tema de los Microservicios y en general la mayoría de los artículos que he encontrado en la web parecen desaprovechar este enfoque de orquestación y en su lugar sugerir el uso de la siguiente una.

Estilo de Coreografía

Bajo el estilo coreográfico el autor dice:

Con un enfoque coreografiado, podríamos tener al cliente servicio emitir un evento de una manera asincrónica, diciendo Cliente crear. El servicio de correo electrónico, el servicio postal y el banco de puntos de fidelidad entonces solo suscríbase a estos eventos y reaccione en consecuencia [...] Este enfoque está significativamente más disociado. Si algunos otro servicio necesario para llegar a la creación de un cliente, simplemente necesita suscribirse a los eventos y hacer su trabajo cuando sea necesario. El la desventaja es que la visión explícita del proceso de negocio que vemos en [el flujo de trabajo] ahora solo se refleja implícitamente en nuestro sistema [...] Esto significa que se necesita trabajo adicional para garantizar que pueda monitorear y rastrear que las cosas correctas han sucedido. Por ejemplo, ¿podrías saber si el banco de puntos de fidelidad tenía un error y por alguna razón no configurar la cuenta correcta? Un enfoque que me gusta lidiando con esto es construir un sistema de monitoreo que coincida explícitamente con la vista de el proceso de negocio en [el flujo de trabajo], pero luego rastrea lo que cada uno de los servicios hace como entidades independientes, lo que le permite ver impar excepciones asignadas al flujo de proceso más explícito. El [diagrama de flujo] [...] isn't the driving force, but just one lens through que podemos ver cómo se está comportando el sistema. En general, he encontrado que los sistemas que tienden más hacia el enfoque coreografiado son mas acoplados libremente, y son más flexibles y susceptibles de cambio. Lo haces necesidad de hacer trabajo adicional para monitorear y rastrear los procesos en todo el sistema límites, sin embargo. He encontrado más fuertemente orquestado las implementaciones deben ser extremadamente frágiles, con un mayor costo de cambio. Con eso en mente, prefiero apuntar a una coreografía sistema, donde cada servicio es lo suficientemente inteligente como para comprender su papel en todo el baile.

Nota: Hasta el día de hoy todavía no estoy seguro si coreografía es solo otro nombre paraarquitectura impulsada por eventos (EDA), pero si EDA es solo una forma de hacerlo, ¿cuáles son las otras formas? (Véase también ¿Qué quiere decir con "Impulsado por eventos"? y Los Significados de la Arquitectura Impulsada por Eventos). También parece que cosas como CQRS y EvenSourcing resuenan mucho con este estilo arquitectónico, ¿verdad?

Ahora, después de esto viene la diversión. El libro de microservicios no asume que los microservicios se implementarán con RESTO. De hecho, en la siguiente sección del libro se procede a considerar las soluciones basadas en RPC y SOA y, finalmente, DESCANSAR. El punto importante aquí es que los microservicios no implican DESCANSO.

Entonces, ¿Qué Hay De HATEOAS?

Ahora, si queremos seguir el enfoque RESTful, no podemos ignorar a HATEOAS o a Roy Fielding le complacerá mucho decir en su blog que nuestra solución no es realmente DESCANSAR. Ver su entrada de blog en REST API Debe ser Hipertexto Impulsado:

Me estoy frustrando por el número de personas que llaman a cualquier basado en HTTP interfaz de una API REST. Lo que hay que hacer para hacer el RESTO estilo arquitectónico claro en la noción de que el hipertexto es un restricción? En otras palabras, si el motor del estado de aplicación (y por lo tanto, la API) no está siendo impulsada por hipertexto, entonces no puede ser RESTful y no puede ser una API REST. Periodo. ¿Hay algún manual roto ¿algún lugar que necesite ser arreglado?

Así, como puedes ver, Fielding piensa que sin HATEOAS no estás realmente construyendo aplicaciones RESTful. Para fielding HATEOAS es el camino a seguir cuando se trata de orquestar servicios. Estoy aprendiendo todo esto, pero para mí HATEOAS no define claramente quién o qué es la fuerza impulsora detrás de seguir realmente los enlaces. En una interfaz de usuario que podría ser el usuario, pero en las interacciones de computadora a computadora, supongo que necesita ser hecho por un servicio de nivel superior.

Según HATEOAS, el único enlace el consumidor de API realmente necesita saber es el que inicia la comunicación con el servidor (por ejemplo, POST /order). A partir de este punto, REST va a conducir el flujo, porque en la respuesta de este punto final, el recurso devuelto contendrá los enlaces a los siguientes estados posibles. A continuación, el consumidor de la API decide qué enlace seguir y mueve la aplicación al siguiente estado.

A pesar de lo genial que suena, el cliente todavía necesita saber si el enlace debe ser publicado, PUTed, GETed, Parcheado, etc. Y el cliente todavía tiene que decidir qué carga útil pasar. El cliente todavía tiene que ser consciente de qué hacer si eso falla (reintentar, compensar, cancelar, etc.).

Soy bastante nuevo en todo esto, pero para mí, desde la perspectiva de HATEOAs, este cliente o consumidor API es un servicio de alto pedido. Si lo pensamos desde la perspectiva de un humano, podemos imaginar a un usuario final en una página web, decidiendo qué enlaces seguir, pero aún así el programador de la página web tuvo que decidir qué método usar para invocar los enlaces, y qué carga útil pasar. Así que, para mi punto, en una interacción de computadora a computadora, la computadora toma el papel del usuario final. Una vez más esto es lo que llamamos un servicio de orquestaciones.

Supongo que podemos usar HATEOAS con orquestación o coreografía.

El patrón API Gateway

Otro patrón interesante es sugerido por Chris Richardson quien también propuso lo que él llamó un Patrón de Puerta de enlace API .

En una arquitectura monolítica, clientes de la aplicación, como web navegadores y aplicaciones nativas, realizar solicitudes HTTP a través de una carga balanceador a una de N instancias idénticas de la aplicación. Pero en un arquitectura de microservicios, el monolito ha sido reemplazado por un recogida de servicios. En consecuencia, una pregunta clave que debemos responder ¿con qué interactúan los clientes?

Un cliente de aplicación, como una aplicación móvil nativa, podría hacer Peticiones HTTP RESTful a los servicios individuales [...] En la superficie esto puede parecer atractivo. Sin embargo, es probable que haya un desajuste significativo en granularidad entre las API del individuo servicios y datos requeridos por los clientes. Por ejemplo, mostrando uno la página web podría requerir llamadas a un gran número de servicios. Amazon.com, por ejemplo, describe cómo algunos las páginas requieren llamadas a más de 100 servicios. Hacer que muchas solicitudes, incluso a través de internet de alta velocidad conexión, y mucho menos un ancho de banda más bajo, red móvil de mayor latencia, sería muy ineficiente y resultaría en una mala experiencia de usuario.

Un enfoque mucho mejor es que los clientes hagan un pequeño número de solicitudes por página, tal vez tan pocas como una, a través de Internet a un servidor front-end conocido como API gateway.

La API gateway se encuentra entre los clientes de la aplicación y el microservicios. Proporciona API que se adaptan al cliente. El Puerta de enlace de API proporciona una API de grano grueso a los clientes móviles y un API más fina para clientes de escritorio que utilizan un alto rendimiento red. En este ejemplo, los clientes de escritorio realizan varias solicitudes para recuperar información sobre un producto, donde como cliente móvil hace una sola solicitud.

La puerta de enlace de API maneja las solicitudes entrantes realizando solicitudes a algunos número de microservicios en la LAN de alto rendimiento. Netflix, para ejemplo, describe cómo cada solicitud ventiladores hacia fuera a en promedio seis servicios de backend. En este por ejemplo, las solicitudes detalladas de un cliente de escritorio son simplemente el servicio correspondiente, mientras que cada uno de grano grueso la solicitud de un cliente móvil se maneja agregando los resultados de llamando a múltiples servicios.

La API gateway no solo optimiza la comunicación entre los clientes y la aplicación, pero también encapsula los detalles de la microservicios. Esto permite que los microservicios evolucionen sin impactando a los clientes. Por ejemplo, dos microservicios podrían ser fusionar. Otro microservicio puede particionarse en dos o más Servicio. Solo la puerta de enlace de API debe actualizarse para reflejar estos cambio. Los clientes no se ven afectados.

Ahora que hemos visto cómo la puerta de enlace de API media entre el aplicación y sus clientes, veamos ahora cómo implementar comunicación entre microservicios.

Esto suena bastante similar a la el estilo de orquestación mencionado anteriormente, solo que con una intención ligeramente diferente, en este caso parece ser todo sobre la interpretación y la simplificación de las interacciones.

Otras lecturas

Hay una gran serie de artículos publicados recientemente en el Blog NGINX que recomiendo para profundizar en todos estos conceptos:

 220
Author: Edwin Dalorzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-10 00:30:07

Tratando de agregar los diferentes enfoques.

Eventos de dominio

El enfoque dominante para esto parece ser el uso de eventos de dominio, donde cada servicio publica eventos con respecto a lo que ha sucedido y otros servicios pueden suscribirse a esos eventos. Esto parece ir de la mano con el concepto de smart endpoints, dumb pipes que describe Martin Fowler aquí: http://martinfowler.com/articles/microservices.html#SmartEndpointsAndDumbPipes

Eventos de dominio

Proxy

Otra distribución que parece común es envolver el flujo de negocio en su propio servicio. Donde el proxy organiza la interacción entre los microservicios como se muestra en la siguiente imagen:

Proxy.

 22
Author: Roger Johansson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-20 08:57:50

Así que tienes dos servicios:

  1. Microservicio de factura
  2. Envío micro servicio

En la vida real, tendrías algo donde mantengas el estado de orden. Llamémoslo servicio de pedidos. A continuación tienes casos de uso de procesamiento de pedidos, que saben qué hacer cuando el pedido pasa de un estado a otro. Todos estos servicios contienen un cierto conjunto de datos, y ahora se necesita algo más, que hace toda la coordinación. Esto podría ser:

  • A interfaz gráfica simple que conoce todos sus servicios e implementa los casos de uso ("Estoy listo" llama al servicio de envío)
  • Un motor de procesos de negocio, que espera un evento "Estoy listo". Este motor implementa los casos de uso y el flujo.
  • Un microservicio de orquestación, digamos que el servicio de procesamiento de pedidos en sí que conoce el flujo/los casos de uso de su dominio
  • Cualquier otra cosa en la que aún no haya pensado

El punto principal con esto es que el control es externo. Este se debe a que todos los componentes de su aplicación son bloques de construcción individuales, acoplados libremente. Si sus casos de uso cambian, debe modificar un componente en un solo lugar, que es el componente de orquestación. Si agrega un flujo de orden diferente, puede agregar fácilmente otro orquestador que no interfiera con el primero. El pensamiento del servicio micro no es solo acerca de la escalabilidad y hacer API REST de lujo, sino también acerca de una estructura clara, dependencias reducidas entre componentes y reutilización de comunes datos y funcionalidades que se comparten en toda su empresa.

HTH, Mark

 4
Author: mp911de,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-20 07:13:52

Entonces, ¿en qué se diferencia la orquestación de microservicios de la orquestación de antiguos servicios SOA que no son "micro"? No mucho en absoluto.

Los microservicios generalmente se comunican usando http (REST) o messaging/events. La orquestación a menudo se asocia con plataformas de orquestación que le permiten crear una interacción con scripts entre los servicios para automatizar los flujos de trabajo. En los viejos días de SOA, estas plataformas usaban WS-BPEL. Las herramientas de hoy no usan BPEL. Ejemplos de productos modernos de orquestación: Netflix Conductor, Camunda, Zeebe, Azure Logic Apps, Baker.

Tenga en cuenta que la orquestación es un patrón compuesto que ofrece varias capacidades para crear composiciones complejas de servicios. Los microservicios son vistos más a menudo como servicios que no deben participar en composiciones complejas y más bien ser más autónomos.

Puedo ver que se invoca un microservicio en un flujo de trabajo orquestado para realizar un procesamiento simple, pero no veo que un microservicio sea el orquestador servicio, que a menudo utiliza mecanismos como transacciones de compensación y repositorio de estado (deshidratación).

 4
Author: Paulo Merson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-28 22:16:00

Si el Estado necesita ser administrado, entonces el Aprovisionamiento de Eventos con CQRS es la forma ideal de comunicación. De lo contrario, se puede utilizar un sistema de mensajería asíncrona (AMQP) para la comunicación entre microservicios.

De su pregunta, está claro que el ES con CQRS debe ser la mezcla correcta. Si está usando Java, eche un vistazo a Axon framework. O cree una solución personalizada usando Kafka o RabbitMQ.

 1
Author: Rajeesh Koroth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 06:25:41

La respuesta a la pregunta original es SAGA pattern.

 1
Author: Harold Vera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-06 01:44:28

He escrito algunos mensajes sobre este tema:

Tal vez estos mensajes también pueden ayudar:

API Gateway pattern-Course-grained api vs fine-grained api

Https://www.linkedin.com/pulse/api-gateway-pattern-ronen-hamias / https://www.linkedin.com/pulse/successfulapi-ronen-hamias /

API de servicio de grano grueso vs grano fino

Por definición, una operación de servicio de grano grueso tiene un alcance más amplio que un servicio de grano fino, aunque los términos son relativos. mayor complejidad de diseño de grano grueso, pero puede reducir el número de llamadas necesarias para completar una tarea. en la arquitectura de microservicios, el grano grueso puede residir en la capa de puerta de enlace de API y orquestar varios microservicios para completar la operación comercial específica. las API de grano grueso deben diseñarse cuidadosamente para que involucren varios microservicios que la administración de diferentes dominios de experiencia tiene un riesgo de mezclar: preocupaciones en una sola API y romper las reglas descritas arriba. las API de grano grueso pueden sugerir un nuevo nivel de granularidad para las funciones empresariales que no existen de otra manera. por ejemplo, hire employee puede implicar dos llamadas de microservicios al sistema de recursos humanos para crear el ID de empleado y otra llamada al sistema LDAP para crear una cuenta de usuario. alternativamente, el cliente puede haber realizado dos llamadas a la API de grano fino para lograr la misma tarea. mientras que la API de grano grueso representa el caso de uso empresarial crear cuenta de usuario, la API de grano fino representa las capacidades involucradas en tales tarea. una API de grano más fino puede involucrar diferentes tecnologías y protocolos de comunicación, mientras que una API de grano grueso los abstrae en un flujo unificado. al diseñar un sistema considere tanto como de nuevo no hay un enfoque dorado que resuelva todo y hay trad-off para cada uno. De grano grueso son particularmente adecuados como servicios para ser consumidos en otros contextos de negocios, como otras aplicaciones, línea de negocio o incluso por otras organizaciones a través de los propios límites de la Empresa (típico Escenarios B2B).

 -1
Author: ronen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-23 07:33:41