大數據高併發場景下存量/增量指標實時計算方法

業務場景:

設備每10分鐘上報一次A指標數據,需要對設備的A指標數據進行日增量/存量打標。即對於A指標,標記設備是存量設備還是增量設備。
日存量/增量判斷標準:將當日設備上報A指標數據的總次數,與該設備前30天內上報的A指標數據的總次數進行對比。假如前30天內總次數超過n次且當日上報A指標數據的總次數超過n次則爲該設備打存量標記。假如前30天內總次數小於n次且當日上報A指標數據的總次數超過n次則爲該設備打增量標記。

設備數量上百萬,且都按每10分鐘一次進行指標數據上報。如何在大數據量且高併發的場景下快速的對設備進行存量/增量標記。

解決方式一:

在設備每次上報時進行打標。
使用redis緩存,一個key對應一個設備近30天每天的A指標數據出現次數,可以是一個json數組:

[{'day':'yyyyMMdd-1',‘aCount’:n-1},{'day':'yyyyMMdd-2',‘aCount’:n-2}...,{'day':'yyyyMMdd-30',‘aCount’:n-30},{'day':'yyyyMMdd-n',‘aCount’:n-current}]

每次上報都到redis中查詢對應key,對json數組進行維護,刪除前30天之外jsonobject,同時對30天內的指標總數進行累加。查詢當日的jsonobject中A指標數據總數,進行對比並做存量增量判斷。最後將當日A指標總數進行更新,對於當日第一次A指標上報進行json數組的追加操作,第二次以上進行json數組的替換操作。整個key設置31天過期。

解決方式二:

在多線程和高併發場景下,如果因爲前置組件發生消息堆積,導致一批數據中存在多個同一設備多條A指標數據報文。而有多個線程同時對某個設備多條A指標數據報文進行處理,使用方式一會存在A指標數據計數總量不準確的情況。考慮在A的整個邏輯之外增加一個基於redis的有過期時間的分佈式鎖。當某個線程對指定設備的A指標進行計數和判斷時,加分佈式鎖,其他線程遇鎖等待,直到鎖釋放或者過期,再執行增量/存量判斷。

解決方式三:

使用定時任務離線異步的進行處理。持久化每日所有設備的A指標數據發生次數,某個時間點對當日所有設備進行判斷,分別比對其前30天的指標總次數,進行打標。

該方法有如下不足:
1.需要開闢更多磁盤空間。
2.定時任務執行時間有限制,需慎重選擇。
3.假如有後置任務需要依賴存量/增量標識,會存在定時任務執行超時或者執行異常導致後置任務受影響的可能。

如有更簡單高效方法歡迎留言~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章