孔令發(fā) 徐紀(jì)康 賈森
摘 要:本文提出了一種CBTC綜合維護(hù)管理系統(tǒng)(MMS)中前端頁面模塊與后端服務(wù)模塊的實時信息交換方法,該方法應(yīng)用層采用stomp協(xié)議,基于websocket通信。在基于B/S架構(gòu)的軌道交通綜合維護(hù)管理系統(tǒng)中,服務(wù)器系統(tǒng)分為兩部分:后端服務(wù)模塊和前端頁面顯示模塊。后端服務(wù)模塊實時向前端頁面模塊發(fā)送消息,前端頁面顯示模塊收到消息之后,解析并實時顯示狀態(tài)更新。本方法,通過在CBTC綜合維護(hù)管理系統(tǒng)中增加消息代理服務(wù)器,對服務(wù)器的后端服務(wù)模塊和前端頁面展示模塊進(jìn)行了解耦,并提供了后端服務(wù)模塊和前端頁面顯示模塊的通用應(yīng)用層協(xié)議封裝,提供了客戶端消息定義的管理和自動發(fā)布功能。增強(qiáng)了后端服務(wù)模塊的擴(kuò)展能力,簡化了后端服務(wù)模塊開發(fā),通過向客戶端廣播實時消息,節(jié)省了帶寬,減少了后端服務(wù)模塊的負(fù)載。
關(guān)鍵詞:CBTC 綜合維護(hù)管理系統(tǒng) Websocket Stomp Active MQ 消息代理
中圖分類號:TP27 文獻(xiàn)標(biāo)識碼:A 文章編號:1672-3791(2018)02(a)-0042-05
城市軌道交通控制系統(tǒng)包含CBI、ZC、ATS、OBCU,他們共同協(xié)作,完成軌道交通的運營。在軌道交通信號系統(tǒng)建設(shè)完成之后,對這些控制子系統(tǒng)的和信號設(shè)備、機(jī)房設(shè)備的運行維護(hù)成為工作的重點。保障和提供運維的水平和效率,對軌道交通系統(tǒng)的正常運營具有重要意義。因此,需要有一個系統(tǒng),能夠接收、整合所有控制子系統(tǒng)的維護(hù)信息,能夠及時監(jiān)測信號設(shè)備和機(jī)房設(shè)備的運行狀態(tài),并能夠?qū)崟r報警和趨勢性預(yù)警信息及時提供報警提示。
在此背景下,采用B/S架構(gòu)的CBTC綜合維護(hù)管理系統(tǒng)(MMS,Maintenance Management System)應(yīng)運而生。
1 背景分析
目前的web應(yīng)用中,后端服務(wù)器系統(tǒng)與前端頁面的數(shù)據(jù)交互,通常采用方法有Ajax、輪詢、websocket以及其他技術(shù)。
采用Ajax,解決了頁面部分刷新、服務(wù)器負(fù)載分擔(dān)的問題,客戶端和服務(wù)器異步通信,使得服務(wù)器可以更快的響應(yīng)頁面操作;采用輪詢方式,服務(wù)器和頁面實現(xiàn)邏輯簡單,易于操作;采用websocket,可以保證應(yīng)用的實時性;采用其他方式,也都具有各自的特點。
在以上這些方法中,有一個共同的特點:由前端頁面發(fā)起請求到服務(wù)器,由服務(wù)器處理所有頁面的請求和客戶端的管理。由此也帶來了一些問題,主要表現(xiàn)為:
(1)服務(wù)器不能及時把數(shù)據(jù)變化推送到客戶端,實時性差。主要表現(xiàn)在采用Ajax和輪詢方式。采用輪詢方式,還占用了比較多的帶寬和服務(wù)器資源,重復(fù)請求等,浪費比較多的資源。
(2)后端服務(wù)模塊和前端頁面展示模塊耦合度較高,導(dǎo)致服務(wù)器的擴(kuò)展性較差。
(3)后端服務(wù)模塊要管理所有客戶端的信息訂閱,及信息發(fā)布,導(dǎo)致服務(wù)器開發(fā)復(fù)雜,且服務(wù)器負(fù)載較高。
MQ全稱為Message Queue,消息隊列(MQ)是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過寫和檢索出入列隊的針對應(yīng)用程序的數(shù)據(jù)(消息)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如遠(yuǎn)程過程調(diào)用的技術(shù)。排隊指的是應(yīng)用程序通過隊列來通信。隊列的使用除去了接收和發(fā)送應(yīng)用程序同時執(zhí)行的要求。
在事件驅(qū)動架構(gòu)的異步系統(tǒng)中,經(jīng)常采用MQ作為事件驅(qū)動架構(gòu)的主干,從而解耦不同的模塊應(yīng)用,提高服務(wù)器負(fù)載、高可用性以及更好的系統(tǒng)擴(kuò)展性。
本文方法采用的消息服務(wù)器是消息中間件MQ,采用開源ActiveMQ實現(xiàn)。ActiveMQ是Apache出品,最流行的、能力強(qiáng)勁的開源消息總線,也是一個中間件產(chǎn)品。它是JMS的一個實現(xiàn)。AcitveMQ提供了兩種消息傳遞模型,PTP(即點對點模型)和Pub/Sub(即發(fā)布/訂閱模型),分別稱作:PTP Domain和Pub/Sub Domain。
(1)PTP(使用Queue,即隊列目標(biāo))消息從一個生產(chǎn)者傳送至一個消費者。在此傳送模型中,目標(biāo)是一個隊列。消息首先被傳送至隊列目標(biāo),然后根據(jù)隊列傳送策略,從該隊列將消息傳送至向此隊列進(jìn)行注冊的某一個消費者,一次只傳送一條消息??梢韵蜿犃心繕?biāo)發(fā)送消息的生產(chǎn)者的數(shù)量沒有限制,但每條消息只能發(fā)送至、并由一個消費者成功使用。如果沒有已經(jīng)向隊列目標(biāo)注冊的消費者,隊列將保留它收到的消息,并在某個消費者向該隊列進(jìn)行注冊時將消息傳送給該消費者。
(2)Pub/Sub(使用Topic,即主題目標(biāo))消息從一個生產(chǎn)者傳送至任意數(shù)量的消費者。在此傳送模型中,目標(biāo)是一個主題。消息首先被傳送至主題目標(biāo),然后傳送至所有已訂閱此主題的活動消費者??梢韵蛑黝}目標(biāo)發(fā)送消息的生產(chǎn)者的數(shù)量沒有限制,并且每個消息可以發(fā)送至任意數(shù)量的訂閱消費者。主題目標(biāo)也支持持久訂閱的概念。持久訂閱表示消費者已向主題目標(biāo)進(jìn)行注冊,但在消息傳送時此消費者可以處于非活動狀態(tài)。當(dāng)此消費者再次處于活動狀態(tài)時,它將接收此信息。如果沒有已經(jīng)向主題目標(biāo)注冊的消費者,主題不保留其接收到的消息,除非有非活動消費者注冊了持久訂閱。
2 系統(tǒng)設(shè)計
基于以上考慮,本文提出一種事件驅(qū)動的異步實時信息發(fā)布方法。
(1)在服務(wù)器增加一個消息代理服務(wù)器,作為事件驅(qū)動的主干,負(fù)責(zé)Topic管理,訂閱管理,消息接收和廣播等。
(2)MMS服務(wù)器后端模塊作為消息的生產(chǎn)者,負(fù)責(zé)把實時信息以消息的形式,發(fā)送到消息代理服務(wù)器的Topic。
(3)MMS服務(wù)器前端模塊作為消息的消費者,在頁面打開時,向消息代理服務(wù)器訂閱相關(guān)的Topic,并在頁面關(guān)閉時,取消訂閱。
(4)當(dāng)MMS服務(wù)器后端模塊接收到從控制子系統(tǒng)發(fā)送的實時信息之后,轉(zhuǎn)換為json的形式,發(fā)送到消息代理服務(wù)器的具體Topic;消息代理服務(wù)器把消息廣播至所有訂閱了該Topic的所有頁面;頁面接收到廣播之后,對頁面的相關(guān)狀態(tài)進(jìn)行更新顯示。
(5)系統(tǒng)軟件架構(gòu)采用JavaEE架構(gòu)。該方法具體包括:后端服務(wù)模塊,消息代理服務(wù)器,前端頁面顯示模塊。系統(tǒng)框圖如圖1所示。