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

How can I keep databases of two web applications in sync?

我有两个 Web 应用程序,每个都有自己的后端微服务,每个微服务都有自己的数据库。对于微服务 1 数据库 tables 的任何更改,我想更改微服务 2 数据库 tables 中的(create/update)条目。我该怎么做?

上下文:

Webapp 1: UI 供人力资源协调员安排面试。

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

DB for microservice 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: 面试官协调问题的后端服务 selection。即每个面试官 select 将在面试中向候选人提出什么问题 he/she(这是为了确保不会有两个面试官最终向候选人提出相同的问题)。

用于微服务 2 的数据库: 模式

// QuestionBank:Table 包含面试官可以 select.

的问题

// 面试官:Table 包含公司中的所有面试官。

// InterviewToInterviewer : (与采访者的采访的多对多映射)。一次面试可以有多个面试官,每个面试官可以参加很多次面试。

// InterviewToInterviewerToQuestion :(interviewToInterviewers 与问题的多对多映射)。对于每次面试,面试官可以 select 许多问题,问题库中的每个问题都可以是许多 interviewToInterviewer 条目的一部分。

当前工作流程:

一旦从 webapp1 安排采访:

  1. 向所有面试官发送一封电子邮件。电子邮件包含一个 link 到 webapp 2,单击此 link 打开 webapp2,它为面试官提供了一个界面 select 他们计划在面试中提出的问题。

要求:

  1. 如果问题不是 select 面试官提出的,那么我想向他们发送提醒。为此,我希望 webapp2 知道面试已安排。

  2. 我希望 webapp2 了解发生的任何阵容变化(在给定的面试中,更换面试官或取消面试等)。

我想到的解决方案:

  1. 一旦采访来自 webapp1 scheduled/changed,webapp1 将调用 webapp2(webapp2 为此公开了一个 API)让 webapp2 知道创建了一个新采访或现有采访已更新。

  2. 对于 DB1 中采访 table 中的任何新 entry/update,都会向 DB2 启动一个 DB 触发器。我不确定这是否也可能。

在上述两种方法中,有人可以帮助我了解选择一种方法的优缺点。或者还有一些其他替代方法可以实现此目的。

在此表示感谢。

不要让这两个服务紧密耦合,如果第二个服务依赖于任何其他服务,您可能会面临延迟。如果第二个服务没有启动怎么办。所以在这里尝试使用消息队列。让您的第一个服务发布可以处于状态的采访事件(新的、取消的等,以及其他详细采访 ID、采访者等)。做第二个服务来听它。正如您所说,采访请求会在第二项服务中发送到多个 interviewers.Configure 提醒 job/scheduler,并在您的数据存储中为其配置详细信息,例如:采访者 ID、采访 ID、时间范围等,以便您可以轻松向面试官发送提醒。这应该对你有帮助。如果我没有正确回答您的问题,请告诉我。 微服务使用更改事件来获得给定系统中的数据一致性。

以上两种方式都是可行的。

  1. 在第一种方法的情况下,您需要考虑使用观察者设计模式的设计,其中 Interview Scheduler (webapp1) 是观察者在 webapp2 中订阅的主题。这将是即时的,因为采访安排程序会立即通知其他 web 应用程序安排采访。您可以在 webapp 2 中有一个服务端点,以便在安排面试后立即由 webapp1 调用通知目的。这种方法的缺点是在两个 web 应用程序上需要额外的编程工作。

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

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