數(shù)據(jù)上報:
MQ:之前是單個隊列,改為多隊列,通過SN hash分發(fā)
getLastData: 之前每次都從redis或數(shù)據(jù)庫讀取。 改為只有首次循環(huán)讀redis或數(shù)據(jù)庫,其他都從循環(huán)的局部遍歷獲取
setLastData: 之前是每次都寫。改為循環(huán)結(jié)束再寫庫
writeData: 循環(huán)結(jié)束后批量寫庫
addTemp: 加spring cache緩存
重計算:
增加springcache緩存: 查設(shè)備,查MP,查參數(shù),查模型
查詢語句優(yōu)化: 查詢time時間范圍能用等于的就用等于,不要用大于小于
縮短查詢的時間范圍,對于需要大時間范圍查詢的,采用多次嘗試,先嘗試小范圍查詢
select last和select first也要加上時間范圍
線程模型優(yōu)化:不同階段,任務(wù)類型的線程池分開
VEE: 由xxljob給每個facility生成一個任務(wù)放到MQ里
計算facility時,給每個設(shè)備生成一個CompletableFuture放到線程池并發(fā)執(zhí)行
join后再執(zhí)行下一階段(調(diào)用calc)
calc階段: 查詢該facility需要計算的設(shè)備后,同樣的給每個設(shè)備生成一個CompletableFuture放線程池并發(fā)執(zhí)行
join后通知下一階段(billing)
VEE查詢last:改為多次嘗試,先查7天內(nèi)的,沒有再查半年內(nèi)的
calc獲取參數(shù):之前是每次查一個時間點,改為每次查整個時間段的,但是仍然是只查一個參數(shù),因為公式里很可能是不同設(shè)備的參數(shù),不好一起查詢
getLastAcc: 一個循環(huán)內(nèi)只有首次去查數(shù)據(jù)庫,其他都通過局部變量傳遞。 先查5分鐘的,沒有查1天內(nèi)的。
寫數(shù)據(jù): 之前是每次寫一個時間點的,改為批量寫整個時間段的
線程池統(tǒng)一管理:線程池統(tǒng)一用ThreadPoolTaskExecutor,都注冊為bean,提供接口查詢和修改配置
總結(jié):
rabbitmq單隊列模式改為多隊列,通過hash分發(fā),增加吞吐量
經(jīng)常查詢的數(shù)據(jù)加緩存
查influxdb時,如果時間范圍很大,采用多次查詢的方法,先查詢一個小的時間范圍,再擴(kuò)大查詢的時間范圍
查詢數(shù)據(jù)時采用批量查詢,一次查詢批量的參數(shù)或時間點
寫數(shù)據(jù)庫時,采用批量寫入
在for循環(huán)中,如果涉及查詢上一次數(shù)據(jù)時,僅首次循環(huán)查數(shù)據(jù)庫
采用線程池增加并發(fā),不同階段采用獨立的線程池,使用CompletableFuture對子任務(wù)進(jìn)行分解