Actualmente estoy trabajando en un proyecto en el que usamos arquitectura de microservicio. También soy algo nuevo en esta arquitectura y he tenido algunas preocupaciones. Entiendo el concepto de microservicios en general y también cómo podemos tener una base de datos por servicio. Esto me lleva a un punto en el que me confundo sobre cómo extraer datos de diferentes bases de datos para un usuario en particular.
Escenario Suponiendo que tengo un servicio de Users y Posts con su esquema como este
Usuario
const schema = { name: String id: String ... }Correo
const schema = { text: String user: Id // reference of the user who made this post. } Ahora en la interfaz de usuario, quiero cargar un conjunto de publicaciones y los usuarios asociados que realizaron la publicación, ¿cómo obtengo una Post junto con el User que realizó la publicación respectiva? Estoy usando MongoDB, ¿cómo completo los datos que están almacenados en otras bases de datos? También estoy usando operaciones asincrónicas de manejo de Kafka, ¿cómo aprovecho Kafka para este caso de uso? ¿O hay una manera mucho mejor de hacer esto? La respuesta final de un Post podría ser algo como esto.
{ text: 'Some random message', user: { name: 'John Doe', id: 1234 } } Además, sé que podría hacer una llamada al servicio de User para obtener el usuario, luego hacer una llamada al servicio de publicación para obtener la publicación y fusionar ambos objetos, pero ¿hay una opción mucho mejor que esta básicamente? Estoy pensando en los casos en los que quiero realizar búsquedas múltiples para un usuario, por ejemplo, para obtener un usuario y sus publicaciones, mensajes, etc. asociados, ¿cómo puedo manejar escenarios como este? ¿Hay alguna técnica que pueda aprovechar para situaciones como esta?
¡Gracias de antemano!
Creo que su problema es que los límites del servicio son demasiado granulares. Recomendaría alinear sus servicios a contextos acotados ( https://martinfowler.com/bliki/BoundedContext.html ). Por ejemplo, si tiene un servicio de "blog" con publicaciones y usuarios, está bien que el servicio de blog contenga una base de datos mongo y relacional para los diferentes modelos.
Luego le pides al servicio "dame publicaciones para un usuario" y se encarga de combinar esos datos como parte de su lógica.
Si DEBE mantenerlos separados (lo cual no recomendaría para el problema exacto que tiene), entonces mantendría un caché liviano de nombres de usuario dentro del servicio de publicaciones.
Úselo para completar los nombres de usuario en la publicación cuando devuelva uno. Puede actualizar el caché de forma regular mediante eventos, sondeos, lotes. O simplemente consulte el servicio de usuario en un error de caché.
Cuando se trata de sistemas distribuidos, no puede confiar en la consistencia y la comunicación estable y síncrona como puede hacerlo en un monolito.