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

Microservices 使用Kafka JDBC连接器在服务之间同步数据,microservices,apache-kafka-connect,Microservices,Apache Kafka Connect,我有一个带有微服务架构的系统。它有两个服务:服务A和服务B,每个服务都有自己的数据库,如下图所示。 据我所知,为每项服务建立单独的数据库是一种更好的方法。在这种设计中,每个服务都是其数据的所有者,负责创建、更新、删除和强制执行约束 为了在数据库B中提供服务A数据,我考虑使用JDBC Kafka连接器,但我不确定数据库B中的表1和表2是否应该对数据库A实施约束 如果约束(如从表2到表1的外键)应该存在于数据库B中,那么有没有办法让连接器知道这一点 同步数据或解决此问题的其他常见或更好的方法有哪些

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

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

为了在数据库B中提供服务A数据,我考虑使用JDBC Kafka连接器,但我不确定数据库B中的表1表2是否应该对数据库A实施约束

如果约束(如从表2到表1的外键)应该存在于数据库B中,那么有没有办法让连接器知道这一点

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

最简单的解决方案似乎是在数据库B中不受任何约束地按表同步。这将使事情变得更容易,但也可能导致服务B中的服务a数据不一致的情况。例如,表2中的条目指向表1中不存在的条目

如果约束,如表2到表1中的外键 那么,有没有办法让连接器知道 关于这个

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

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

您有两个选择:

  • 像数据库B中的外键一样强制使用约束,但需要从应用程序级别而不是通过“Kafka JDBC连接器”进行更新。因此,对于此选项,您不能使用“Kafka JDBC连接器”。您需要编写一些小型服务/工作程序来读取卡夫卡主题中的数据并填充数据库表。通过这种方式,可以控制保存到数据库中的内容,甚至在尝试保存到数据库之前,也可以验证约束。但这里的问题是,你真的需要约束吗?它们在micro-service-A中很重要,但在micro-service-B中您真的需要它们吗,因为它只是数据的一个副本

  • 不使用约束并允许临时不一致。这在微服务领域很常见。在使用分布式系统时,您必须始终考虑CAP定理。因此,您考虑到某些数据可能在某一点上不一致,但您必须确保最终将其恢复到一致状态。这意味着您需要在应用程序级别开发一些清理/修复机制,以识别并纠正这些数据。因此,对于微服务不拥有且被视为该微服务域外部数据的数据,无需强制执行Db约束

  • 重新考虑您的设计。通常我们会从micro-service-A复制micro-service-B中的数据,以避免服务之间的耦合,从而使服务micro-service-B可以生存和运行,即使micro-service-A因某种原因关闭或未运行。对于需要表1和表2数据的每个操作,我们也这样做是为了减少从micro-service-B到micro-service-A的负载。表1和表2归micro-service-A所有,micro-service-A是该数据的唯一真实来源。Micro-service-B正在使用该数据的副本进行操作。 查看您的数据库设计,以下问题可能有助于您找出适合您的系统的最佳选项: 是否需要复制micro-service-B中的数据? 如果我复制数据,我是否需要两个表以及它们在micro-service-B中的所有列/数据?通常只存储/复制所需实体/表的子集。 我是否需要micro-service-A中的表结构与micro-service-A中的表结构相同?您必须根据您的域来决定这一点,但通常您会对表进行非规范化并对其进行更改,以适应micro-service-B操作的需要。通常,所有这些设计决策都取决于您的应用程序域和用例