J'ai actuellement deux microservices. Nous les appellerons A
et B
.
La base de données sous microservice A
a le tableau suivant:
A
|-- users
La base de données sous microservice B
a le tableau suivant:
B
|-- trackers
Les exigences le stipulent users
et trackers
ont une relation plusieurs-à-plusieurs.
Je ne sais pas comment gérer correctement cela dans une architecture de microservices.
Je pouvais voir cela fonctionner de trois manières:
- Une
user_trackers
table est ajoutée au microserviceA
. Cela agit de manière similaire à une table de jointure contenant des "clés étrangères" versusers
ettrackers
. - Une
owners
table est ajoutée au microserviceB
. Cette table agit de manière similaire à une table de jointure polymorphe. Cela permettrait à n'importe quel service de créer une association avec un tracker. Cela peut ressembler à ceci:B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id
- Gardez des enregistrements pour
users
ettrackers
dans chaque microservice. Gardez-les synchronisés avec une sorte de système de pubsub.
J'allais à l'origine choisir l'option 2 parce que j'aimais le fait qu'elle préservait les limites des transactions. Je peux créer un tracker et l'associer à quelque chose atomiquement. Cependant, il semble hors de portée du microservice B
. Pourquoi le microservice devrait-il B
veiller à ce que le microservice A
veuille créer une association?
J'ai l'impression qu'il y a probablement ici un bon schéma que je ne connais pas. Est-ce que l'une des options que j'ai présentées est logique? Y a-t-il une autre option qui pourrait avoir plus de sens?
la source
La réponse de Zapadlo contient beaucoup de bonnes informations et un bon raisonnement. Je vais ajouter ici un petit conseil pratique qui peut faciliter le traitement de vos problèmes et les conseils dans cette réponse.
La façon dont vous avez formulé votre question de conception concerne les structures de base de données et la manière de répondre à une nouvelle exigence pour vos structures. Cela implique que vous construisez la conception du service à partir de votre modèle de données. Par exemple, ce que je ne vois pas, c'est comment la relation entre les utilisateurs et les trackers doit être accessible ou utilisée.
Dans la conception de services, la structure de l'interface est l'élément le plus important de la conception. En fait, la mise en œuvre est presque hors de propos en comparaison notamment dans le cas des microservices. La raison en est qu'une fois que vous avez mis votre service en place, toutes les dépendances de votre service devraient exister uniquement sur l'interface. Si vous réussissez, vous devriez être en mesure de réécrire complètement l'implémentation sans aucun consommateur. Et c'est le principal avantage de l'autonomie. Personne ne se soucie de la façon dont vous l'avez construit. Ils en ont juste besoin pour fonctionner comme vous l'avez annoncé.
Avant que quiconque puisse déterminer à quoi cela ressemble dans la base de données ou où vous le souhaitez, vous devez vraiment expliquer comment ces informations vont être utilisées. Est-ce quelque chose qui sera exposé via un service ou s'agit-il d'une sorte de données que vous souhaitez mélanger pour l'analyse?
D'un autre côté, j'éviterais les dépendances bidirectionnelles à presque tous les prix. Si vous avez des dépendances, vous voulez vraiment qu'un seul côté connaisse l'autre. Une fois les dépendances dans les deux sens, leurs services deviennent essentiellement une unité atomique.
la source
Cela dépend en grande partie du domaine lui-même. Si un utilisateur avec zéro trackers n'a pas de sens, le service utilisateur doit connaître les trackers. Si un tracker doit avoir un utilisateur, les trackers doivent connaître les utilisateurs. Si quelque chose comme avoir un tracker avec plusieurs propriétaires ou pouvoir transférer un tracker d'un utilisateur à un autre a du sens, alors peut-être que ces informations appartiennent à un autre service.
la source
Question: Pourquoi vos données sont-elles séparées le long des tables de données?
J'aurais tendance à choisir l'option 3: les services sont totalement séparés et peuvent répondre aux questions respectives auxquelles ils pourraient avoir besoin de répondre. De plus, ils sont beaucoup plus résistants. Mais attention, vos services pourraient se désynchroniser s'ils manquent des événements, mais cela peut être résolu grâce à une cohérence éventuelle.
En outre, vous pourriez envisager de fusionner les deux services - si les deux ne sont pas en mesure de répondre sans se connaître, je les fusionnerais simplement car ils font probablement partie d'un seul domaine.
la source