我正在开发一个新项目,但我仍在学习如何使用微服务/域驱动设计。
如果推荐的体系结构是具有每个服务的数据库,并使用事件来实现最终的一致性,那么服务的数据库如何用其所需的所有数据初始化?
如果指示数据库更新的事件是在设计新服务/数据库之前发生的,我是否需要从先前数据库的副本开始?
还是应该发布“正在阻止中的新服务”事件,并允许所有其他服务再次将所有东西都还给我?这可能会引起很多人的抱怨,并导致性能问题。
答案 0 :(得分:1)
服务的数据库如何用其所需的所有数据初始化?
它要它;这就是说,您设计了一个协议,以便分拆的服务可以获取它需要的所有信息的副本。这通常包括跟踪检查点和查询,使您能够询问自某个检查点以来发生了什么。
考虑“拉”,而不是“推”。
“服务”要点的一部分:设计正确的数据边界。在服务之间复制大量数据的需求通常表明需要重新考虑服务边界。
答案 1 :(得分:1)
有一个名为Apache Kafka的特殊流媒体平台,可以解决类似问题。
使用Kafka,您将发布事件供其他服务使用。 Kafka之所以与众不同,是因为事件从不(取决于配置)被删除,并且可以由新服务启动来再次使用。此功能可用于初始填充数据库(通过将Topic的偏移量设置为0
,从而重新读取事件的历史记录。)
还有另一个功能,称为GlobalKTable
,它是特定主题的所有事件的TableView。 GlobalKTable
保留每个键(如主键)的最新值 并可以转换为状态存储(高级RocksDB),这使其可查询。每当应用程序启动时,此状态存储都会初始化自身。因此,应用程序本身不需要数据库,因为状态存储将自动保持最新状态(仍然需要牢记一致性)。只有对于更复杂的查询,状态存储才需要与数据库一起使用(使用kafka时,您将尝试预先计算这些查询的结果,并使不同的状态存储本身可以访问它们)。
这将是一项复杂的工作,但是如果它满足您的需求,那将是一件有趣的事!