Estoy diseñando una aplicación usando Micro-Servicios y no estoy seguro del mejor mecanismo para recolectar datos de múltiples servicios.
Creo que hay dos opciones:
- Integre un mecanismo de comunicación 'entre servicios' que permita que los servicios hablen directamente. API Gateway llamaría a un servicio individual, que luego llama a otros servicios para recopilar datos, antes de devolver la respuesta consolidada a API Gateway. La API luego devuelve la respuesta a la persona que llama. (Esto tendría que ser llamadas síncronas cuando la llamada al servicio B requiere la respuesta del servicio A. IE Separate Person and Address Services).
- Haga que API Gateway llame a cada servicio directamente y consolide los datos dentro de la API antes de devolver la respuesta.
Me estoy inclinando hacia la segunda opción, ya que hacer que los servicios se comuniquen entre sí introduciría el acoplamiento, en cuyo caso también podría diseñar una aplicación monolítica. Sin embargo, hay algunas desventajas serias que puedo pensar fuera de mi cabeza con esta opción:
Hacer que la API ejecute varias llamadas a múltiples servicios aumenta la carga en el servidor de la API, especialmente cuando algunas de esas llamadas se están bloqueando.
Este método significaría que la API debe ser "consciente" de lo que la aplicación está tratando de hacer (IE Logic tendría que programarse en la API para manejar las llamadas de los servicios, y luego consolidar los datos), en lugar de simplemente actuar como un "punto final" tonto para los microservicios.
Me gustaría saber cuál es el enfoque estándar para este problema y si hay otra tercera opción que me falta.
fuente
Respuestas:
En general, aconsejaría que los microservicios no se comuniquen sincrónicamente, el gran problema es el acoplamiento, significa que los servicios ahora están acoplados entre sí, si uno de ellos falla, el segundo ahora es total o parcialmente disfuncional.
Yo haría una distinción clara entre las operaciones de cambio de estado y las operaciones de lectura ( Separación de consulta de comando CQS ). Para las operaciones de cambio de estado, usaría algún tipo de infraestructura de mensajería e iría a disparar y olvidar. Para consultas, usaría la comunicación de respuesta de solicitud síncrona y podría usar una API http o simplemente ir directamente a su almacén de datos.
Si está utilizando la mensajería, también puede mirar la suscripción de publicación para generar eventos entre servicios.
Otro punto a considerar es el intercambio de datos (transaccionales) (en oposición a las vistas de solo lectura) si expone su estado interno, el lector podría obtener el estado incorrecto de sus datos o la versión incorrecta, y también podría bloquear sus datos.
Por último, pero no menos importante, intente hacer todo lo posible para mantener sus servicios autónomos (al menos a nivel lógico).
Espero que esto tenga sentido.
fuente
Depende de por qué necesita esos datos. Si es por UI, está perfectamente bien. Además, es como debería ser. Chris Richardson tiene una buena explicación de ese concepto , y Sam Newman tiene un gran artículo sobre un concepto muy similar llamado Backends for Frontends .
Pero si lo necesita para algo de lógica, es probable que los límites de servicio sean incorrectos.
Hay varias características que el sentido común nos dice que nuestros servicios deberían poseer . Son:
Para lograr esto, trate los límites de su servicio como capacidades comerciales . Un proceso formal de identificación de límites de servicio se ve así:
Un ejemplo de aplicación de este enfoque podría ser de algún interés.
fuente
Me inclinaría hacia el segundo enfoque también de forma predeterminada, aunque tal vez no en su "puerta de enlace API", pero consideraría completamente razonable crear un nuevo microservicio cuyo único propósito era organizar las solicitudes a otros microservicios y representar los datos en un formulario de nivel superior. En una arquitectura de microservicios, me inclinaría a que los microservicios "base" se comuniquen directamente entre sí.
Para hacer esto un poco menos subjetivo, digamos que un servicio depende de otro si el primero requiere datos o servicios del segundo, directa o indirectamente . En términos matemáticos, queremos que esta relación sea un orden parcial y no un pedido anticipado . En forma de diagrama, si trazó su diagrama de dependencia, debería obtener un diagrama de Hassey no tener ningún ciclo (dirigido). (En un diagrama de Hasse, los bordes se dirigen implícitamente de menor a mayor). Como guía adicional, desea que las rutas de arriba a abajo sean generalmente más cortas. Esto significa que desea depender más directamente de las cosas de forma predeterminada. Las razones son que esto minimiza la cantidad de cosas que pueden salir mal para cualquier solicitud en particular, minimiza los gastos generales y reduce la complejidad. Entonces, en el caso "ideal" de esta métrica, el diagrama de Hasse tendría solo dos niveles. Por supuesto, hay muchas razones por las que es posible que desee introducir servicios intermedios como el almacenamiento en caché, la consolidación, el equilibrio de carga, la gestión de fallas.
Para profundizar en su segunda preocupación de que la API Gateway sea "inteligente", un patrón que está ganando terreno ahora con marcos como Falcor y Relay / GraphQL es hacer solicitudes más especificaciones de qué hacer para que la "API Gateway" pueda genéricamente ejecutar esas especificaciones sin tener que saber qué
GetTimeline
implica. En cambio, recibiría una solicitud como "solicitar esta información de usuario del servicio de usuario y obtener estas publicaciones del servicio de correos" o lo que sea.fuente
Sospecho que su necesidad de servicios para "llamarse" entre sí indica que está procediendo con un sistema que no ha sido bien diseñado, ya que esta necesidad de microservicios para "llamarse" entre sí es una forma de acoplamiento que rara vez aparece cuando Los microservicios están diseñados adecuadamente.
¿Puede explicar más sobre el problema que está tratando de resolver? ¿En inglés simple?
fuente