Nous sommes en train de migrer une application monolithique vers une architecture de microservices. En raison de certaines exigences réglementaires, nous devons conserver les données des clients de différents pays dans des bases de données distinctes (spécifiques au pays). C'est à dire db US pour les clients US, UK db pour les clients UK ...
Les conceptions suivantes que nous envisageons sont les suivantes:
Option 1: une application multi-locataire avec une prise en charge multi-locataire en hibernation qui peut être adaptée à N nombre de fois en fonction de la demande (pensez aux pods kubernetes). Une seule instance de cette application pourra se connecter à toutes les bases de données.
Option 2: déployer 1 instance de microservice par base de données de pays. Avec une passerelle API devant eux acheminant le trafic
Si vous deviez concevoir ce type de système, quels seraient vos choix?
la source
Réponses:
Je pense que l'option 2 n'est pas mauvaise, mais peut-être pas nécessaire. Les micro-services vous permettent de répondre aux besoins de plusieurs applications.
Un grand facteur ici est de savoir s'il y a une différence entre les deux schémas et s'il y en aura un à l'avenir.
Habituellement, je pense que l'utilisation d'interfaces pour les référentiels n'est pas nécessaire; cependant, cela pourrait valoir la peine dans ce cas. Les usines de dépôt seront importantes pour vous.
Mon problème avec l'option 1 est qu'elle est trop spécifique. Vous devriez pouvoir passer de la configuration que vous avez décrite à deux instances distinctes pointant chacune vers sa propre base de données facilement. L'application ne doit PAS S'INSCRIRE OERE ELLE OBTIENT SES DONNÉES.
Bien que le schéma ne diffère pas pour vos deux bases de données différentes, vous pouvez avoir un référentiel facilement gérer les deux, sans que l'application ne sache la différence:
Si les schémas de base de données deviennent jamais disparates entre les États-Unis et le Royaume-Uni, vous diviserez alors la fonctionnalité en deux référentiels complètement différents. Ce serait facile, car il vous suffirait de changer d’usine.
la source
J'irais avec la deuxième option, elle donne moins de friction dans le développement et le déploiement.
Cela permettra une meilleure évolutivité et disponibilité et de meilleures options de déploiement sans interruption de service, car vous avez distribué votre application à 1 (ou au moins une) instance par région, par opposition à au moins une pour le monde entier.
Comme les exigences changent, vous pourriez avoir une logique métier plus spécifique à la région et éventuellement des modifications de données, j'essayerais de diviser le code et ses données par région, et d'éviter de partager la logique métier spécifique à la région (vous pourriez finir par partager du code principal).
Ça a du sens?
la source