Actualmente tengo dos microservicios. Los llamaremos A
y B
.
La base de datos bajo microservicio A
tiene la siguiente tabla:
A
|-- users
La base de datos bajo microservicio B
tiene la siguiente tabla:
B
|-- trackers
Los requisitos establecen eso users
y trackers
tienen una relación de muchos a muchos.
No estoy seguro de cómo manejar esto adecuadamente dentro de una arquitectura de microservicios.
Pude ver esto funcionando de tres maneras:
- Se
user_trackers
agrega una tabla al microservicioA
. Esto actúa de forma similar a una tabla de combinación que contiene "claves foráneas" parausers
ytrackers
. - Se
owners
agrega una tabla al microservicioB
. Esta tabla actúa de forma similar a una tabla de unión polimórfica. Esto permitiría a cualquier servicio crear una asociación con un rastreador. Esto puede verse más o menos así:B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id
- Mantenga registros para
users
ytrackers
en cada microservicio. Manténgalos sincronizados con algún tipo de sistema pubsub.
Originalmente iba a ir con la opción 2 porque me gustaba que conservara los límites de las transacciones. Puedo crear un rastreador y asociarlo con algo atómicamente. Sin embargo, parece estar fuera del alcance del microservicio B
. ¿Por qué el microservicio debería B
preocuparse de que el microservicio A
quiera crear una asociación?
Siento que probablemente hay un buen patrón aquí del que no estoy al tanto. ¿Alguna de las opciones que expuse tiene sentido? ¿Hay alguna otra opción que tenga más sentido?
fuente
La respuesta de Zapadlo tiene mucha buena información y razonamiento. Voy a agregar un pequeño consejo práctico aquí que puede facilitar el trabajo a través de sus problemas y los consejos en esa respuesta.
La forma en que ha formulado su pregunta de diseño es en torno a las estructuras de la base de datos y cómo encajar un nuevo requisito para sus estructuras en eso. Esto implica que está construyendo el diseño del servicio a partir de su modelo de datos. Por ejemplo, lo que no veo es cómo se debe acceder o utilizar la relación entre usuarios y rastreadores.
En el diseño de servicios, la estructura de la interfaz es lo más importante del diseño. De hecho, la implementación es casi irrelevante en comparación, particularmente en el caso de los microservicios. La razón es que una vez que establezca su servicio, todas las dependencias de su servicio deberían existir solo en la interfaz. Si lo hace bien, debería poder reescribir completamente la implementación sin ningún consumidor. Y ese es el principal beneficio de la autonomía. A nadie le importa cómo lo construiste. Solo lo necesitan para funcionar de la manera en que lo comunicaste.
Antes de que alguien pueda determinar cómo se ve esto en la base de datos o dónde quiere esto, realmente necesita explicar cómo se usará esta información. ¿Es esto algo que se expondrá a través de un servicio o es algún tipo de datos que desea mezclar para el análisis?
En una nota al margen, evitaría las dependencias bidireccionales a casi todos los costos. Si tiene dependencias, realmente quiere que solo un lado sepa sobre el otro. Una vez que las dependencias están en ambas direcciones, los servicios se convierten esencialmente en una unidad atómica.
fuente
Mucho de esto se reduce al dominio mismo. Si un usuario con cero rastreadores no tiene sentido, entonces el servicio de usuario necesita saber sobre rastreadores. Si un rastreador debe tener un usuario, entonces los rastreadores deben saber sobre los usuarios. Si algo como tener un rastreador con múltiples propietarios o poder transferir un rastreador de un usuario a otro tiene sentido, entonces tal vez esta información pertenezca a otro servicio.
fuente
Pregunta: ¿Por qué se separan sus datos en tablas de datos?
Me inclinaría por la opción 3: los servicios están totalmente separados y pueden responder las preguntas respectivas que puedan necesitar responder. Además, son mucho más resistentes. Pero tenga cuidado, sus servicios podrían desincronizarse si pierden eventos, pero eso se puede resolver a través de la consistencia eventual.
Además, podría considerar fusionar ambos servicios: si ambos no pueden responder sin conocerse, simplemente los fusionaría, ya que probablemente sean parte de un solo dominio.
fuente