当我们从第三方系统同步数据时,很容易遇到一个增量同步的陷阱。
假设我们有如下场景:
我们要从人员管理系统同步在职人员,采用增量拉取的方式。
即人员管理系统提供一个接口,返回近期创建或者发生变化的在职人员,其SQL如下:
select * from staff where status=1 and
(create_time >= #{startDate} or update_time >= #{startDate})
看着好像没有问题,但是如果之前有人员是在职的,后来离职了,上面这个SQL是查不到的。
但是我们之前已经同步到了这个人员,这就造成数据不一致了。
怎么解决这个问题呢?
第一种方案:采用全量,适合数据量不大场景。数据同步的时候进行双向对比:有则更新,无则插入,他们无我们有则标记删除。这种方式实现起来比较简单,缺点是由于我们是全量同步过来的,因此我们系统里面在查询数据的时候,就必须附加上状态过滤条件。
第二种方案:仍然采用增量,但是对于更新不限制状态。SQL类似:
select * from staff where
(status=1 and create_time >= #{startDate}) or update_time >= #{startDate}
我们的程序处理逻辑大致如下:
- 首先,判断状态
- 对于在职的人员,处理逻辑:有则更新,无则插入
- 对于离职的人员,处理逻辑:如果之前同步过,则标记无效,否则不处理。
不知道大家有没有更好的处理办法。