王 容,宮博亞,孔祥意
(水利部信息中心(水利部水文水資源監(jiān)測預(yù)報中心),北京 100053)
全國水情信息交換系統(tǒng)于 2012 年正式投入運行,實現(xiàn)了水利部、7 個流域機(jī)構(gòu)、31 個?。▍^(qū)、市)、234 個地級市約 4.2 萬個站點的雨水情信息的實時交換,報汛信息 10 min 內(nèi)可由測站經(jīng)地市、省或流域到達(dá)水利部。2013 年全年水利部接收全國雨水情信息 3.25 億條[1],未出現(xiàn)數(shù)據(jù)嚴(yán)重滯時、統(tǒng)計停滯、系統(tǒng)崩潰等問題,有力支撐了防汛抗旱雨水情信息服務(wù)工作。
但是,隨著國家防汛抗旱指揮系統(tǒng)二期工程、中小河流水文監(jiān)測、縣級山洪災(zāi)害防治非工程措施等項目的實施,截至 2018 年底,通過水情信息交換系統(tǒng)報送信息的站點已增至 10.9 萬個,較之前增加了 1.6 倍,交換信息量大幅增加。2018 年全年水利部接收全國雨水情信息達(dá) 9.60 億條[2],尤其是月初或多條江河發(fā)生洪水期間,高峰期 1 h 內(nèi)(8—9 時)信息接收量突破 500 萬條,水情信息交換系統(tǒng)頻繁出現(xiàn)接收文件入庫時間大幅增加、統(tǒng)計分析停止運行等問題。此外,自 2014 年起,由于部門之間數(shù)據(jù)共享需求,全國水情信息交換系統(tǒng)需向多家單位發(fā)送全部站點的雨水情信息,且在收到信息后 5 min內(nèi)轉(zhuǎn)發(fā)出去,極大占用了系統(tǒng)資源,從而影響了系統(tǒng)的接收、統(tǒng)計分析、實時監(jiān)控等功能,甚至造成系統(tǒng)崩潰,嚴(yán)重影響了雨水情信息的時效性和穩(wěn)定性,無法滿足每日 9 時防汛抗旱水情會商需求。
為此,通過分析全國水情信息交換系統(tǒng)技術(shù)框架、信息傳輸各個環(huán)節(jié),基于原有系統(tǒng)的發(fā)送和接收流程,提出采用多個線程并行處理、微化服務(wù)獨立控制、多維文件交換統(tǒng)計等技術(shù)和方法,對系統(tǒng)信息發(fā)送、信息接收、統(tǒng)計分析、信息監(jiān)控等核心層模塊進(jìn)行完善升級優(yōu)化設(shè)計,有效提升水情信息交換效率。
水情信息交換系統(tǒng)軟件基于 .Net 技術(shù)框架開發(fā),采用 Web Service 技術(shù)實現(xiàn)遠(yuǎn)程數(shù)據(jù)傳輸,利用Ajax 技術(shù)實現(xiàn)良好的界面交互效果,主要包括數(shù)據(jù)庫升級、信息發(fā)送、信息接收、統(tǒng)計分析、信息監(jiān)控等 5 個子系統(tǒng)[3],其中信息發(fā)送、信息接收、統(tǒng)計分析等子系統(tǒng)均采用單線程串行處理模式,逐層處理,能及時準(zhǔn)確地定位到工作節(jié)點,并與數(shù)據(jù)庫直接交互,減少中間環(huán)節(jié),實現(xiàn)每日百萬級數(shù)據(jù)量的數(shù)據(jù)交換及統(tǒng)計。
信息發(fā)送采用觸發(fā)和輪詢機(jī)制相結(jié)合的混合模式,在發(fā)送節(jié)點的數(shù)據(jù)庫平臺內(nèi)構(gòu)建觸發(fā)器,將發(fā)生變動(插入、修改及刪除等)的信息寫入待交換的數(shù)據(jù)庫表單中,再啟用輪詢模塊監(jiān)控待交換表單,定時處理生成待交換的數(shù)據(jù)文件,通過 Web Service 發(fā)送到接收節(jié)點;信息接收基于 Web Service函數(shù)接口自動接收數(shù)據(jù)文件,并啟用數(shù)據(jù)入庫模塊,將文件中的數(shù)據(jù)信息寫入數(shù)據(jù)庫表單中。信息發(fā)送、接收流程圖如圖 1 所示。
圖1 信息發(fā)送、接收流程圖
隨著數(shù)據(jù)量的逐年劇增和網(wǎng)絡(luò)安全控制,水情信息交換系統(tǒng)原有的處理模式及交互方式在中央級節(jié)點運行逐漸形成瓶頸,具體如下:信息發(fā)送、接收處理能力接近飽和,發(fā)送信息采用單線程逐一循環(huán)向所有接收節(jié)點發(fā)送文件,如遇某單位網(wǎng)絡(luò)堵塞將會影響所有單位的發(fā)送時效;接收信息入庫處理滯時,一旦備用數(shù)據(jù)庫出現(xiàn)異常,將會出現(xiàn)大批量延時;拋棄備用數(shù)據(jù)庫,又將導(dǎo)致主備數(shù)據(jù)庫數(shù)據(jù)不一致;統(tǒng)計線程直接連接數(shù)據(jù)庫表單在閑時進(jìn)行統(tǒng)計,但因發(fā)送和接收記錄表單全部被發(fā)送和接收處理線程占用,統(tǒng)計停滯導(dǎo)致記錄表數(shù)據(jù)無限增長,數(shù)據(jù)庫承壓能力有限,最終引發(fā)系統(tǒng)崩潰。
以并行工程思想為主導(dǎo),構(gòu)建了信息發(fā)送、接收核心模塊的主線程,基于主線程的并行運行,按照類型和時間等不同維度,拆分次線程,并對每個線程進(jìn)行梳理,分析主次線程的邏輯關(guān)系,將可以并行交叉的線程盡量并行交叉,按照優(yōu)先級劃分,采取避讓原則,保證線程盡早工作,提升運行效率,避免線程相互爭奪資源。同時為減少空閑線程資源浪費和 CPU 時間片之間線程上下文頻繁切換等問題,利用緩存線程池創(chuàng)建和管理線程,按照單例原則,同一種任務(wù)禁止有多個線程同時執(zhí)行[4]。
信息發(fā)送模塊劃分為數(shù)據(jù)輪詢、文件發(fā)送、信息入庫 3 個主線程,其中:數(shù)據(jù)輪詢線程處理待發(fā)數(shù)據(jù),并在生成待發(fā)文件后延時 5 s 啟動文件發(fā)送線程,以避免發(fā)送線程空轉(zhuǎn),最大化提升線程運行效率;文件發(fā)送線程采用多線程并行處理模式,向每個發(fā)送單位同時發(fā)送文件。信息接收模塊劃分了文件接收、入庫、處理,以及業(yè)務(wù)數(shù)據(jù)、接收信息入庫 5 個主線程,其中:文件接收線程并行接收數(shù)據(jù)文件;文件處理線程將 1 個接收數(shù)據(jù)文件拆分成多個與表單匹配的入庫文件;業(yè)務(wù)數(shù)據(jù)入庫線程按照表單類型并行入庫。
信息發(fā)送模塊中的信息、接收模塊中的文件和接收信息等的入庫線程,負(fù)責(zé)將發(fā)送和接收信息寫入數(shù)據(jù)庫記錄表單中,3 個線程均與統(tǒng)計分析模塊中的庫表數(shù)據(jù)刪除、信息監(jiān)控模塊中的實時頁面監(jiān)控統(tǒng)計等線程存在資源爭奪,因此設(shè)置了優(yōu)先級并進(jìn)行了避讓。庫表數(shù)據(jù)刪除線程啟用時每刪除 5 000 條發(fā)送記錄,線程暫停 1 s 讓出表單,用于發(fā)送和接收信息入庫;發(fā)送和接收信息每入庫 5 000 條記錄,線程停止 0.5 s,以確保實時頁面監(jiān)控統(tǒng)計。信息發(fā)送、接收模塊線程拆分圖如圖 2 和 3 所示。
圖2 信息發(fā)送模塊線程拆分圖
在原有的單一服務(wù)控制線程的模式下,根據(jù)業(yè)務(wù)邏輯將線程進(jìn)行了歸并,基于 IIS(互聯(lián)網(wǎng)信息服務(wù))的 .Net 應(yīng)用程序池將服務(wù)進(jìn)行分組,構(gòu)建信息發(fā)送、信息接收、統(tǒng)計分析、實時監(jiān)控等 4 個獨立的微服務(wù),服務(wù)之間不受彼此影響,有效提升了資源分配精細(xì)度,并以服務(wù)為主線,依次控制主線程和子線程,方便用戶快速定位問題。同時,提供了服務(wù)線程在線監(jiān)控功能,用戶可自主控制線程,進(jìn)行某一線程的暫停和啟動,當(dāng)線程異常時會及時告警,并采用聲音和圖標(biāo)的方式提醒用戶,提供每個線程相應(yīng)的日志文件,方便維護(hù)管理,系統(tǒng)運行處于可控和透明狀態(tài)。
圖3 信息接收模塊線程拆分圖
全國水情信息交換系統(tǒng)中數(shù)據(jù)交換統(tǒng)計模式由原來完全依賴數(shù)據(jù)庫調(diào)整為以本地文件為主導(dǎo)的模式。系統(tǒng)按照單位、信息發(fā)送和接收、統(tǒng)計等類型,以及時間維度,將數(shù)據(jù)文件進(jìn)行拆分,優(yōu)化了文件管理目錄結(jié)構(gòu),并建立基于二叉樹的不同索引,實現(xiàn)對不同數(shù)據(jù)的靈活高效的存取計算,每類數(shù)據(jù)文件有獨立的線程計算處理,通過標(biāo)記文件方式防止數(shù)據(jù)丟失[5]。系統(tǒng)較大程度地減少了與數(shù)據(jù)庫的交互,減輕了數(shù)據(jù)庫讀寫壓力,降低了數(shù)據(jù)庫讀寫占用的網(wǎng)絡(luò)帶寬,對數(shù)據(jù)的接收和發(fā)送提供了更大的有效帶寬,并最大化地為數(shù)據(jù)庫減負(fù)。同時也避免當(dāng)數(shù)據(jù)庫出現(xiàn)異常、系統(tǒng)服務(wù)器與數(shù)據(jù)庫之間通信中斷而造成的業(yè)務(wù)流程重復(fù)死鎖現(xiàn)象。文件管理目錄結(jié)構(gòu)圖如圖 4 所示。
圖4 文件管理目錄結(jié)構(gòu)圖
全國水情信息交換系統(tǒng)使用范圍較廣,系統(tǒng)升級完善主要以實際運行中出現(xiàn)的性能瓶頸進(jìn)行優(yōu)化,并與原有系統(tǒng)進(jìn)行無縫對接,確保全國水情信息交換工作可正常運行。系統(tǒng)核心層包括信息發(fā)送、信息接收、統(tǒng)計分析、信息監(jiān)控等 4 個模塊,優(yōu)化設(shè)計主要以核心層為基礎(chǔ)進(jìn)行優(yōu)化,并完善擴(kuò)充了系統(tǒng)維護(hù)和管理功能,最大化地提高水情信息交換效率,提升系統(tǒng)友好性。
信息發(fā)送模塊將實時入庫的水情信息按需打包成數(shù)據(jù)文件,同步發(fā)往多個接收節(jié)點。系統(tǒng)優(yōu)化主要是提升信息發(fā)送效率,解決發(fā)送延時和自動處理數(shù)據(jù)庫異常造成的發(fā)送停滯等問題。發(fā)送服務(wù)主線程之間采用監(jiān)視模式,整體優(yōu)化了發(fā)送流程,文件冗余存儲模式減少了系統(tǒng)與數(shù)據(jù)庫之間的交互,避免了數(shù)據(jù)庫異常引發(fā)的發(fā)送問題。文件發(fā)送采用多線程并行發(fā)送模式,使得數(shù)據(jù)輪詢批量處理能力大大提升。
當(dāng)實時庫表單中發(fā)生添加、修改、刪除操作時,基于觸發(fā)器會自動觸發(fā)生成待發(fā)送數(shù)據(jù)并寫入待發(fā)送數(shù)據(jù)表中,數(shù)據(jù)輪詢線程批量處理待發(fā)送數(shù)據(jù)并生成待發(fā)送文件,如遇數(shù)據(jù)庫異常操作中斷,待數(shù)據(jù)庫恢復(fù)后,將重新生成待發(fā)送文件;文件發(fā)送線程可并行向每個發(fā)送單位同步發(fā)送文件;信息入庫線程將發(fā)送文件和數(shù)據(jù)等記錄寫入數(shù)據(jù)庫表單中,并可實現(xiàn)同步狀態(tài)更新。信息發(fā)送服務(wù)流程示意圖如圖 5 所示。
圖5 信息發(fā)送服務(wù)流程示意圖
信息接收模塊接收外單位發(fā)來的文件后,實時解碼入庫。系統(tǒng)優(yōu)化主要是提升信息接收、入庫效率,保證主備數(shù)據(jù)庫信息的一致性,解決入庫延時問題。接收服務(wù) 5 個主線程之間采用監(jiān)視模式,多線程實時并行接收處理文件,將接收文件進(jìn)行預(yù)處理拆分,啟用多線程并行處理入庫,寫入主數(shù)據(jù)庫后,同步寫入備用數(shù)據(jù)庫。
文件接收線程基于 Web Service 函數(shù)接口自動同步接收多個發(fā)送節(jié)點的數(shù)據(jù)文件;文件入庫線程將文件記錄批量寫入數(shù)據(jù)庫表單中并更新狀態(tài);文件處理線程將文件按照表標(biāo)識實時拆包,生成主數(shù)據(jù)庫待入庫文件;業(yè)務(wù)數(shù)據(jù)入庫線程獨立運行主備數(shù)據(jù)庫入庫線程(可支持 5 個入庫主線程),并根據(jù)表標(biāo)識拆分為 78 個子線程(1 個表單對應(yīng) 1 個子線程),實時監(jiān)視對應(yīng)表單待入庫文件,完成數(shù)據(jù)入庫;接收信息入庫線程將數(shù)據(jù)入庫記錄寫入接收信息記錄表,并將已成功入主數(shù)據(jù)庫的數(shù)據(jù)打包生成備數(shù)據(jù)庫待入庫文件,并進(jìn)行強制入庫處理。信息接收服務(wù)流程示意圖如圖 6 所示。
圖6 信息接收服務(wù)流程示意圖
統(tǒng)計分析模塊用于統(tǒng)計每日發(fā)送和接收的信息數(shù)據(jù)量及時效性,及時刪除數(shù)據(jù)庫表單中的存儲文件記錄、發(fā)送和接收信息記錄數(shù),以及本地存儲的文件,避免數(shù)據(jù)庫和系統(tǒng)服務(wù)器出現(xiàn)因存儲空間不足而引發(fā)的系統(tǒng)崩潰問題。系統(tǒng)優(yōu)化主要是提升統(tǒng)計效率,擴(kuò)大自動刪除范圍,解決統(tǒng)計分析線程停滯問題。
統(tǒng)計分析服務(wù)劃分以下 4 個主線程:1)發(fā)送統(tǒng)計,包括報送任務(wù)站數(shù)、實際報送信息站數(shù)、報送信息總量、自定義時間內(nèi)(5~30 min)報送信息量等統(tǒng)計信息;2)接收統(tǒng)計,包括報汛任務(wù)站數(shù)、實際接收信息站數(shù)、接收信息總量、自定義時間內(nèi)(5~30 min)接收信息量;3)庫表數(shù)據(jù)刪除,涵蓋信息發(fā)送、接收生成的數(shù)據(jù)記錄及統(tǒng)計數(shù)據(jù);4)本地文件刪除,涵蓋信息發(fā)送、接收,以及統(tǒng)計模塊預(yù)處理生成的數(shù)據(jù)文件。
發(fā)送和接收統(tǒng)計摒棄了原有通過數(shù)據(jù)庫表單進(jìn)行統(tǒng)計的方式,避免與發(fā)送和接收線程爭奪資源的狀況,直接生成相應(yīng)的統(tǒng)計文件進(jìn)行單獨統(tǒng)計,并將結(jié)果寫入數(shù)據(jù)庫統(tǒng)計表單中,統(tǒng)計時效性參數(shù)由30 min 調(diào)整為自定義設(shè)置。
信息監(jiān)控模塊具備實時和遠(yuǎn)程 2 種監(jiān)控功能,主要為用戶提供實時監(jiān)控頁面,顯示各節(jié)點發(fā)送和接收信息的狀態(tài)、網(wǎng)絡(luò)連接情況及系統(tǒng)日志等。系統(tǒng)優(yōu)化主要提升監(jiān)控頁面友好性及實時監(jiān)控統(tǒng)計效率,完善系統(tǒng)異常告警功能,解決待處理數(shù)據(jù)無法遠(yuǎn)程處理的問題。信息監(jiān)控服務(wù)劃分了實時頁面監(jiān)控統(tǒng)計、網(wǎng)絡(luò)檢查、數(shù)據(jù)庫狀態(tài)監(jiān)視 3 個主線程,完善了實時信息監(jiān)控統(tǒng)計方式,細(xì)化了異常告警信息,增加了主備數(shù)據(jù)庫待入庫信息統(tǒng)計及待處理數(shù)據(jù)遠(yuǎn)程處理的功能。
實時頁面監(jiān)控統(tǒng)計線程實時統(tǒng)計讀取監(jiān)控頁面顯示的發(fā)送/接收節(jié)點的文件和數(shù)據(jù)記錄數(shù),主備數(shù)據(jù)庫待入庫文件數(shù),以及系統(tǒng)日志、異常告警等信息;網(wǎng)絡(luò)檢查線程定時檢查每個節(jié)點的網(wǎng)絡(luò)連接狀態(tài);數(shù)據(jù)庫狀態(tài)監(jiān)視線程定時檢查主數(shù)據(jù)庫和各備用數(shù)據(jù)庫的連接狀態(tài)。同時,實時監(jiān)控提供系統(tǒng)設(shè)置、人工操作、管理維護(hù)等操作功能,遠(yuǎn)程監(jiān)控提供待處理數(shù)據(jù)處理功能,頁面統(tǒng)計的文件和數(shù)據(jù)記錄均可進(jìn)一步查看詳細(xì)信息,異常告警文件提供錯誤問題在線編輯功能。
全國水情信息交換系統(tǒng)將多個線程并行處理、微化服務(wù)獨立控制、多維文件交換統(tǒng)計等技術(shù)和方法,融入核心層模塊,優(yōu)化了信息發(fā)送和接收流程,解決了系統(tǒng)的耗時、資源爭奪等問題。目前系統(tǒng)優(yōu)化版本已在水利部及流域和部分省級水文部門的節(jié)點部署運行,歷時 2 a 的測試期,系統(tǒng)應(yīng)對大數(shù)據(jù)量的交換能力大幅提升,入庫效率明顯提高,早高峰基本無延時,發(fā)送效率顯著提高,實時發(fā)送與信息入庫時間差控制在 5 min 內(nèi),日均入庫數(shù)據(jù)量由百萬級提升到千萬級,發(fā)送數(shù)據(jù)量由百萬級提升到千萬級,全力保障了 2020 年水情信息服務(wù)工作,有力應(yīng)對了汛期長江、太湖、淮河、松花江等流域性洪水[6]。但系統(tǒng)的完善升級仍然沿用 .Net 技術(shù)框架,僅支持實時雨水情數(shù)據(jù)庫(關(guān)系型數(shù)據(jù)庫)中的結(jié)構(gòu)化時序數(shù)據(jù)的交換和共享。后期,水情信息交換方式將全面升級改造,將基于水利云及大數(shù)據(jù)平臺,搭建水情信息云交換數(shù)據(jù)平臺,實現(xiàn)數(shù)據(jù)庫級和多源異構(gòu)數(shù)據(jù)的匯聚、交換,以及目錄驅(qū)動交換,將全面支撐雨水情信息的交換共享,可為全國水旱災(zāi)害防御水情信息服務(wù)工作奠定基石。