可以有多个思路
方案一:
执行一个job,定时每天凌晨「业务低峰期」开始执行,从mongo查询,写入的PG,最后从mongo删除。
方案二:
业务上双写,mongo和PG双写,启动定时任务清理mongo数据即可,数据准确性高。
方案三:
可以通过ETL工具实时采集openlog同步到PG,启动定时任务删除mongo
给mongodb 时间字段加索引 每次查询10w条数据,按时间升序排,limit 100000 等于走索引查询第一页(查询三个月之前的条件不赘述,忽略) 一次性查10w条 ,partion 2000转List<List<>>, 放redis ,先进先出,RPUSH
while(true){
1.查询redis pageList
if(pageList数组不为空){
查询数据是否在pg存在 (因为 pg库插入成功了,那么就一定删除成功了, 可以查询mongo不存在, 或者pg库直接查询报DuplicateKeyException )
if(已存在){
删除redis
continue;
}
执行 handle(pageList)
continue;
}
2.走索引查询mongo第一页 pageList
if(pageList数组不为空){
执行 handle(pageList)
continue;
}
break;
}
public void handle(pageList){
1.数据保存redis
2.开启事务
插入pg
(子线程删除mongodb 且返回成功与否, 失败结束) 不用子线程可以保存事务点
提交事务 (tip: 当插入 和 删除 都执行成功时, 事务即将提交的时候,提交失败了,会导致数据丢失)
3.删除redis (tip: 上面执行都成功了, 删除redis可能失败)
}