增量同步陷阱

当我们从第三方系统同步数据时,很容易遇到一个增量同步的陷阱。

假设我们有如下场景:
我们要从人员管理系统同步在职人员,采用增量拉取的方式。
即人员管理系统提供一个接口,返回近期创建或者发生变化的在职人员,其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}

我们的程序处理逻辑大致如下:

  1. 首先,判断状态
  2. 对于在职的人员,处理逻辑:有则更新,无则插入
  3. 对于离职的人员,处理逻辑:如果之前同步过,则标记无效,否则不处理。

不知道大家有没有更好的处理办法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值