韓勇 余勇 張玉壘
摘 要:文中提出了基于分布式服務(wù)的組態(tài)圖形數(shù)據(jù)更新方案。數(shù)據(jù)監(jiān)測服務(wù)監(jiān)測到數(shù)據(jù)變化時,變化的數(shù)據(jù)更新到redis實時庫緩存,同時把變化的數(shù)據(jù)推送到Kafka總線,Kafka消費者監(jiān)聽到消息后通過Websocket把變化的數(shù)據(jù)推送到前端頁面,前端頁面解析數(shù)據(jù)后展示,完成圖形數(shù)據(jù)的刷新。
關(guān)鍵詞:組態(tài)圖形;分布式;數(shù)據(jù)更新;實時推送
中圖分類號:TM734 文獻標識碼:A
1 主要技術(shù)簡介
1.1 Websocket技術(shù)
Websocket 是 HTML5 開始提供的一種在單個TCP連接上進行全雙工通訊的協(xié)議。在Websocket API 中,瀏覽器和服務(wù)器只需完成一次握手,兩者就直接可以創(chuàng)建持久性的連接,進行雙向數(shù)據(jù)傳輸。傳統(tǒng)技術(shù)下實現(xiàn)推送,所用的方案都是 Ajax 輪詢。這種傳統(tǒng)的模式瀏覽器需要不斷的向服務(wù)器發(fā)出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數(shù)據(jù)可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。這種場景下,Websocket 協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實時地進行通訊。
1.2 Kafka技術(shù)
Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)和強大的分布式消息隊列,能夠?qū)⑾囊粋€端點傳遞到另一個端點,具有高性能、持久化、多副本備份、橫向擴展能力,可以處理大量的數(shù)據(jù)。Kafka消息保留在磁盤上,并在群集內(nèi)復(fù)制以防止數(shù)據(jù)丟失。
1.3 redis技術(shù)
redis 是一個完全開源的、高性能的 key-value 內(nèi)存型數(shù)據(jù)庫,可以用作數(shù)據(jù)庫、緩存和消息中間件。它支持多種類型的數(shù)據(jù)結(jié)構(gòu),如字符串,散列,列表,集合,有序集合等。 Redis 內(nèi)置了復(fù)制,LUA腳本, LR驅(qū)動事件,事務(wù)和不同級別的磁盤持久化,并通過 Redis哨兵和自動分區(qū)提供高可用性。
2 系統(tǒng)設(shè)計與實現(xiàn)
2.1 系統(tǒng)架構(gòu)
系統(tǒng)主要包含數(shù)據(jù)監(jiān)測服務(wù)、Kafka總線服務(wù)、redis實時數(shù)據(jù)緩存服務(wù)、Websocket消息推送服務(wù)和文件服務(wù)等(如圖1)。
2.2 數(shù)據(jù)更新流程
(1)前端頁面請求組態(tài)文件。前端頁面初始化加載時,向文件服務(wù)發(fā)送帶有文件版本信息的請求,文件服務(wù)判斷文件版本信息后通知頁面是否需要下載組態(tài)文件,前端頁面接收到返回信息后下載相應(yīng)的組態(tài)文件或讀取本地緩存的組態(tài)文件。
(2)前端頁面初始化。頁面加載完成DOM元素后,使用js解析組態(tài)文件,完成組態(tài)圖形繪制,并與Websocket服務(wù)器創(chuàng)建連接,等待數(shù)據(jù)推送。
(3)頁面數(shù)據(jù)初始化。頁面初始化完成后,首先讀取redis緩存中的最新數(shù)據(jù),用于刷新組態(tài)畫面中各圖符的當前狀態(tài)。
(4)數(shù)據(jù)監(jiān)測服務(wù)實時監(jiān)測數(shù)據(jù)變化。在數(shù)據(jù)變化時將數(shù)據(jù)更新到redis實時庫中,并調(diào)用Kafka生產(chǎn)者的接口把變化的數(shù)據(jù)推送到Kafka總線上。
(5)Kafka消費者偵聽到總線數(shù)據(jù)后獲取數(shù)據(jù)。調(diào)用Websocket服務(wù)接口,把數(shù)據(jù)推送到前端頁面,通過前端js解析處理后展示,完成組態(tài)圖形數(shù)據(jù)刷新(如圖2)。
2.3 技術(shù)要點
(1)數(shù)據(jù)變化檢測機制。服務(wù)端只向前端頁面發(fā)送變化的數(shù)據(jù),而不是發(fā)送所有數(shù)據(jù),數(shù)據(jù)量更小,節(jié)省了帶寬,傳輸效率更高。為了保障實時性,數(shù)據(jù)檢測服務(wù)端通過對比站端設(shè)備上送的最新數(shù)據(jù)和redis實時庫中緩存數(shù)據(jù)值來判斷數(shù)據(jù)是否變化,如果數(shù)據(jù)有變化,則更新實時庫緩存,并立即發(fā)送變化的數(shù)據(jù)到Kafka總線,Kafka消費者監(jiān)聽到消息后立即推送到頁面,數(shù)據(jù)即可刷新。
(2)頁面緩存機制。頁面初始化加載時,會讀取Cookie中的文件版本信息,然后向文件服務(wù)發(fā)送帶有版本信息的請求,格式如下:
{
"name":”s1.xml”,
"version":”1.0”, //版本信息
"time":1566530919566, //時間戳,記錄了最后一次修改時間
}
如果未讀取到Cookie中版本信息,或者當前緩存文件版本與文件服務(wù)器中文件版本不一致,則重新下載相關(guān)文件并緩存到本地,同時更新文件版本信息到Cookie中。頁面緩存機制避免了重復(fù)大量的文件傳輸過程,節(jié)省了帶寬。
3 結(jié)束語
本文提出了一種基于分布式服務(wù)的組態(tài)圖形數(shù)據(jù)更新方案,采用了主流的redis、Kafka、Websocket等中間件來作為技術(shù)支撐,通過數(shù)據(jù)變化更新機制和頁面緩存機制來優(yōu)化數(shù)據(jù)傳輸,保證了數(shù)據(jù)的實時性、高效性、穩(wěn)定性。由于研究工作的局限性,目前尚未具體評估高并發(fā)情景下的性能瓶頸,但經(jīng)實際驗證能夠滿足電力系統(tǒng)日常運行需求。
參考文獻:
[1]汪映輝,吾喻明.基于SVG的電力調(diào)度自動化系統(tǒng)實時畫面的WEB發(fā)布[J].應(yīng)用科技,2008,21(14):5-76.
[2]吳志芳,陳傳波,劉昕.電力生產(chǎn)實時畫面的WEB發(fā)布[J].實踐經(jīng)驗,2000,19(10):54-56.
[3]陳傳波,王菁,鄧凱.基于SVG的實時數(shù)據(jù)動態(tài)發(fā)布技術(shù)的研究[J].小型微型計算機系統(tǒng),2008,29(05):609-612.
[4]張榮,郭立君,劉箴.基于SVG的實時監(jiān)控系統(tǒng)設(shè)計與實現(xiàn)[J].微電子學(xué)與計算機,2006,35(06):223-226.