Domain driven design 在事件驱动的微服务中,如何使用旧数据更新私有数据库

Domain driven design 在事件驱动的微服务中,如何使用旧数据更新私有数据库,domain-driven-design,microservices,Domain Driven Design,Microservices,我正在做一个新项目,我还在学习如何使用微服务/领域驱动设计 如果建议的体系结构是每个服务都有一个数据库,并使用事件来实现最终的一致性,那么该服务的数据库如何使用它所需的所有数据进行初始化 如果指示数据库更新的事件发生在设计新服务/db之前,是否需要从以前数据库的副本开始 或者我应该发布一个“块上的新服务”事件,并允许所有其他服务再次将所有内容吐回给我?这可能会导致很多闲聊,并导致性能问题 如何使用服务所需的所有数据初始化服务的数据库 它要求它;也就是说,您设计了一个协议,以便正在运行的服务能够获

我正在做一个新项目,我还在学习如何使用微服务/领域驱动设计

如果建议的体系结构是每个服务都有一个数据库,并使用事件来实现最终的一致性,那么该服务的数据库如何使用它所需的所有数据进行初始化

如果指示数据库更新的事件发生在设计新服务/db之前,是否需要从以前数据库的副本开始

或者我应该发布一个“块上的新服务”事件,并允许所有其他服务再次将所有内容吐回给我?这可能会导致很多闲聊,并导致性能问题

如何使用服务所需的所有数据初始化服务的数据库

它要求它;也就是说,您设计了一个协议,以便正在运行的服务能够获得它所需的所有信息的副本。这通常包括跟踪检查点,以及允许您询问自某个检查点以来发生了什么的查询

想想“拉”,而不是“推”


“服务”的一部分:设计正确的数据边界。需要在服务之间复制大量数据通常表明需要重新考虑服务边界。

有一个名为Apache Kafka的特殊流媒体平台,可以解决类似问题。 使用Kafka,您可以发布事件供其他服务使用。使卡夫卡与众不同的是,事件永远不会(取决于配置)被删除,并且可以被新的服务再次使用。此功能可用于初始填充数据库(通过将主题的偏移量设置为
0
,从而重新读取事件历史记录)

还有另一个功能,称为
GlobalKTable
,它是特定主题的所有事件的表视图。
GlobalKTable
保存每个键(如主键)的最新值,可以转换为状态存储(引擎盖下的RocksDB),这使得它可以查询。每当应用程序启动时,该状态存储会自动初始化。因此,应用程序本身不需要数据库,因为状态存储将自动保持最新(一致性仍然是需要记住的)。仅对于更复杂的查询,状态存储需要附带一个数据库(使用kafka,您将尝试预计算这些查询的结果,并使其可供不同的状态存储本身访问)


这将是一个复杂的努力,但如果它适合你的需要,这是一件有趣的事情

谢谢大家!!好的观点。我对“大量数据”的想法更具历史性。在几年内,即使每天只有几条记录,也可能是相当大的数据量。谢谢!我接受@VoiceOfUnreason提供的答案,因为它在更高、更抽象的层次上回答了这个问题。你对卡夫卡的建议也是一个很好的实现。如果两者我都能接受,我会的。