数据上报:
MQ:之前是单个队列,改为多队列,通过SN hash分发
getLastData: 之前每次都从redis或数据库读取。 改为只有首次循环读redis或数据库,其他都从循环的局部遍历获取
setLastData: 之前是每次都写。改为循环结束再写库
writeData: 循环结束后批量写库
addTemp: 加spring cache缓存
重计算:
增加springcache缓存: 查设备,查MP,查参数,查模型
查询语句优化: 查询time时间范围能用等于的就用等于,不要用大于小于
缩短查询的时间范围,对于需要大时间范围查询的,采用多次尝试,先尝试小范围查询
select last和select first也要加上时间范围
线程模型优化:不同阶段,任务类型的线程池分开
VEE: 由xxljob给每个facility生成一个任务放到MQ里
计算facility时,给每个设备生成一个CompletableFuture放到线程池并发执行
join后再执行下一阶段(调用calc)
calc阶段: 查询该facility需要计算的设备后,同样的给每个设备生成一个CompletableFuture放线程池并发执行
join后通知下一阶段(billing)
VEE查询last:改为多次尝试,先查7天内的,没有再查半年内的
calc获取参数:之前是每次查一个时间点,改为每次查整个时间段的,但是仍然是只查一个参数,因为公式里很可能是不同设备的参数,不好一起查询
getLastAcc: 一个循环内只有首次去查数据库,其他都通过局部变量传递。 先查5分钟的,没有查1天内的。
写数据: 之前是每次写一个时间点的,改为批量写整个时间段的
线程池统一管理:线程池统一用ThreadPoolTaskExecutor,都注册为bean,提供接口查询和修改配置
总结:
rabbitmq单队列模式改为多队列,通过hash分发,增加吞吐量
经常查询的数据加缓存
查influxdb时,如果时间范围很大,采用多次查询的方法,先查询一个小的时间范围,再扩大查询的时间范围
查询数据时采用批量查询,一次查询批量的参数或时间点
写数据库时,采用批量写入
在for循环中,如果涉及查询上一次数据时,仅首次循环查数据库
采用线程池增加并发,不同阶段采用独立的线程池,使用CompletableFuture对子任务进行分解