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