周雪瑩,胡麗麗,魏敏丹
(江西省氣象信息中心,江西 南昌 330096)
智能網(wǎng)格氣象產(chǎn)品定量化和精細(xì)化是氣象業(yè)務(wù)發(fā)展的必然趨勢(shì),對(duì)公眾和各行業(yè)領(lǐng)域的精細(xì)化天氣預(yù)報(bào)服務(wù)具有重要的作用[1-2]。隨著智能網(wǎng)格氣象業(yè)務(wù)不斷發(fā)展,省級(jí)部門接收、制作和發(fā)布的網(wǎng)格產(chǎn)品數(shù)據(jù)量日益增加,頻繁操作產(chǎn)品文件會(huì)影響服務(wù)器的整體性能,導(dǎo)致文件不能及時(shí)下載使用等問題,為了保障智能網(wǎng)格氣象產(chǎn)品高效共享應(yīng)用,針對(duì)目前的文件共享方式的缺點(diǎn),該文設(shè)計(jì)開發(fā)了一套智能網(wǎng)格氣象產(chǎn)品共享應(yīng)用系統(tǒng),實(shí)現(xiàn)消息生產(chǎn)和消費(fèi)、異步傳送以及實(shí)時(shí)監(jiān)聽等功能。
采用開源消息代理軟件,通過服務(wù)端和客戶端的方式,實(shí)現(xiàn)客戶端實(shí)時(shí)獲取服務(wù)端授權(quán)訂閱的產(chǎn)品文件狀態(tài),通過有效的產(chǎn)品文件下載服務(wù)實(shí)現(xiàn)產(chǎn)品文件實(shí)時(shí)同步共享。當(dāng)有新的產(chǎn)品文件到達(dá)省級(jí)數(shù)據(jù)環(huán)境或者被監(jiān)聽的文件目錄有文件變動(dòng)時(shí),觸發(fā)監(jiān)視模塊的實(shí)時(shí)監(jiān)視代理,生成標(biāo)準(zhǔn)格式的產(chǎn)品文件訂閱消息,通過處理線程池發(fā)送到開源消息代理軟件[3-5],客戶端收到訂閱的消息后,啟動(dòng)文件同步模塊實(shí)現(xiàn)遠(yuǎn)程文件下載,下載結(jié)束后客戶端把下載情況生成狀態(tài)消息發(fā)送到開源消息代理軟件,如果下載過程中有異常情況,如產(chǎn)品文件下載不完整、服務(wù)器狀態(tài)不正常等,通過異常處理模塊發(fā)送到監(jiān)控系統(tǒng)。消息傳輸流程設(shè)計(jì)圖如圖1 所示。
圖1 消息傳輸流程設(shè)計(jì)圖
智能網(wǎng)格氣象產(chǎn)品共享應(yīng)用系統(tǒng)總體設(shè)計(jì)包括數(shù)據(jù)源區(qū)、功能模塊區(qū)和告警區(qū)。系統(tǒng)總體架構(gòu)圖如圖2 所示。
圖2 系統(tǒng)總體架構(gòu)圖
數(shù)據(jù)源區(qū)主要是通過監(jiān)視模塊實(shí)時(shí)監(jiān)視從各種渠道收集文件的服務(wù)器群,如果有新增、修改、移動(dòng)等文件操作時(shí),生成數(shù)據(jù)消息并寫入日志文件,同時(shí)把產(chǎn)品文件的基本信息保存到業(yè)務(wù)數(shù)據(jù)庫(kù)。功能模塊區(qū)處理接收到的消息,開源消息代理軟件會(huì)把有訂閱需求的消息發(fā)送到消息隊(duì)列中[6-9],客戶端根據(jù)接收的數(shù)據(jù)消息下載數(shù)據(jù)文件,同時(shí)把消息內(nèi)容和出錯(cuò)記錄寫入日志文件,并且根據(jù)業(yè)務(wù)或科研需要對(duì)下載的產(chǎn)品文件進(jìn)行保存,為了防止出現(xiàn)僵尸進(jìn)程或者進(jìn)程異常退出,導(dǎo)致整個(gè)系統(tǒng)運(yùn)行不穩(wěn)定,建立了一套簡(jiǎn)單的機(jī)制以保證進(jìn)程一直處于活躍狀態(tài)[10]。告警區(qū)主要通過異常處理模塊把進(jìn)程運(yùn)行、服務(wù)器性能或同步情況等異常信息,通過短信、微信或頁(yè)面的形式發(fā)送給值班業(yè)務(wù)人員或管理人員。
在國(guó)內(nèi)氣象通信系統(tǒng)(CTS2.0)和虛擬資源池的基礎(chǔ)上,以收集到的各類氣象網(wǎng)格產(chǎn)品文件為數(shù)據(jù)源,該系統(tǒng)采用開源消息代理軟件RabbitMQ、MySQL數(shù)據(jù)庫(kù)、C#和Python 等技術(shù),該系統(tǒng)實(shí)現(xiàn)消息生產(chǎn)和消費(fèi)、異步傳送和實(shí)時(shí)監(jiān)聽等功能。
監(jiān)視代理包括實(shí)時(shí)監(jiān)視代理和狀態(tài)監(jiān)視代理兩部分,分布式部署在服務(wù)器上,收集文件路徑、大小和操作等基本信息,以及進(jìn)程狀態(tài)等可用性數(shù)據(jù),并且通過守護(hù)進(jìn)程保證進(jìn)程一直處于運(yùn)行狀態(tài)。
實(shí)時(shí)監(jiān)視代理是基于Python 的實(shí)時(shí)監(jiān)控第三方庫(kù)watchdog 進(jìn)行開發(fā)的,實(shí)時(shí)監(jiān)聽代理的工作原理如圖3 所示。
圖3 實(shí)時(shí)監(jiān)聽代理工作原理
通過參數(shù)設(shè)置控制監(jiān)視策略,如指定監(jiān)視的文件類型、是否區(qū)分文件名大小寫、是否監(jiān)視子文件夾,并且采取多次調(diào)用schedule 方法的方式,同時(shí)監(jiān)視多個(gè)文件夾,通過操作系統(tǒng)的時(shí)間觸發(fā),不需要循環(huán)和等待,當(dāng)共享清單下的特定文件被創(chuàng)建、刪除、修改、移動(dòng)時(shí),生成數(shù)據(jù)消息并與訂閱清單進(jìn)行對(duì)比,如果消息的內(nèi)容符合訂閱清單的要求,則把消息發(fā)送到開源消息代理軟件中對(duì)應(yīng)的消息隊(duì)列。
消息處理軟件包括消息封裝模塊和消息處理模塊,分別部署在服務(wù)端和客戶端。消息封裝模塊是把接收到的產(chǎn)品文件信息根據(jù)配置文件進(jìn)行標(biāo)準(zhǔn)封裝,使用開源消息代理軟件RabbitMQ 的異步消息隊(duì)列(Work Queue)方式投遞消息,不需等待客戶端響應(yīng)可直接將消息來源、發(fā)送時(shí)間和發(fā)送目的地等信息寫入日志文件。消息的傳輸格式是以鍵值對(duì)的形式存放消息屬性,包含消息發(fā)布者信息、消息接收者信息、消息發(fā)送時(shí)間、文件大小和文件絕對(duì)路徑等。
消息處理模塊部署在客戶端,客戶端從消息隊(duì)列中讀取訂閱的消息,根據(jù)獲得的消息屬性調(diào)用文件同步中的文件下載模塊,并把下載文件的基本信息寫入日志文件,如文件名、文件大小、保存路徑和來源等,同時(shí)存入關(guān)系數(shù)據(jù)庫(kù)MySQL 中進(jìn)行持久化存儲(chǔ)。
該系統(tǒng)采用關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)MySQL 來存儲(chǔ)信息,為了提高數(shù)據(jù)讀寫性能、數(shù)據(jù)庫(kù)訪問速度和數(shù)據(jù)查詢速度,保證數(shù)據(jù)入庫(kù)的及時(shí)性,采用視圖、索引、主鍵等對(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化設(shè)計(jì)[11-13]。根據(jù)業(yè)務(wù)需求,系統(tǒng)設(shè)計(jì)了服務(wù)器狀態(tài)表、文件詳細(xì)信息表、文件總量數(shù)據(jù)表、異常情況數(shù)據(jù)表和下載情況數(shù)據(jù)表等。服務(wù)器狀態(tài)表用于存儲(chǔ)監(jiān)控區(qū)域服務(wù)器和客戶端的系統(tǒng)進(jìn)程、IO、系統(tǒng)時(shí)間和磁盤等出現(xiàn)異常的信息;文件詳細(xì)信息表用于存儲(chǔ)監(jiān)控區(qū)域共享文件的詳細(xì)信息;文件總量數(shù)據(jù)表用于存儲(chǔ)監(jiān)控區(qū)域共享文件每日下載的數(shù)據(jù)總量;異常情況數(shù)據(jù)表用于存儲(chǔ)讀取消息過程或下載過程出現(xiàn)的異常情況;下載情況數(shù)據(jù)表用于存儲(chǔ)客戶端下載數(shù)據(jù)的文件名、數(shù)據(jù)量、時(shí)間和目錄等信息。
異常情況包括文件同步失敗、服務(wù)器狀態(tài)異常和進(jìn)程異常等,異常處理模塊采用Web 頁(yè)面的方式,提供閾值設(shè)置和管理、告警方式的選擇和異常記錄歷史查詢等功能。告警閾值設(shè)置有3 個(gè)級(jí)別,根據(jù)不同的閾值觸發(fā)不同級(jí)別的告警[14-16];告警方式有微信、短信和Web 頁(yè)面3 種方式,根據(jù)值班業(yè)務(wù)人員或管理人員的需求選擇一種或多種方式進(jìn)行告警;異常記錄歷史查詢可以查詢所有的異常記錄以及處理結(jié)果。
RabbitMQ 是基于高級(jí)消息隊(duì)列協(xié)議(Advanced Message Queuing Protocol,AMQP)的開源消息代理軟件,設(shè)置隊(duì)列中的消息持久化,用來處理實(shí)時(shí)且要求高可靠性的消息。該文采用RabbitMQ 的主題交換器(Topic Exchange),使用特殊含義的符號(hào)為路由器關(guān)鍵字(Routing Key)設(shè)置特定規(guī)則,根據(jù)路由器關(guān)鍵字發(fā)送消息到所有使用匹配綁定鍵綁定的消息隊(duì)列(Queue),如果不存在路由器關(guān)鍵字中指定的消息隊(duì)列名,則指定到這個(gè)消息隊(duì)列的消息會(huì)被丟棄??蛻舳耸褂胋asic.consume 命令,訂閱消息隊(duì)列中的消息,實(shí)現(xiàn)信道(channel)自動(dòng)在處理完上一條消息之后,接收下一條消息[9-10]。
消息按照主題方式發(fā)送,消息隊(duì)列名稱以“Q.”開頭,包含資料來源和資料類型,主題交換器的路由器關(guān)鍵字是由點(diǎn)分隔的一組單詞組成,“#”表示0 個(gè)或若干個(gè)關(guān)鍵字,“*”表示一個(gè)關(guān)鍵字,將消息發(fā)送到一個(gè)或者多個(gè)消息隊(duì)列中,實(shí)現(xiàn)pub/sub 模式,即發(fā)布訂閱方式。主題方式消息傳輸圖如圖4 所示。
圖4 主題方式消息傳輸圖
基于Python 的實(shí)時(shí)監(jiān)控第三方庫(kù)watchdog 優(yōu)先使用底層原生API,其次再通過輪詢磁盤實(shí)現(xiàn)監(jiān)控。通過操作系統(tǒng)的時(shí)間觸發(fā),不需要循環(huán)和等待,對(duì)不同平臺(tái)的事件都進(jìn)行了封裝,通過observer 模塊不斷檢測(cè)調(diào)用平臺(tái)的依賴代碼,監(jiān)控指定目錄/文件,當(dāng)有創(chuàng)建、刪除、修改、移動(dòng)等變化時(shí),產(chǎn)生事件并且對(duì)應(yīng)特定的事件類,再通過事件處理類(event_handler)來處理對(duì)應(yīng)的事件,observer 模塊、事件處理類和被監(jiān)控的文件夾通過observer.schedule函數(shù)串聯(lián)起來。
文件系統(tǒng)實(shí)時(shí)監(jiān)聽調(diào)用文件系統(tǒng)事件處理類,通過定義處理事件,繼承FileMovedEvent、FileCreated Event 和FileModifiedEvent,并重寫對(duì)應(yīng)實(shí)例方法,來實(shí)現(xiàn)文件實(shí)時(shí)監(jiān)視。文件寫入目錄的過程中會(huì)多次觸發(fā)類實(shí)例self.on_moved(event),為了避免文件重復(fù)處理產(chǎn)生重復(fù)記錄,導(dǎo)致大量相同的消息發(fā)送到消息代理軟件,把文件名賦值給一個(gè)全局變量,如果上次傳入的文件名和這次賦值的文件名是一致的,則不做任何操作,從而避免多次觸發(fā)類實(shí)例。為了只對(duì)格點(diǎn)資料進(jìn)行監(jiān)視控制,使用PatternMatching EventHandler 事件處理類,指定模式為GRB、GRB2、MIC 和BIN,如果監(jiān)視目錄下的文件名匹配指定的文件類型則調(diào)用實(shí)例方法。
采用基于Quartz的Python定時(shí)任務(wù)框架apscheduler和系統(tǒng)工具模塊psutil 實(shí)現(xiàn)定時(shí)采集客戶端進(jìn)程運(yùn)行狀態(tài)信息的任務(wù)。psutil 是一個(gè)開源且跨平臺(tái)的庫(kù),提供了便利的函數(shù),用于獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率等信息。操作系統(tǒng)基本都會(huì)提供定時(shí)任務(wù)的實(shí)現(xiàn),例如Linux 自帶的crontab、Windows 自帶的任務(wù)計(jì)劃,但是apscheduler 提供了構(gòu)建專用調(diào)度器或調(diào)度服務(wù)的基礎(chǔ)模塊,以及非常豐富而且方便易用的定時(shí)任務(wù)接口,提供了基于日期、固定時(shí)間間隔以及crontab 類型的任務(wù),能實(shí)現(xiàn)更好、更便捷的跨平臺(tái)定時(shí)任務(wù)??蛻舳藸顟B(tài)信息定時(shí)采集時(shí),采用后臺(tái)運(yùn)行(BackgroundScheduler)的方式,每隔5 min采集一次進(jìn)程信息并寫入到業(yè)務(wù)數(shù)據(jù)庫(kù)中。
該文在虛擬資源池的環(huán)境下,設(shè)計(jì)了具有消息生產(chǎn)和消費(fèi)、異步傳送、實(shí)時(shí)監(jiān)聽和文件遠(yuǎn)程備份等功能的智能網(wǎng)格氣象產(chǎn)品共享應(yīng)用系統(tǒng),并且對(duì)消息生成、消息處理、實(shí)時(shí)監(jiān)視和文件同步進(jìn)行了詳細(xì)的闡述。采用RabbitMQ開源消息代理軟件,實(shí)現(xiàn)消息異步處理,實(shí)時(shí)生成產(chǎn)品文件的數(shù)據(jù)消息,并且發(fā)送到消息隊(duì)列,客戶端根據(jù)接收的數(shù)據(jù)消息下載對(duì)應(yīng)的產(chǎn)品文件,減少了服務(wù)器內(nèi)存的使用量,提高了數(shù)據(jù)共享時(shí)效;利用差異備份的方式備份變動(dòng)的數(shù)據(jù),減少寬帶資源的大量耗費(fèi),提高數(shù)據(jù)傳輸效率;定時(shí)采集客戶端狀態(tài)信息獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率,便于監(jiān)控系統(tǒng)和管理進(jìn)程,保證系統(tǒng)安全可靠運(yùn)行。