【问题标题】:How can I keep databases of two web applications in sync?如何使两个 Web 应用程序的数据库保持同步?
【发布时间】:2018-05-13 15:03:42
【问题描述】:

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

上下文:

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

微服务 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: 为面试官协调问题选择的后端服务。即每位面试官选择他/她将在面试中向候选人提出什么问题(这是为了确保不会有两名面试官最终向候选人提出相同的问题)。

微服务数据库 2: 架构

// QuestionBank : 包含问题的表格,面试官可以选择。

// Interviewers : 包含公司所有面试官的表格。

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

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

当前工作流程:

一旦从 webapp1 安排面试:

  1. 会向所有面试官发送一封电子邮件。电子邮件包含指向 webapp 2 的链接,单击此链接将打开 webapp2,该链接为面试官提供了一个界面,供面试官选择他们计划在面试中提出的问题。

要求:

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

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

我想到的解决方案:

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

  2. 对于 DB1 中的采访表中的任何新条目/更新,将向 DB2 启动一个 DB 触发器。我不确定这是否也可能。

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

感谢这里的领导。

【问题讨论】:

    标签: java sql-server microservices database-trigger


    【解决方案1】:

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

    【讨论】:

    • 是的,即使我觉得,消息队列是解决这个问题的正确方法。只是想听听主题专家的更多想法。
    • 有些人甚至建议使用数据库复制。但我不确定这对这个问题有什么作用和作用。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 从您上面的回复中我了解到,您所说的观察者模式是指使用消息队列,对吗?
    • 是的@LokeshAgrawal,没错。很抱歉在术语中不是很清楚:)
    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2012-11-17
    • 2012-09-11
    • 2014-10-20
    相关资源
    最近更新 更多