database - tablas - Microservicios: cómo manejar relaciones de clave externa
llave foranea compuesta sql server (2)
Al distribuir su código para lograr un acoplamiento reducido, desea evitar compartir recursos, y los datos son recursos que desea evitar compartir.
Otro punto es que solo un componente en su sistema posee los datos (para operaciones de cambio de estado), otros componentes pueden LEER pero NO ESCRIBIR, pueden tener copias de los datos o puede compartir un modelo de vista que pueden usar para obtener el estado más reciente de un objeto.
La introducción de la integridad referencial reintroducirá el acoplamiento, en lugar de eso, desea usar algo como Guids para sus claves principales, las creará el creador del objeto, el resto se trata de la gestión de la coherencia final.
Echa un vistazo a la charla de Udi Dahan en NDC Oslo para más detalles.
Espero que esto ayude
La arquitectura de microservicios sugiere que cada servicio debe manejar sus propios datos. Por lo tanto, cualquier servicio (Servicio A) que depende de los datos que son propiedad de otro servicio (servicio B) debe acceder a dichos datos, no mediante llamadas directas a la base de datos, sino a través de la API provista por el segundo servicio (servicio B).
Entonces, ¿qué sugieren las mejores prácticas de microservicios para verificar restricciones de clave externa?
Ejemplo: Estoy desarrollando una función de entrega (microservicio 1) para productos y ciertos productos se pueden entregar solo a ciertas ubicaciones, como se menciona en la tabla de productos, a la que solo se puede acceder con productos de microservicio (mircoservice 2).
¿Cómo me aseguro de que el microservicio 1 (es decir, la función de entrega) no lleve un pedido a una ubicación sin servicio? Tengo esta pregunta porque la función de entrega no puede acceder directamente a la base de datos de productos, por lo que no hay restricciones aplicables a nivel de base de datos cuando se realiza un pedido de entrega en la base de datos de entrega (no es posible verificar si existe una coincidencia de clave externa en la base de datos de productos o mesa).
Es posible utilizar una base de datos compartida para microservicios múltiples. Puede encontrar los patrones para la gestión de datos de microservicios en este enlace: http://microservices.io/patterns/data/database-per-service.html . Por cierto, es un blog muy útil para la arquitectura de microservicios.
En su caso, prefiere utilizar la base de datos por patrón de servicio. Esto hace que los microservicios sean más autónomos. En esta situación, debe duplicar algunos de sus datos entre múltiples microservicios. Puede compartir los datos con llamadas a la API entre microservicios o compartirlos con mensajes asíncronos. Depende de su infraestructura y frecuencia de cambio de los datos. Si no cambia con frecuencia, debe duplicar los datos con eventos asíncronos.
En su ejemplo, el servicio de entrega puede duplicar ubicaciones de entrega e información del producto. Servicio de producto para gestionar los productos y ubicaciones. Luego, los datos requeridos se copian en la base de datos del servicio de entrega con mensajes asíncronos (por ejemplo, puede usar rabbit mq o apache kafka). El servicio de entrega no cambia los datos del producto y de la ubicación, pero los utiliza cuando está haciendo su trabajo. Si la parte de los datos del producto que utiliza el servicio de entrega cambia a menudo, la duplicación de datos con mensajes asíncronos será muy costosa. En este caso, debe hacer llamadas a la API entre el producto y el servicio de entrega. El servicio de entrega solicita al servicio del producto que verifique si un producto se puede entregar a una ubicación específica o no. El servicio de entrega solicita el servicio de Productos con un identificador (nombre, identificación, etc.) de un producto y ubicación. Estos identificadores se pueden tomar del usuario final o se comparten entre microservicios. Debido a que las bases de datos de microservicios son diferentes aquí, no podemos definir claves externas entre los datos de estos microservicios.
Las llamadas de Api pueden ser más fáciles de implementar, pero el costo de la red es mayor en esta opción. Además, sus servicios son menos autónomos cuando está haciendo llamadas a API. Porque, en su ejemplo, cuando el servicio del Producto está inactivo, el servicio de Entrega no puede hacer su trabajo. Si duplica los datos con mensajes asíncronos, los datos necesarios para realizar la entrega se encuentran en la base de datos del microservicio de entrega. Cuando el servicio del Producto no funciona, podrá realizar la entrega.