功能描述
左侧虚线框内是我司网管和基站,右侧黄色是运营商网管,我司网管EMS负责将基站上报的数据周期(15min)性地推送给运营商网管。
下图和文字描述待修改补充,可以先看下
下图是网管EMS的任务流,在网管上建立数据上报任务后,基站才能上报数据,否则基站不会主动上报;
两个服务之间通过Restful接口调用还是发送消息?用到分布式事务?
项目需求明细:
1.解析入库服务:
1.现网最多3万个基站,10万个小区(每个基站3,4个小区),每个子网有1000个基站,每个子网每15分钟会通过FTP推送一个tar.gz文件给EMS。一个tar.gz中包含100个CSV文件,每个CSV文件最多含有96000行数据,不同的csv文件中记录数会不同,每行数据大概有20多个字段,不同csv文件的字段个数也不一样,这些字段包含小区唯一标识和20来个性能指标值(例如小区掉话率,小区功率....),详见数据库表字段和基站上报文件样例;
2.数据解析入库服务收到tar.gz文件后,会立即解压解析文件,然后入到性能库,性能库表个数也是100,和csv文件一一对应;
3.当基站断网时,可能会出现某个或某几个基站和EMS出现断链情况,待重新建链之后,基站侧积压的数据会继续上传到EMS,然后入库并且发送MQ消息;EMS通过文件名中的时间信息判断该文件是否是断网期数据:如果是,入完库后将发送MQ消息;如果不是,入完库后不发送MQ消息;
4.EMS网管升级时,会停机两小时,此时目录下回积压8轮数据,处理压力较大。
TODO:
1.NIO解压文件解析文件
2.更新网络拓扑,加入OMMB处理
2.查询写文件服务:
1.该服务开启一个定时器,每15分钟查询从性能库中查询一轮数据,将基站刚刚上报的最近一轮性能数据查出来,再查询一轮配置库,关联查询后取出配置库的某个字段比如cell_name,将cell_name的值和性能数据拼接后写入CSV文件;待所有的数据表查询完毕后将csv进行打包压缩成tar.gz文件,上传到运营商网管NMS,见下面三张贴图
2.该服务还要监听MQ中迟到的入库完成消息,提取消息内容中begintime,subnetid,neid信息,用于查询断网后延迟上报的数据,生成tar.gz文件,文件名有RECOLLECT标识。
3.配置库cm的数据来源于其他服务,很少变更,频率可能是几天,几个月一次。用redis缓存,对于修改的数据,更新缓存?
1.性能数据库(PM)中cell_s2表记录
2.配置库(CM)cell表数据
3.推送给运营商NMS的cell_s2的csv文件,在性能库数据的基础上加了一列cell_name字段
3.附件:
1.性能库(pm)和配置库(cm)的sql,跑完之后看pm库cell_s2表中有数据样例,cm库两个表都有数据样例
2.基站上报的文件样例,每个子网上报一个tar.gz文件,最多包含1000个基站的数据
3.EMS上报给运营商网管的文件样例,只有cell_s2.csv模拟了数据,其他的别看。
CMCC_202205050900_NORMAL.tar.gz为基站没有断网上报的文件
CMCC_202205050900_RECOLLECT_1.tar.gz,CMCC_202205050900_RECOLLECT_2.tar.gz 为断网期的文件
4.数据量:
1.性能库(PM)中数据的保存时长为7天,有定时任务每天执行一次删除7天前数据的操作
2.性能库(PM)中共有100张表,其中有20张表每张表一轮数据记录320万行,一天上报96轮,3亿行,7天21亿行;
其余80张表,每一轮数据有10万行,一天960万行,7天7000万行
3.数据库索引begin_time字段?
每天会把数据备份到另外的数据DB2中去,而当天只用从库DB1。
5.问题:
1.如果数据查询写文件服务同时开起5个实例,每个实例查询20张表,进行负载均衡,如何分配每个实例应该查询哪些表?
新建两张表:
第一张表存取实例和哪些表的映射关系,IP地址和PORT,表的起止号段;
第二张表存取性能表ID和表明映射关系;
2.数据库读写分离有主从库的同步延时,持续读写的场景,如何做到主从库的数据及时性?
无法解决,如果保证强一致,必须主库写读。
拆分成五个库,水平拆分,都用来写读。
解压,解析,入库,通过MQ互相调用。
可能会问Mycat和shardingJDBC。
3.分布式事务,分布式锁能否使用到?
分布式事务用不上,
分布式锁用于查询等待入库完成之后再去查询。
4.分布式缓存用于缓存配置库数据?
可以,redis
5.查询写文件服务要开启一个定时器,单个服务多实例代码都是一样的,如何做到只让一个实例跑定时任务?
启动一个Job服务专门定时器,调用其他5个服务进行查询写文件,最后在Job服务中打包压缩汇总。