余永城,翁秋華,段 卿,袁 偉
(福建省氣象信息中心,福建 福州 350001)
氣象通信系統(tǒng)是承擔(dān)氣象觀測數(shù)據(jù)從臺站生成—省級—國家級的收集、處理、分發(fā)的一套業(yè)務(wù)系統(tǒng)[1-2]?,F(xiàn)有的氣象通信系統(tǒng)1.0版本是基于傳統(tǒng)的FTP文件傳輸方式進(jìn)行觀測數(shù)據(jù)的收集處理的,因?yàn)槭俏募壍膫鬏?,需要在服?wù)器上落盤處理,因此對服務(wù)器磁盤的I/O性能要求比較高。同時(shí),基于TCP/IP協(xié)議的FTP文件傳輸方式存在諸如效率低下和數(shù)據(jù)傳輸模式不合理等問題。隨著現(xiàn)代氣象自動(dòng)觀測技術(shù)的迅速發(fā)展,氣象資料的數(shù)量及類型都大大增加。重要的氣象觀測資料產(chǎn)生的頻次已經(jīng)提升到了分鐘級,傳輸?shù)臅r(shí)效也提高到了秒級。目前的氣象通信系統(tǒng)1.0版本已無法滿足大數(shù)量、高頻次、多種類的觀測數(shù)據(jù)高時(shí)效傳輸。因此如何快速地將觀測數(shù)據(jù)通過氣象通信系統(tǒng)傳輸?shù)绞〖壓蛧壹壥呛荜P(guān)鍵的。
RabbitMQ消息隊(duì)列技術(shù)支持多種客戶端,非常適合在分布式計(jì)算系統(tǒng)消息存儲轉(zhuǎn)發(fā)的場景中使用[3]。RabbitMQ采用Socket傳輸協(xié)議,服務(wù)器端支持隊(duì)列持久化,可以有效保證各個(gè)傳輸環(huán)節(jié)中數(shù)據(jù)的完整性[4],同時(shí)RabbitMQ提供路由控制轉(zhuǎn)發(fā)功能符合氣象數(shù)據(jù)傳輸?shù)臉I(yè)務(wù)需求。通過對RabbitMQ消息隊(duì)列技術(shù)在氣象通信系統(tǒng)中的應(yīng)用研究,設(shè)計(jì)開發(fā)了基于消息通信傳輸模式的氣象通信系統(tǒng)2.0版本。
消息是消息隊(duì)列中的最小單元,實(shí)質(zhì)上是一段可由一個(gè)或多個(gè)應(yīng)用程序理解的數(shù)據(jù)[5-7],一般作為多個(gè)應(yīng)用程序之間的信息傳輸載體。消息隊(duì)列(message queue),也即消息中間件,具有流量控制、低耦合、廣播、高效、可靠投遞、一致性等功能。消息隊(duì)列通過其高可靠的傳遞機(jī)制可進(jìn)行和平臺無關(guān)的數(shù)據(jù)交換[8-11]。消息隊(duì)列技術(shù)正逐漸成為各行業(yè)通信系統(tǒng)中廣泛使用的核心技術(shù),目前市面上有很多主流消息隊(duì)列中間件,如ActiveMQ,RabbitMQ,Kafka,RocketMQ等。
消息中間件常見的有兩種傳遞方式:點(diǎn)對點(diǎn)(Point-to-Point)方式和發(fā)布/訂閱(Pub/Sub)方式[12]。Point-to-Point方式是基于隊(duì)列的。發(fā)布者將消息發(fā)布到隊(duì)列中,消息訂閱者從隊(duì)列中獲取消息。由于隊(duì)列的這種點(diǎn)對點(diǎn)傳遞機(jī)制,使得消息具備異步傳輸?shù)墓δ堋ub/Sub方式定義了向一個(gè)主題(Topic)發(fā)布消息還是訂閱消息。在消息傳遞的過程中,主題作為傳輸介質(zhì),消息發(fā)布者和訂閱者都要依靠主題進(jìn)行,發(fā)布者將消息發(fā)布到主題中,訂閱者則訂閱來自主題中的消息。
高級消息隊(duì)列協(xié)議(advanced message queuing protocol,AMQP)是一個(gè)面向消息的中間件設(shè)計(jì)的應(yīng)用層協(xié)議開放標(biāo)準(zhǔn)[13]。無論客戶端/中間件不同的產(chǎn)品,不同的開發(fā)語言等,只要基于此協(xié)議的客戶端和消息中間件都可進(jìn)行消息的傳遞。主要特點(diǎn)是面向消息、隊(duì)列、路由、可靠、安全[14-15]。RabbitMQ是一個(gè)開源的AMQP的標(biāo)準(zhǔn)實(shí)現(xiàn),支持多種語言的客戶端,非常適合在分布式系統(tǒng)消息存儲轉(zhuǎn)發(fā)的場景中使用。RabbitMQ消息隊(duì)列采用Socket傳輸協(xié)議,服務(wù)端支持消息隊(duì)列的持久性,可以有效保證各個(gè)環(huán)節(jié)流轉(zhuǎn)過程的觀測數(shù)據(jù)完整性。同時(shí),RabbitMQ提供靈活的路由控制轉(zhuǎn)發(fā)功能,符合氣象數(shù)據(jù)傳輸?shù)臉I(yè)務(wù)需求。
RabbitMQ服務(wù)端主要由主題(Topic)和隊(duì)列(Queue)組成??蛻舳送ǔS袃煞N類型:發(fā)布者(Producer)和消費(fèi)者(Consumer)。主題負(fù)責(zé)接收消息和路由鍵值(Routing-Key)信息,然后根據(jù)路由鍵值信息將消息分配給消息隊(duì)列。RabbitMQ消息傳輸模式如圖1所示。首先,消息發(fā)布者P向主題X發(fā)送帶有路由鍵值R.#的消息。然后,服務(wù)端會(huì)根據(jù)路由鍵值信息將消息轉(zhuǎn)發(fā)到相應(yīng)的隊(duì)列Q中。最后,消費(fèi)者C就可以從隊(duì)列Q中獲取相應(yīng)的消息進(jìn)行消費(fèi)。
圖1 RabbitMQ消息傳輸模式
隨著自動(dòng)觀測技術(shù)的快速發(fā)展,氣象觀測資料產(chǎn)生的頻次已經(jīng)提升到了分鐘級。表1所示為部分的氣象觀測資料類型和它的數(shù)據(jù)傳輸頻次,每種資料大小都在200字節(jié)以上,有些可以達(dá)到幾KB,甚至幾MB。傳統(tǒng)TCP/IP協(xié)議的FTP文件傳輸方式已經(jīng)無法滿足這么高的傳輸頻次和海量觀測數(shù)據(jù)的傳輸需要,而且頻繁的文件讀寫,會(huì)大大影響服務(wù)器的整體性能。
表1 部分氣象觀測資料類型
續(xù)表1
為了解決觀測資料傳輸頻次和海量數(shù)據(jù)的傳輸問題,使用RabbitMQ消息隊(duì)列技術(shù)進(jìn)行數(shù)據(jù)的傳輸。不僅可以保證傳輸?shù)目煽啃?,還可以大大提高從臺站到省到國家的數(shù)據(jù)傳輸?shù)募皶r(shí)性。而且,在整個(gè)過程中,不會(huì)生成文件,這也會(huì)減少磁盤的讀寫。
基于RabbitMQ消息中間件技術(shù)開發(fā)的氣象通信系統(tǒng),包含消息傳輸客戶端,省級消息傳輸服務(wù)端和國家級消息傳輸服務(wù)端三大部分。其中,消息傳輸客戶端安裝在地面氣象觀測站,消息傳輸服務(wù)端分別部署在省級消息服務(wù)器和國家級消息服務(wù)器。氣象觀測數(shù)據(jù)消息傳輸流程如圖2所示,觀測臺站通過消息傳輸客戶端將ISOS軟件觀測到數(shù)據(jù)以消息的方式傳給省級下消息服務(wù)端,省級消息服務(wù)端通過配置shovel插件,將消息數(shù)據(jù)轉(zhuǎn)發(fā)到國家級的消息傳輸服務(wù)端。
通過研究RabbitMQ消息隊(duì)列技術(shù),結(jié)合氣象觀測數(shù)據(jù)的特點(diǎn),利用消息中間件傳輸觀測數(shù)據(jù),有必要設(shè)計(jì)傳輸過程中的數(shù)據(jù)格式,即數(shù)據(jù)消息封裝。文中制定了一種氣象數(shù)據(jù)的消息傳輸格式,它包括消息頭(Message Header)和消息體(Message Body)。消息頭以鍵值對的形式存放消息屬性,消息體則以字符串的形式存放報(bào)文信息。消息頭和消息體封裝成消息,然后發(fā)送到消息隊(duì)列中。在消息傳輸過程中,不需要對報(bào)文進(jìn)行解碼,通過讀取消息頭中的消息屬性就可以對需要監(jiān)視的信息進(jìn)行提取,減少了傳輸過程中的處理成本。
根據(jù)氣象數(shù)據(jù)的特點(diǎn),消息屬性的詳細(xì)設(shè)計(jì)如表2所示。為了排查重復(fù)發(fā)送的報(bào)文,將隨機(jī)UUID添加到消息屬性設(shè)計(jì)中作為消息傳輸?shù)奈ㄒ粯?biāo)識符;消息屬性里應(yīng)包含消息發(fā)布者和消息接收者信息,通過讀取屬性,就可以知道消息的轉(zhuǎn)發(fā)方式;氣象數(shù)據(jù)在各個(gè)傳輸環(huán)節(jié)中,需要加以監(jiān)視,因此消息屬性中應(yīng)該包含消息發(fā)送時(shí)間、站號、氣象資料四級編碼、觀測時(shí)間等監(jiān)視信息等。
氣象數(shù)據(jù)傳輸具有高度的時(shí)間敏感性,特別是對于國家級考核的資料要求的時(shí)效性更高。為了保證地面標(biāo)準(zhǔn)格式(BUFR)數(shù)據(jù)的秒級傳輸,設(shè)計(jì)了RabbitMQ多機(jī)多節(jié)點(diǎn)的集群部署模式,如圖3所示。臺站通過消息發(fā)送客戶端將消息發(fā)送到省級服務(wù)端,省級服務(wù)端通過HA-Proxy負(fù)載均衡技術(shù)將消息轉(zhuǎn)發(fā)給國家級服務(wù)端。HA-Proxy是一款高可用性、負(fù)載均衡以及基于四層TCP和七層HTTP應(yīng)用的代理軟件,它可以支持?jǐn)?shù)以萬計(jì)的并發(fā)連接[16]。
圖4為多次模擬RabbitMQ雙機(jī)多節(jié)點(diǎn)(1~8節(jié)點(diǎn))部署模式下,大批量消息數(shù)據(jù)從臺站生成到國家級接收的實(shí)際用時(shí)情況。從傳輸時(shí)效性曲線圖中可以得出結(jié)論:相同的測試環(huán)境下,不管是雙機(jī)單節(jié)點(diǎn)、雙機(jī)雙節(jié)點(diǎn)還是雙機(jī)8節(jié)點(diǎn),87%以上的消息數(shù)據(jù)都能在1秒內(nèi)完成臺站到國家級的傳輸,96%以上的數(shù)據(jù)都在2秒內(nèi)完成傳輸,全部的數(shù)據(jù)都能在10秒內(nèi)完成傳輸。從氣象資料時(shí)效性和服務(wù)器性能方面綜合考慮,決定在省級部署兩臺消息服務(wù)器,每臺服務(wù)器上部署八個(gè)RMQ節(jié)點(diǎn),就可實(shí)現(xiàn)氣象觀測數(shù)據(jù)的秒級傳輸。
圖3 RabbitMQ多機(jī)多節(jié)點(diǎn)集群部署模式
圖4 雙機(jī)多節(jié)點(diǎn)傳輸時(shí)效性測試結(jié)果
從實(shí)驗(yàn)結(jié)果可以看出,RabbitMQ多機(jī)多節(jié)點(diǎn)集群模式可以大幅度提升消息傳輸效率。不但如此,多機(jī)多節(jié)點(diǎn)的集群模式允許消息發(fā)布者與消費(fèi)者在某個(gè)RMQ節(jié)點(diǎn)意外宕機(jī)的情況下繼續(xù)保持運(yùn)行,當(dāng)RMQ節(jié)點(diǎn)在集群中宕機(jī)后,消息傳輸客戶端可以重新鏈接到集群中的其它節(jié)點(diǎn)繼續(xù)進(jìn)行消息的傳輸。另外,為了增加消息傳輸?shù)目煽啃?,采用了消息發(fā)布確認(rèn)和消息接收確認(rèn)模式。發(fā)布確認(rèn)可以有效確保消息傳輸?shù)搅讼⒎?wù)器,假如超過規(guī)定的時(shí)間,消息還沒有抵達(dá)到指定服務(wù)器,就會(huì)返回發(fā)送超時(shí)的錯(cuò)誤代碼,當(dāng)客戶端收到該錯(cuò)誤代碼后,會(huì)試著再一次發(fā)送;接收確認(rèn)的原理是:在消息消費(fèi)者獲取消息之后,并沒有馬上把消息刪除,而是將消息標(biāo)識為Unacked狀態(tài),直到收到消費(fèi)者消費(fèi)完消息返回ack指令后,才會(huì)從隊(duì)列中刪除消息,從而保證消息的完整,不丟失。
消息隊(duì)列交換控制策略主要依賴于RabbitMQ的兩個(gè)核心組件:主題Topic和隊(duì)列Queue。在消息發(fā)布者將消息發(fā)布到主題之后,服務(wù)端根據(jù)消息中攜帶的路由鍵值對主題中的消息進(jìn)行交換控制。也就是說,將含有某些特定標(biāo)識符的路由鍵值信息捆綁到某一個(gè)隊(duì)列當(dāng)中,消息訂閱者就可以從相應(yīng)的隊(duì)列中獲取該消息。
為了滿足氣象觀測數(shù)據(jù)的業(yè)務(wù)需要,研究并制定了基于RabbitMQ的氣象觀測數(shù)據(jù)消息傳輸控制策略。消息按照主題方式發(fā)送,每個(gè)主題代表一種氣象觀測資料。例如,國家地面自動(dòng)站數(shù)據(jù),臺站通過消息傳輸客戶端向省級主題X.OBS中發(fā)送消息;消息以隊(duì)列方式接收,對列名需要包含接收者的名稱,明確指定由誰來消費(fèi)消息。例如,消息發(fā)給國家級,它的隊(duì)列名就是Q.OBS.TO.BABJ;從消息主題到消息隊(duì)列的轉(zhuǎn)發(fā)過程由路由鍵值來控制,路由鍵值名稱以“R.”開頭,鍵值名一般包含消息的發(fā)送者、級別、資料類型、資料編碼等。
以國家級地面氣象自動(dòng)站消息傳輸為例,其交換控制策略如圖5所示。臺站ISOS軟件觀測到的數(shù)據(jù)通過消息傳輸客戶端以消息的形式發(fā)送給省級主題X.OBS,然后通過路由鍵值R.#將消息存到消息隊(duì)列中Q.OBS.TO.BABJ、Q.OBS.TO.Server、Q.OBS.Monitor,最后通過Shovel將其轉(zhuǎn)發(fā)到國家級消息服務(wù)器和省級MDOS,CIMISS和Monitor用戶。
圖5 地面自動(dòng)站消息傳輸控制策略
通過對RabbitMQ消息隊(duì)列技術(shù)在氣象通信系統(tǒng)中的應(yīng)用研究,設(shè)計(jì)開發(fā)了基于消息通信傳輸模式的氣象通信系統(tǒng)2.0版本,2018年12月已經(jīng)在全國各省和臺站部署相關(guān)的應(yīng)用并業(yè)務(wù)運(yùn)行。通過兩個(gè)月觀測數(shù)據(jù)的傳輸情況分析得到:系統(tǒng)運(yùn)行穩(wěn)定,96%的氣象觀測數(shù)據(jù)能夠在2秒內(nèi)完成從臺站到國家級的傳輸,并且在10秒內(nèi)完成全部數(shù)據(jù)的傳輸。同時(shí),系統(tǒng)通過消息交換控制策略將觀測數(shù)據(jù)及時(shí)轉(zhuǎn)發(fā)到MDOS、CIMISS、MICAPS等氣象業(yè)務(wù)系統(tǒng)中供業(yè)務(wù)單位使用。業(yè)務(wù)應(yīng)用結(jié)果表明,基于RabbitMQ技術(shù)的氣象通信系統(tǒng),可以滿足大數(shù)量、高頻次、多種類氣象觀測數(shù)據(jù)的高時(shí)效、高可靠傳輸,大幅提升了氣象數(shù)據(jù)的傳輸時(shí)效性和服務(wù)能力。