3 votes

Comment puis-je faire en sorte que les bases de données de deux applications web restent synchronisées ?

J'ai deux webapps, chacune avec son propre microservice backend et chaque microservice a sa propre base de données. Pour tout changement dans les tables de la base de données du microservice 1, je veux changer (créer/mettre à jour) les entrées dans les tables de la base de données du microservice 2. Comment puis-je faire cela ?

Le contexte :

Webapp 1 : UI pour les coordinateurs des ressources humaines afin de planifier un entretien.

Microservice 1 : Service backend qui programme un entretien.

DB pour microservice 1 : Stocke les informations relatives à l'entretien d'un candidat.

  interviews: [ {
      "interviewId": "1",
      "candidateId": "abc",
      "interviewers": [
      {
         "interviewer_name": "Thor",
         "schedule": {
            "startTime": "",
            "endTime": "",
            "roomNumber": 101
         }
      },
      {
         "interviewer_name": "Loki",
         "schedule": {
            "startTime": "",
            "endTime": "",
            "roomNumber": 101
         }
      }
   ]
} ]

Webapp 2 : Interface utilisateur permettant aux enquêteurs de se coordonner sur les questions à poser lors d'un entretien.

Microservice 2 : Service dorsal permettant aux intervieweurs de coordonner la sélection des questions, c'est-à-dire que chaque intervieweur sélectionne la question qu'il/elle va poser à un candidat lors d'un entretien (ceci afin de s'assurer que deux intervieweurs ne posent pas la même question à un candidat).

DB pour microservice 2 : Schémas

// QuestionBank : Tableau contenant des questions, que les enquêteurs peuvent sélectionner.

// Intervieweurs : Tableau contenant tous les intervieweurs de l'entreprise.

// InterviewToInterviewer : (mise en correspondance de plusieurs entretiens avec des enquêteurs). Un entretien peut avoir plusieurs intervieweurs, et chaque intervieweur peut participer à plusieurs entretiens.

// InterviewToInterviewerToQuestion : (mappage multiple d'interviewToInterviewers avec des questions). Pour chaque entretien, un interviewer peut sélectionner plusieurs questions et chacune des questions d'une banque de questions peut faire partie de plusieurs entrées interviewToInterviewer.

Flux de travail actuel :

Dès que l'entretien est programmé à partir de webapp1 :

  1. Un courriel est envoyé à tous les enquêteurs. L'email contient un lien vers une webapp 2. En cliquant sur ce lien, on ouvre la webapp 2 qui fournit une interface permettant aux enquêteurs de sélectionner les questions qu'ils prévoient de poser lors d'un entretien.

Exigence :

  1. Si les questions ne sont pas sélectionnées par l'enquêteur, je veux lui envoyer des rappels. Pour cela, je veux que la webapp2 sache qu'un entretien est programmé.

  2. Je veux que webapp2 soit informé de tout changement de file d'attente (dans un entretien donné, l'intervieweur est changé ou un entretien est annulé etc) qui se produit.

Des solutions auxquelles j'ai pensé :

  1. Dès que l'entretien est programmé/modifié depuis la webapp1, la webapp1 appelle la webapp2 (la webapp2 expose une API pour cela) pour faire savoir à la webapp2 qu'un nouvel entretien est créé ou qu'un entretien existant est mis à jour.

  2. Pour toute nouvelle entrée/mise à jour de la table des entretiens dans DB1, un déclencheur DB est lancé vers DB2. Je ne suis pas sûr que cela soit également possible.

Parmi les deux approches ci-dessus, quelqu'un peut-il m'aider à déterminer les avantages et les inconvénients de l'une par rapport à l'autre ? Ou bien il existe une autre approche alternative pour y parvenir.

Les pistes sont appréciées.

2voto

Bhagwati Malav Points 1237

Ne faites pas en sorte que ces deux services soient étroitement couplés, vous risquez d'être confronté à une latence si le deuxième service dépend d'un autre service. Et si le second service n'est pas opérationnel. Essayez donc d'utiliser la file d'attente de messagerie ici. Faites en sorte que votre premier service publie un événement d'entretien qui peut être dans le statut (nouveau, annulé, etc.) avec d'autres détails (identifiant de l'entretien, intervieweurs, etc.). Faites en sorte que le second service l'écoute. Comme vous l'avez dit, la demande d'entretien est envoyée à plusieurs intervieweurs. Configurez une tâche/un planificateur de rappel dans le second service et configurez-le dans votre magasin de données avec des détails tels que l'identifiant de l'intervieweur, l'identifiant de l'entretien, la plage horaire, etc. afin de pouvoir envoyer facilement des rappels aux intervieweurs. Cela devrait vous aider. Faites-moi savoir si je n'ai pas répondu correctement à votre question. Les microservices utilisent les événements de changement pour assurer la cohérence des données dans un système donné.

1voto

Avinash Sagar Points 199

Les deux approches mentionnées ci-dessus sont des approches réalisables.

  1. Dans le cas de la première approche, vous devez envisager la conception en utilisant le modèle de conception Observer où le planificateur d'entretien (webapp1) est un sujet auquel souscrivent les observateurs de webapp2. Cela sera instantané car le planificateur d'entretiens informera immédiatement l'autre webapp des entretiens en cours de planification. Vous pouvez avoir un service endpoint dans la webapp 2 pour la notification qui sera appelé par la webapp1 dès que l'entretien est programmé. L'inconvénient de cette approche est un effort de programmation supplémentaire sur les deux webapps.

  2. Cette solution est réalisable dans de nombreuses bases de données et dépend de la base de données que vous utilisez. Mais le problème auquel vous serez confronté, d'après ce que j'ai compris, est qu'il ne s'agit pas d'une notification. Même si le déclencheur met à jour la base de données, personne n'est averti qu'elle a été modifiée. Vous aurez besoin d'implémenter un écouteur de toute façon pour que webapp2 sache s'il y a des changements dans la base de données.

Ce n'est pas la solution exacte que vous espériez mais je suppose que cela vous aidera à approfondir les solutions possibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X