如何保持两个Web应用程序的数据库同步?

时间:2018-05-13 04:23:50

标签: java sql-server microservices database-trigger

我有两个webapps,每个都有自己的后端微服务,每个微服务都有自己的数据库。对于microservice1数据库表的任何变化,我想在微服务2的数据库表中更改(创建/更新)条目。我该怎么做?

上下文:

Webapp 1:人力资源协调员安排面试的界面。

微服务1:安排面试的后端服务。

微服务1的数据库:存储与候选人面试相关的信息。

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

Webapp 2 :面试官可以在面试中协调问题的UI。

微服务2:面试官的后端服务,以协调问题选择。即每位面试官在面试中选择他/她将要求候选人提出的问题(这是为了确保没有两位面试官最终向候选人提出同样的问题)。

DB for microservice 2: Schemas

// QuestionBank:包含问题的表格,访调员可以选择。

//访调员:包含公司所有访调员的表格。

// InterviewToInterviewer :(与访调员面谈的多对多映射)。一次面试可以有很多面试官,每位面试官都可以参加很多面试。

// InterviewToInterviewerToQuestion :(面试的多对多映射到问讯者)。对于每次访谈,访问者可以选择许多问题,问题库中的每个问题都可以成为许多访谈的一部分。访问者参与。

当前工作流程:

一旦从webapp1安排了采访:

  1. 向所有采访者发送电子邮件。电子邮件包含指向webapp 2的链接,单击此链接会打开webapp2,为访问者提供一个界面,以便他们选择他们计划在面试中提出的问题。
  2. 要求:

    1. 如果面试官没有选择问题,那么我想向他们发送提醒。为此,我希望webapp2知道会安排面试。

    2. 我希望webapp2能够了解所发生的任何阵容变化(在特定的面试,面试官被更改或面试被取消等)。

    3. 我想到的解决方案:

      1. 一旦从webapp1安排/更改了面试,webapp1将调用webapp2(webapp2公开API),让webapp2知道创建了新面试或更新了现有面试。

      2. 对于DB1中的访谈表中的任何新条目/更新,都会向DB2启动DB触发器。我不确定这是否也可行。

      3. 在上述两种方法中,有人可以帮助我选择一个人的优点和缺点。或者还有其他一些替代方法来实现这一目标。

        这里的潜在客户表示赞赏。

2 个答案:

答案 0 :(得分:2)

不要将这两项服务紧密耦合,如果第二项服务依赖于任何其他服务,您可能会遇到延迟。如果第二次服务没有启动怎么办?所以尽量在这里使用消息队列。您的第一个服务是发布可以处于状态的面试活动(新的,取消的等以及其他详细信息面试ID,面试官等)。制作第二个服务来听取它。正如您所说,面试请求发送给多位面试官。在第二次服务中配置提醒作业/日程安排,并在您的数据存储中配置详细信息,例如:面试官ID,面试ID,时间范围等,以便您可以向面试官发送提醒容易。这应该对你有帮助。如果我的问题没有正确,请告诉我。 微服务使用change事件来获得给定系统中的数据一致性。

答案 1 :(得分:1)

上述两种方法都是可行的方法。

  1. 对于第一种方法,您需要使用Observer设计模式来考虑设计,其中Interview Scheduler(webapp1)是webapp2中观察者订阅的主题。这将是即时的,因为面试调度程序将立即通知其他webapp关于计划的面试。一旦安排了面试,您就可以在webapp2中拥有一个服务端点,以便通过webapp1调用通知目的。这种方法的缺点是在两个webapps上都需要额外的编程工作。

  2. 该解决方案在许多数据库中都是可行的,取决于您使用的是哪个数据库。但是,根据我的理解,您将遇到的麻烦是它不是通知。即使触发器更新数据库,也不会通知任何人它已更改。无论如何,您都需要实现一个侦听器,以便webapp2知道数据库中是否有一些更改。

  3. 这不是您所希望的精确解决方案,但我想它可以帮助您深入了解可能的解决方案。