【问题标题】:Sync data between MicroService and Monolithic sytem在 MicroService 和 Monolithic 系统之间同步数据
【发布时间】:2020-09-09 09:21:12
【问题描述】:

我有一个巨大的单体,它有大约一百万个实体。我想将数据同步到微服务,以便它始终具有与单体系统相同的具有某些字段的实体副本。有两种方法可以做到这一点:

  • 为微服务编写一个API,通过rest调用获取数据 批次
  • 编写一个直接连接到数据库的 ETL 服务 单体和微服务数据库来加载数据。

第一种方法的缺点是它会包含大量的 Rest 调用,并且会很慢,因为我可能拥有一百万条记录。第二种方法打破了微服务原则(如果它不是主体,请纠正我),因为除了微服务 ETL 服务将访问数据库。

注意:我只想同步记录中的一些字段,而不是全部说如果记录有 200 个字段并且在我的服务中只使用 2 个字段,那么我需要只有这 3 个字段的所有记录。和数字正在使用的记录数可以动态更改。假设服务使用了 4 个字段而不是 3 个字段,那么我需要将第 4 个字段带入我的微服务的数据库中。

那么任何人都可以建议哪种方法更好?

【问题讨论】:

    标签: java spring-boot microservices etl


    【解决方案1】:

    第一种方法在低耦合高内聚方面更好,因为您在从单体应用中公开的内容与单体应用内的数据之间有一个清晰的接口(REST api)。从长远来看,它使微服务和单体应用更易于维护。

    但还有第三种方法特别适用于数据同步:异步集成。基本上,您的单体应用程序需要发送一串更改数据消息,例如到消息队列或类似kafka的东西。这些消息是接口,因此您可以获得与 REST API 相同的低耦合优势。但您也可以获得额外的优势。

    • 您没有 REST 调用的开销,只需一个异步消息侦听器。
    • 如果单体应用出现故障或响应缓慢,您的微服务不会受到影响。

    但是自举存在一个问题:您是否需要追溯性地为过去发生的所有事情生成事件,或者您可以从某个时间点开始并从该时间点开始保持一切同步?

    【讨论】:

    • 我也想要过去发生的事情
    【解决方案2】:

    为什么要在单体和微服务之间同步数据? 您是否正在将单体重写为微服务?如果是这种情况,我更喜欢使用 ETL 服务进行数据同步,因为与 rest 调用相比,这对于数据同步来说更加标准化。

    【讨论】:

      【解决方案3】:

      你的最终目标是什么 -

      1. 是不是通过在两个系统之间分配流量来慢慢地从单体迁移到微服务。 或

      2. 在美好的一天,完全切换到新的微服务。

      如果是第二种方法,我会为数据迁移做 ETL。

      如果它的第一种方法 -

      • 实施 CDC/或仅更改整体服务以将持久操作发布到消息传递系统 (Kafka.Rabbit)。

      • 在微服务上实现订阅者并更新数据库。

      • 一旦对 Pub/Sub 实施充满信心,将所有读取重定向到微服务系统。

      • 然后慢慢地将一定百分比的持久调用转移到微服务,这些微服务将对旧系统进行休息调用以更新旧数据库。

      • 一旦您对新服务和数据质量以及其他要求(性能)充满信心,就完全切换到新的微服务)。

      ** 您需要在开始异步消息传递过程之前进行历史同步。

      这是从旧系统顺利切换的一种方法。

      【讨论】:

      • 通过微服务慢慢迁移
      • ok..你可以执行上面提到的步骤。由于没有单一的解决方案,因此可能需要进行一些调整。这完全取决于项目、数据限制等。
      猜你喜欢
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2022-11-29
      • 2010-09-27
      相关资源
      最近更新 更多