问题
A表里有一个sync字段,表示同步状态,0表示未同步,1表示同步成功。当有数据从业务方推送过来时更新或者插入时,sync会变为0。
现在有一个扫库的定时任务,匹配条件是A表的sync字段为0且relId不为空,一次性扫描200条记录,然后按照主键id生序排列,会利用这批记录的relId字段去匹配B表的dataOriginId,对于匹配成功的记录会推送给下游系统,然后将sync改为1。因为dataOriginId的字段可能为空,所以这部分记录会失败,下次再扫描的时候这部分记录还是会被捞出来。
方案一
根据你的描述,任务的主要挑战是处理 B 表中 dataOriginId 为空的记录。如果 dataOriginId 为空,匹配操作将失败,这部分记录会在下次扫描时再次被扫描到。可以考虑如下策略来处理这个问题:
- 扫描 A 表中 sync 字段为 0 且 relId 不为空的记录,按 id 降序排列,并限制为 200 条。
使用这些记录的 relId 字段去匹配 B 表的 dataOriginId 字段。 - 对于匹配失败的记录,可以更新其状态,将这些记录标记为未处理或需要特殊处理,以避免下次依然扫描到这些记录。
- 可以记录这些失败的条目以便后续处理。
3 方案二:考虑到增量扫库
我的方案是对于一次定时任务,第i次扫库时是接着上一条扫描批次的最大id之后开始扫。
4 方案三:考虑到实际变动频率
(1)考虑到A表的变动频率,查找了一下生产环境的a表最近1分钟新插入和变动记录条数,发现不过20来条,那么就算20条中有10条是存在“上述不能匹配”,因为一次扫库200,就算是第二次扫库还有190条正常记录会被推送,所以对下游系统没有影响。但是如果变动频率是每分钟500条,有超过200条的记录可能存在“不能匹配”问题,那么就不能使用此方案。
(2)其次,对于不满足匹配的记录,可以打error日志,告警平台会推送,我们程序员自己处理这种异常数据,随后的推送就是正常了。