背景:
需要把mysql的数据同步到es中。由于没有维护canal集群, 我们选择了通过记录最后一次同步数据的update_time来进行数据同步。
具体的做法,当有数据变更的时候,发个消息,表示需要进行数据同步。
消息的监听者加锁串行执行, 从要同步数据的表中获取上一次update_time之后的数据,并且把最后一条记录的update_time更新回去。
比如说有用户表
user
id:int
name:varchar
update_time:datetime
sync_log
syc_table_name
last_update_time
从sync_log中获取last_update_time, 执行sql: select * from user where update_time>=last_update_time.
问题:
我们当时限制了一次取一千条出来,发现在有DB工单执行,批量更新数据出现了死循环,
导致所有MQ消费线程被占用,其他消息无法消费,产生了消息堆积,因为写了一段代码
结果集=select * from user where update_time>=last_update_time limit 1000
while(非空结果集合){
同步数据
结果集=select * from user where update_time>=last_update_time limit 1000
}
一般情况是不会有问题的,当一秒有大量更新的时候,比如说一秒有2000条更新记录就有问题了。
问题的核心就