¿Cómo maneja los conceptos compartidos en una arquitectura de microservicios?
40
Estoy investigando patrones arquitectónicos para una aplicación que estoy desarrollando y un enfoque de microservicio parece una buena opción, pero no estoy seguro de cómo manejar las interacciones entre los servicios.
La aplicación trata principalmente con usuarios, perfiles propiedad de usuarios, fotos y etiquetas que representan uno o varios perfiles en una foto. Posiblemente habría métodos para devolver fotos cargadas por un usuario, devolver fotos que contengan un determinado perfil etiquetado, etc.
Este es mi primer intento de diseñar una arquitectura basada en microservicios y vengo de una historia inspirada en un modelo de dominio monolítico . En ese mundo, los controladores unirían estos objetos de dominio, pero tengo problemas para entender cómo funcionaría esto en un microservicio.
Por lo general, los servicios llaman a otros servicios cuando necesitan acceder a sus datos. Cada pieza de datos debe pertenecer a un servicio en particular, que será el único punto de entrada para acceder a estos datos y modificarlos. Algunos servicios serán simples y generalmente se corresponden estrechamente con su modelo de dominio (por ejemplo, un servicio para el manejo de usuarios), mientras que otros serán de alto nivel y utilizarán datos de otros servicios (por ejemplo, mostrar una lista de fotos junto con información sobre los usuarios que los cargaron). )
En su caso de uso, debe comenzar desde afuera y pensar qué operaciones desea poner a disposición de su usuario a través de una API (si es un servicio de fondo) o qué operaciones deberían estar disponibles en la GUI si es una aplicación web. Tenga en cuenta que la parte de la GUI a menudo es una aplicación normal con sus propios controladores: las operaciones se pueden llamar a través de REST (como en AngularJS), pero estos puntos finales están diseñados solo para el uso de la aplicación GUI y no son microservicios en el sentido común.
Supongamos que desea mostrar fotos junto con información sobre los cargadores. Podría tener un servicio de usuario que devuelva información sobre un usuario dada la identificación del usuario y un servicio de fotografía que puede enumerar fotos (por ejemplo, mediante la búsqueda de algunos criterios). La lista de fotos contendría para cada foto el ID del usuario que está cargando. De esta forma, estos dos servicios no están acoplados: el servicio de fotografía solo conoce las ID de los usuarios, pero nada sobre los datos de los usuarios. Además de estos dos servicios, puede crear un tercer servicio con una operación como "enumerar fotos con información sobre los cargadores" que llamaría a los otros dos servicios y combinaría los datos que devuelven. Alternativamente, esta operación podría ser realizada por su aplicación web en lugar de un servicio.
Esto me ayudó mucho. Comencé escribiendo un par de casos de uso de UI que ejercitarían la pila y todo en su mayoría encajó.
anjunatl
1
En este ejemplo particular, se supone que debemos hacer, por ejemplo. ¿10 llamadas al servicio de usuario para obtener datos de usuario si tenemos 10 fotos en nuestra lista? ¿No agregaría muchos gastos generales?
Ricardo Souza
1
@rcdmk Puede agregar un punto final REST que obtenga una lista de ID múltiples como entrada y devuelva múltiples fotos como salida. Esto a menudo se hace en la práctica por razones de rendimiento. A veces, el diseño de API es un compromiso entre la pureza y las consideraciones prácticas.
Michał Kosmulski el
@ MichałKosmulski Tengo que comenzar la discusión, pero el diseño de StackExchange los desalienta :) Lo que no me gusta del enfoque de microservicio en este ejemplo en particular es que la consulta directa a la base de datos subyacente (donde se almacenan los usuarios y las imágenes) podría ser mucho más eficiente. Imagine si estos servicios ascendentes dependen de otros servicios ascendentes, etc. La consulta directa al almacén de datos es mucho más segura. solo mis 5 centavos, nada más. Una vez más me gustaría mucho tener una discusión productiva sobre el tema, pero StackExachange no es buen lugar para eso (se puede recomendar microservicios foros de discusión?)
ajukraine
@ajukraine Creo que hay chats en stackexchange que pueden ser un buen lugar para las discusiones. En cuanto al rendimiento: 1. Los microservicios tienen un costo de rendimiento, y 2. Los microservicios son buenos para algunas situaciones pero no para otras. En cuanto a las dependencias: en las archotecturas de microservicios a menudo haces copias locales de datos y utilizas mensajes asíncronos para reducir la cantidad de dependencias. Es un cambio de arquitectura real, no solo cambiar automáticamente cada módulo de una aplicación a una aplicación separada.
Michał Kosmulski el
4
La aplicación trata principalmente con usuarios, perfiles propiedad de usuarios, fotos y etiquetas que representan uno o varios perfiles en una foto. Posiblemente habría métodos para devolver fotos cargadas por un usuario, devolver fotos que contengan un determinado perfil etiquetado, etc.
Bueno, el servicio de perfil no debería funcionar con el objeto de usuario. Es posible que solo conozca la ID del usuario para el que se le pide que devuelva datos, no más. De esta manera, no necesitará interacción entre el servicio de usuario y el servicio de perfil.
Si eso no responde a su pregunta, ¿podría aclararlo describiendo la situación exacta con la que está lidiando?
Esto y la respuesta de Michal me ayudaron a entenderlo, pero su sugerencia me ayudó a planificar los servicios que necesitaba. Estaba atrapado en una mentalidad de necesidad de representar un objeto completo en lugar de solo una referencia al objeto (objeto de usuario vs ID de usuario). Muy apreciado, gracias!
Bueno, el servicio de perfil no debería funcionar con el objeto de usuario. Es posible que solo conozca la ID del usuario para el que se le pide que devuelva datos, no más. De esta manera, no necesitará interacción entre el servicio de usuario y el servicio de perfil.
Si eso no responde a su pregunta, ¿podría aclararlo describiendo la situación exacta con la que está lidiando?
fuente