使用 Kafka JDBC 连接器在服务之间同步数据

Syncing data between services using Kafka JDBC Connector

我有一个微服务架构的系统。它有两个服务:服务 A服务 B,每个服务都有自己的数据库,如下图所示。

据我所知,为每项服务拥有一个单独的数据库是更好的方法。在此设计中,每个服务都是其数据的所有者,它负责创建、更新、删除和强制执行约束。

为了在数据库B中获取服务A数据,我正在考虑使用JDBC Kafka连接器,但我我不确定 Table1Table2Database B 中是否应该强制执行来自 Database 的约束A.

如果约束,比如从Table2Table1的外键应该存在于数据库B 那么,有没有办法让连接器知道这个?

还有哪些其他常见或更好的方法来同步数据或解决此问题?

最简单的解决方案似乎是根据 table 同步,在 数据库 B 中没有任何限制。这会使事情变得更容易,但它也可能导致 Service 的 A 数据在 Service B 中不一致的情况。例如,Table2 中的条目指向 Table1

中不存在的条目

If the constraint, like the foreign key from Table2 to Table1 should exist in Database B then, is there a way to have the connector know about this?

不幸的是,“Kafka JDBC 连接器”不知道约束。

根据您的问题,我假设数据库 B 中的表 1 和表 2 是重复的 table,它们存在于数据库 A 中。在数据库 A 中,您有不确定是否应该添加到数据库 B 中的约束? 如果是这样,那么我不确定使用“Kafka JDBC 连接器”同步数据是否是最佳选择。

您有几个选择:

  1. 强制使用约束,例如数据库 B 中的外键,但您需要从应用程序级别而不是通过“Kafka JDBC连接器”。所以对于这个选项你不能使用“Kafka JDBC Connector”。您需要编写一些小的 service/worker 来从该 Kafka 主题读取数据并填充您的数据库 table。通过这种方式,您可以控制保存到数据库中的内容,甚至可以在尝试保存到数据库之前验证约束。但这里的问题是你真的需要约束吗?它们在 micro-service-A 中很重要,但在 micro-service-B 中你真的需要它们吗,因为它只是数据的副本?

  2. 不使用约束并允许临时不一致。这在 micro-services 世界中很常见。使用分布式系统时,您始终需要考虑 CAP 定理。因此,您考虑到某些数据可能在某些时候不一致,但您必须确保最终将其恢复到一致状态。这意味着您需要在您的应用程序级别开发一些 cleanup/healing 机制来识别此数据并更正它。因此,不必对 micro-service 不拥有且被视为 micro-service 域的外部数据的数据强制执行 Db 约束。

  3. 重新考虑你的设计。 通常我们从 micro-service-A 复制 micro-service-B 中的数据,以避免服务之间的耦合,以便即使 micro-service-A 由于某种原因关闭或 运行 服务 micro-service-B 也可以运行和运行。我们还这样做是为了将需要来自 Table1 和 Table2 的数据的每个操作的负载从 micro-service-B 减少到 micro-service-A。 Table1 和 Table2 归 micro-service-A 所有,micro-service-A 是此数据的唯一真实来源。 Micro-service-B 正在使用该数据的副本进行操作。 查看您的数据库设计以下问题可能会帮助您确定什么是您系统的最佳选择: 是否需要复制micro-service-B中的数据? 如果我复制数据,我是否需要 table 以及 micro-service-B 中的所有 columns/data? 通常你只需要 store/duplicate 只是您需要的 Entity/Table 的一个子集。 我是否需要 micro-service-A 中与 micro-service-A 中相同的 table 结构? 您必须根据您的域来决定这一点,但通常您会非规范化您的tables 并更改它们以满足 micro-service-B 操作的需要。通常所有这些设计决策都取决于您的应用程序域和用例。