微服务项目下冗余数据如何同步?

废话不多说,上例子:
企业中心,的企业名称可能被冗余到了订单服务的订单表,商品服务的商品表。那么此时企业名称可能发生变更,企业名称一旦变更,历史的所有数据就显示的所有企业名称就都不对了。此时该怎么办呢?
于是就需要一套机制来保障主数据发生变更时能够同步更新所有与之关联的数据。
本身这是一种反范式的做法,但是有时候你又不得不这么做,因为这样不用进行跨服务查询,而名称的修改本身是个低频操作,所以如果你选择只存id,而不冗余名称,你会发现,服务间调用大大增加,性能急剧下降。前端一个订单列表可能需要将仓库,商品,等信息显示在一个页面上,此时你查一个订单列表就需要调用各个服务,而每一次调用的目的仅仅是为了取一个字段。并且时候超高频调用,显然对比之下,你更愿意采取的策略就是冗余,不仅提升了系统性能,还提示了开发效率,性价比最高。

此时要考虑的就是如何解决低频修改名称的问题。开发一个组件满足如下特性
1、可配置
2、易使用
3、可观测

一般这种数据冗余是在三范式的基础上违反第三范式的冗余也就是依赖传递,所以此时在表中的数据一定存在一个被传递的唯一id,比如,商品id,商品名称,商品名称就是被冗余的字段。
那么我们就可以构建数据表如下

drop table if exists `sync_task_source`;
CREATE TABLE `sync_task_source` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `code` varchar(255) NOT NULL comment 'database:table:field 例user_center:user:username',
  `source_database_id` bigint(20) NOT NULL comment '源数据库id',
  `source_table_id` bigint(20) NOT NULL comment '源表id',
  `source_field_id` bigint(20) NOT NULL comment '源字段id',
  `source_query_field_id` varchar(64) NOT NULL comment '用于查询的字段',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

drop table if exists `sync_task_target`;
CREATE TABLE `sync_task_target`(
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `task_source_id` bigint(20) NOT NULL comment '任务对应的源元数据',
  `target_database_id` bigint(20) NOT NULL comment '需要被更新的字段所在库',
  `target_table_id` bigint(20) NOT NULL comment '需要被更新的字段所在表',
  `target_field_id` bigint(20) NOT NULL comment '需要被更新的字段',
  `target_query_field_id` varchar(64) NOT NULL comment '用于查询的字段',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

drop table if exists `sync_task_data`;
CREATE TABLE `sync_task_data`(
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `task_code` varchar(255) NOT NULL comment 'database:table:field 例user_center:user:username',
  `field_new_data` varchar(1000) default NULL comment '新的数据',
  `field_old_data` varchar(1000) default NULL comment '旧数据',
  `query_field_data` varchar(128) NOT NULL comment '用于查询对应数据的唯一值',
  `run_type` int(4) NOT NULL default 0 comment '0-初始提交,1-执行中,2-执行成功,3-执行失败',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

配置起来可能略显麻烦,所以出于易用性考虑,写个简单的配置页面
主表配置
在这里插入图片描述
目标表配置
在这里插入图片描述
这样一个配置关系就将主表于冗余字段的库表关系配置起来了
然后接着启动个canal服务,调用配置接口进行可配置订阅对于库表变更通知,然后在项目中获取主表配置进行比对,是否对应字段变更,如果是就启动一个定时任务获取所有目标表将数据同步出去。
整体架构如下
在这里插入图片描述
这样既可以避免入侵,又能解决问题。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值