如何使两个 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 安排采访:
- 向所有面试官发送一封电子邮件。电子邮件包含一个 link 到 webapp 2,单击此 link 打开 webapp2,它为面试官提供了一个界面 select 他们计划在面试中提出的问题。
要求:
如果问题不是 select 面试官提出的,那么我想向他们发送提醒。为此,我希望 webapp2 知道面试已安排。
我希望 webapp2 了解发生的任何阵容变化(在给定的面试中,更换面试官或取消面试等)。
我想到的解决方案:
一旦采访来自 webapp1 scheduled/changed,webapp1 将调用 webapp2(webapp2 为此公开了一个 API)让 webapp2 知道创建了一个新采访或现有采访已更新。
对于 DB1 中采访 table 中的任何新 entry/update,都会向 DB2 启动一个 DB 触发器。我不确定这是否也可能。
在上述两种方法中,有人可以帮助我了解选择一种方法的优缺点。或者还有一些其他替代方法可以实现此目的。
在此表示感谢。
不要让这两个服务紧密耦合,如果第二个服务依赖于任何其他服务,您可能会面临延迟。如果第二个服务没有启动怎么办。所以在这里尝试使用消息队列。让您的第一个服务发布可以处于状态的采访事件(新的、取消的等,以及其他详细采访 ID、采访者等)。做第二个服务来听它。正如您所说,采访请求会在第二项服务中发送到多个 interviewers.Configure 提醒 job/scheduler,并在您的数据存储中为其配置详细信息,例如:采访者 ID、采访 ID、时间范围等,以便您可以轻松向面试官发送提醒。这应该对你有帮助。如果我没有正确回答您的问题,请告诉我。
微服务使用更改事件来获得给定系统中的数据一致性。
以上两种方式都是可行的。
在第一种方法的情况下,您需要考虑使用观察者设计模式的设计,其中 Interview Scheduler (webapp1) 是观察者在 webapp2 中订阅的主题。这将是即时的,因为采访安排程序会立即通知其他 web 应用程序安排采访。您可以在 webapp 2 中有一个服务端点,以便在安排面试后立即由 webapp1 调用通知目的。这种方法的缺点是在两个 web 应用程序上需要额外的编程工作。
该解决方案在许多数据库中都是可行的,具体取决于您使用的是哪个数据库。但是,根据我的理解,您将面临的麻烦是它不是通知。即使触发器更新了数据库,也不会通知任何人它已更改。无论如何,您都需要实现一个侦听器,以便 webapp2 知道数据库中是否有一些更改。
这不是您所希望的确切解决方案,但我想它会帮助您深入了解可能的解决方案。
我有两个 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 安排采访:
- 向所有面试官发送一封电子邮件。电子邮件包含一个 link 到 webapp 2,单击此 link 打开 webapp2,它为面试官提供了一个界面 select 他们计划在面试中提出的问题。
要求:
如果问题不是 select 面试官提出的,那么我想向他们发送提醒。为此,我希望 webapp2 知道面试已安排。
我希望 webapp2 了解发生的任何阵容变化(在给定的面试中,更换面试官或取消面试等)。
我想到的解决方案:
一旦采访来自 webapp1 scheduled/changed,webapp1 将调用 webapp2(webapp2 为此公开了一个 API)让 webapp2 知道创建了一个新采访或现有采访已更新。
对于 DB1 中采访 table 中的任何新 entry/update,都会向 DB2 启动一个 DB 触发器。我不确定这是否也可能。
在上述两种方法中,有人可以帮助我了解选择一种方法的优缺点。或者还有一些其他替代方法可以实现此目的。
在此表示感谢。
不要让这两个服务紧密耦合,如果第二个服务依赖于任何其他服务,您可能会面临延迟。如果第二个服务没有启动怎么办。所以在这里尝试使用消息队列。让您的第一个服务发布可以处于状态的采访事件(新的、取消的等,以及其他详细采访 ID、采访者等)。做第二个服务来听它。正如您所说,采访请求会在第二项服务中发送到多个 interviewers.Configure 提醒 job/scheduler,并在您的数据存储中为其配置详细信息,例如:采访者 ID、采访 ID、时间范围等,以便您可以轻松向面试官发送提醒。这应该对你有帮助。如果我没有正确回答您的问题,请告诉我。 微服务使用更改事件来获得给定系统中的数据一致性。
以上两种方式都是可行的。
在第一种方法的情况下,您需要考虑使用观察者设计模式的设计,其中 Interview Scheduler (webapp1) 是观察者在 webapp2 中订阅的主题。这将是即时的,因为采访安排程序会立即通知其他 web 应用程序安排采访。您可以在 webapp 2 中有一个服务端点,以便在安排面试后立即由 webapp1 调用通知目的。这种方法的缺点是在两个 web 应用程序上需要额外的编程工作。
该解决方案在许多数据库中都是可行的,具体取决于您使用的是哪个数据库。但是,根据我的理解,您将面临的麻烦是它不是通知。即使触发器更新了数据库,也不会通知任何人它已更改。无论如何,您都需要实现一个侦听器,以便 webapp2 知道数据库中是否有一些更改。
这不是您所希望的确切解决方案,但我想它会帮助您深入了解可能的解决方案。