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

时间:2019-04-22 13:48:21

标签: domain-driven-design microservices

我正在开发一个新项目,但我仍在学习如何使用微服务/域驱动设计。

如果推荐的体系结构是具有每个服务的数据库,并使用事件来实现最终的一致性,那么服务的数据库如何用其所需的所有数据初始化?

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

还是应该发布“正在阻止中的新服务”事件,并允许所有其他服务再次将所有东西都还给我?这可能会引起很多人的抱怨,并导致性能问题。

2 个答案:

答案 0 :(得分:1)

  

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

它要它;这就是说,您设计了一个协议,以便分拆的服务可以获取它需要的所有信息的副本。这通常包括跟踪检查点和查询,使您能够询问自某个检查点以来发生了什么。

考虑“拉”,而不是“推”。

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

答案 1 :(得分:1)

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

还有另一个功能,称为GlobalKTable,它是特定主题的所有事件的TableView。 GlobalKTable保留每个键(如主键)的最新值 并可以转换为状态存储(高级RocksDB),这使其可查询。每当应用程序启动时,此状态存储都会初始化自身。因此,应用程序本身不需要数据库,因为状态存储将自动保持最新状态(仍然需要牢记一致性)。只有对于更复杂的查询,状态存储才需要与数据库一起使用(使用kafka时,您将尝试预先计算这些查询的结果,并使不同的状态存储本身可以访问它们)。

这将是一项复杂的工作,但是如果它满足您的需求,那将是一件有趣的事!