在MicroService和Monolithic系统之间同步数据

时间:2020-05-22 13:55:17

标签: java spring-boot microservices etl

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

  • 为微服务编写API并通过rest调用获取数据 批次
  • 编写直接连接到以下数据库的ETL服务: 整体和微服务数据库来加载数据。

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

注意:我只想同步记录中的某些字段,并不是全部说如果一条记录包含200个字段,并且在我的服务中仅使用2个字段,那么我只需要将所有记录都包含这3个字段即可。可以动态更改正在使用的记录的数量。例如,一段时间后该服务使用4个字段而不是3个字段,那么我需要将该第4个字段带入微服务的db中。

那么有人可以建议哪种方法更好吗?

3 个答案:

答案 0 :(得分:2)

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

但是还有第三种方法特别适合于数据同步:异步集成。基本上,您将需要发送变更数据消息流,例如到邮件队列或类似kafka的邮件。这些消息是接口,因此您可以获得与REST API相同的低耦合优势。但是您还可以获得其他优势。

  • 您没有REST调用的开销,只有异步消息侦听器。
  • 如果整体崩溃或响应缓慢,则您的微服务不会受到影响。

但是,存在一个引导问题:您是否需要追溯地为过去发生的所有事件生成事件,还是可以从某个时间点开始并从那时起保持所有内容同步?

答案 1 :(得分:1)

您的最终目标是什么-

  1. 是否可以通过在两个系统之间分配流量来从Monolithic缓慢迁移到微服务。 或

  2. 在晴朗的日子里,完全过渡到新的微服务。

如果是第二种方法,我将使用ETL进行数据迁移。

如果是第一种方法-

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

  • 在微服务上实施订户并更新数据库。

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

  • 然后将某些持久性调用缓慢转移到微服务,这将对旧系统进行剩余调用以更新旧数据库。

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

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

这是从旧系统平稳切换的一种方法。

答案 2 :(得分:0)

为什么要在单片服务和微服务之间同步数据? 您是否正在将单片重写为MicroService?如果是这种情况,我宁愿使用ETL服务进行数据同步,因为与其他调用相比,它更标准化用于数据同步。

相关问题