一个数据导入的有趣问题

相比于传统的单体应用,在基于微服务架构的系统中进行数据导入的操作显得更加复杂一点。通常而言,微服务的架构中包含了多个服务,服务的技术架构也可能大相径庭,同时考虑到拓展的需要,每个服务都有可能会拓展成多个instance。最近遇到一个有趣的问题,进行了一些思考。

场景大致是这样的:

问题来了,如果按照SA,SB的做法,SC面临的问题有两个:

一个直接的办法是在SM开始的时候,先去SC删除所有的数据,然后再将数据发送过去就可以了。但是这样带来的问题就是,万一后面导入失败了,而删除已经做了,会造成以前的数据也不可用。这在我们的业务场景里面是比较致命的,应该至少保证同步失败的时候,保持上一次的数据。基于这个场景,想了一个解决方案:

下面详细来说。假定我们是一个K-V类似的配置的导入,首先创建表和视图:

create table t_raw_config(
id int not null primary key auto_increment,
`version` char(6) not null,
name varchar(50) not null,
value varchar(100)
);

create view t_config
as
select id, name, value from t_raw_config;

在SM中,我们需要做的事情是: