1. 业务背景
系统之间的数据同步在开发过程中很常见,例如将淘宝京东的订单信息同步到公司自建的商城订单库(单向同步)。又例如将自建商城的物流信息同步到淘宝京东,淘宝京东的物流信息同步到公司自建商城物流信息(双向同步)。
双向同步的数据是 A、B
两个服务都有的类似的数据,例如A系统有个订单、B系统也有一个订单。这两个订单是一个订单只是在不同的服务进行展示。这个时候不论是A录入物流信息还是B系统录入。此时都需要将信息同步到另一个服务。在同步的过程中会有下面的一些问题。
Tips: 这个不是两个数据库之间数据同步,因为两个服务中的数据结构可能有差异
2. 双向同步的问题
双向同步的方式有以下两种:
- 通过Restful接口直接同步
- 通过生产MQ消息,需要同步的服务消费MQ消息进行同步
在双向同步中存在的问题:
- 使用Restful接口同步的时候,当A服务接收到了数据请求后会处理数据然后调用B服务数据请求接口,大多数情况下B服务中很大可能B服务中的逻辑和A服务中差不多。B服务接收到数据请求后也会去调用B数据服务数据请求接口进行同步。这里就存在一个死循环的问题。
- 接口幂等,同一份数据多次提交保证只同步一次问题
- 分布式事务的问题,大多数情况下会涉及到两个以上的系统
3.双向同步问题解决方案
对于上述问题如何解决?我们逐个分析提供对应的解决方案:
问题1解决方案:
- 设置数据来源类型source_type,例如默认情况下是通过本系统录入的,另一种情况是从其他系统同步的。然后在代码中根据数据source_type来判断是否需要进行调用其他系统的同步接口。
- 如果所有系统的有全局唯一的标识ID,通过缓存全局唯一的标识ID来判断是否已经同步。
问题2解决方案:
- 通过在系统中建立和保存数据的唯一标识来判断当前数据是否已经同步。如果考虑到高并发可以考虑使用MQ来实现。
问题3解决方案:
- 最简单的方案就是搭建一个分布式事务支持服务,来支持微服务的分布式事务。例如 seata
- 对于如果只有两个系统,那么可以通过适当的代码顺序来保证。本地事务的代码写前面,后续调用另一个系统的写在后面。
4.总结
数据双向同步主要分为两种:
- 直接调用需要同步到的系统Restful接口
- 通过MQ作为媒介来进行数据同步
直接调用Restful接口适用于需要同步的系统较少然后能够支持分布式事务的用这种方式比较合适,如果系统偏多,又不支持分布式系统不建议使用直接调用Restful接口。通过MQ作为媒介来进行数据同步能够很好对系统解析解耦,同时兼顾了性能。