性能優(yōu)化記錄

數(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)行分解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容