【问题标题】:In an Event-Driven Microservice, how to I update private database with older data在事件驱动的微服务中,如何使用旧数据更新私有数据库
【发布时间】:2019-09-11 16:58:46
【问题描述】:

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

如果推荐的架构是每个服务的数据库,并使用事件来实现最终的一致性,那么服务的数据库如何使用它需要的所有数据进行初始化?

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

或者我应该发布一个“New Service On The Block”事件,并允许所有其他服务再次将所有内容吐回给我?这可能是很多闲聊,并导致性能问题。

【问题讨论】:

    标签: domain-driven-design microservices


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!好点。我对“大量数据”的想法更具历史意义。即使是每天几条记录,在几年内,也可能是相当大的数据量。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢!我接受@VoiceOfUnreason 提供的答案,因为它以更高、更抽象的层次回答了这个问题。您对 Kafka 的建议也是一个很好的实现。如果我能同时接受,我会的。
    猜你喜欢
    • 2021-05-30
    • 2016-12-07
    • 2017-09-03
    • 2017-06-27
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多