林紅 華韻子
摘? 要:針對預報服務產(chǎn)品一鍵式發(fā)布的迫切需求,通過對Redis內(nèi)存數(shù)據(jù)庫的應用研究,基于Spring框架搭建了上海中心氣象臺數(shù)據(jù)分發(fā)管理系統(tǒng),實現(xiàn)數(shù)據(jù)產(chǎn)品分發(fā)和分發(fā)配置管理功能,發(fā)送方式包括FTP、短信、郵件、傳真、語音。系統(tǒng)運行穩(wěn)定可靠,發(fā)布效率提升90%。
關(guān)鍵詞:數(shù)據(jù)分發(fā);Redis;傳真;短信
中圖分類號:TP399? ? ?文獻標識碼:A
Abstract:Aiming at the urgent need of one-click publishing of forecast service products,through the application research of Redis in-memory database,the data distribution management system of Shanghai Central Meteorological Observatory is built based on the Spring framework,realizing data product distribution and distribution configuration management.The means of distribution include FTP,SMS,email,fax and voice message.The system runs stably and reliably,increasing the distribution efficiency by 90%.
Keywords:data distribution;Redis;fax;SMS
1? ?引言(Introduction)
隨著上海社會經(jīng)濟的發(fā)展,政府部門、公眾、媒體、專業(yè)用戶等對氣象保障服務在精細化程度、預報時效、需求范圍等方面的要求不斷提高。當前上海中心氣象臺每天發(fā)送數(shù)據(jù)文件數(shù)量在25000個左右,數(shù)據(jù)量達到30GB。預報服務產(chǎn)品發(fā)布數(shù)量的激增和高時效要求,使得目前單一的FTP發(fā)送、人工發(fā)送傳真和逐一打電話通知相關(guān)部門的現(xiàn)狀已經(jīng)不能滿足業(yè)務需求。本文從實際分發(fā)需求出發(fā),基于Redis內(nèi)存數(shù)據(jù)庫的高性能優(yōu)勢,借鑒其在多個領(lǐng)域中的應用經(jīng)驗[1-3],設(shè)計研發(fā)了集FTP、短信、郵件、傳真、語音電話于一體的數(shù)據(jù)分發(fā)管理系統(tǒng),將預報員從繁雜的事務性工作中解脫出來,有更多的時間專注于預報過程的分析,進而提高預報質(zhì)量。
2? 系統(tǒng)架構(gòu)及關(guān)鍵技術(shù)(System framework and key technology)
2.1? ?系統(tǒng)架構(gòu)設(shè)計
系統(tǒng)采用B/S架構(gòu)設(shè)計,系統(tǒng)由存儲層、數(shù)據(jù)層、服務層、業(yè)務功能層組成。各層設(shè)計及主要功能:
存儲層:存儲業(yè)務層、采集、發(fā)送過程中產(chǎn)生的所有數(shù)據(jù)。本層主要使用Redis數(shù)據(jù)庫和MySql為主,以Redis緩存數(shù)據(jù)庫作為任務隊列進行任務控制,并緩存一段時間內(nèi)的數(shù)據(jù)信息。
數(shù)據(jù)層:數(shù)據(jù)層是采集和發(fā)送數(shù)據(jù)的核心模塊,自動管理服務連接、采集、發(fā)送、存儲、上報等任務。數(shù)據(jù)層的所有數(shù)據(jù)來源與任務隊列和業(yè)務層產(chǎn)生的數(shù)據(jù)。數(shù)據(jù)層控制流量主要是依賴于緩存隊列。數(shù)據(jù)層主要功能包括任務監(jiān)控、任務控制、任務隊列、連接池、數(shù)據(jù)傳輸、信息上報、數(shù)據(jù)存儲等。
服務層:為業(yè)務層提供對應的服務支撐,包含F(xiàn)TP發(fā)送、傳真發(fā)送、郵件發(fā)送、短信發(fā)送、語音呼叫、告警信息推送等接口。服務層主要是連接業(yè)務層和存儲層的中間橋梁,處理業(yè)務層的邏輯和數(shù)據(jù)操作,通過連接數(shù)據(jù)庫,對服務器配置、分發(fā)策略配置、數(shù)據(jù)存儲等進行查詢和存儲,查詢?nèi)蝿铡⒏婢刃畔ⅰ?/p>
業(yè)務功能層:是以Web頁面的方式供用戶操作,功能主要包括配置中心(服務器配置、分發(fā)策略配置、發(fā)送用戶管理、發(fā)送用戶組管理、產(chǎn)品管理)、任務監(jiān)控(分發(fā)統(tǒng)計、數(shù)據(jù)下載、告警信息)、系統(tǒng)管理(用戶管理、數(shù)據(jù)字典)、權(quán)限管理四大功能。
2.2? ?關(guān)鍵技術(shù)
(1) 內(nèi)存數(shù)據(jù)庫技術(shù)
在本項目中,待分發(fā)的數(shù)據(jù)文件數(shù)量、數(shù)據(jù)量和用戶數(shù)量眾多,多產(chǎn)品多用戶的并發(fā)需求,以及用戶對時效性的需求,特別是預警產(chǎn)品的超高時效性要求,所有的操作都針對關(guān)系型數(shù)據(jù)庫[4](Database,DB)是不現(xiàn)實的,DB雖然提供了數(shù)據(jù)的訪問,但每一次的數(shù)據(jù)訪問都是一次I/O(Input/Output)操作,頻繁的I/O操作對系統(tǒng)性能來講是一種災難[5,6],傳統(tǒng)關(guān)系型數(shù)據(jù)庫方案已不能滿足海量數(shù)據(jù)發(fā)送的需求。系統(tǒng)選型在分布式內(nèi)存數(shù)據(jù)庫上[7],通過理論分析及試驗分析,最終確定了實時處理能力更強的Redis內(nèi)存數(shù)據(jù)庫作為數(shù)據(jù)層支撐。
Redis是開源的、高性能的、鍵值(key-value)對存儲數(shù)據(jù)的NOSQL數(shù)據(jù)庫,適合被用于數(shù)據(jù)庫、緩存和消息中間件[8]。作為一個內(nèi)存數(shù)據(jù)庫,Redis讀寫數(shù)據(jù)的時候不會受到硬盤
I/O速度的限制,讀取速度可以達到110000次/秒,寫入速度達到81000次/秒,遠遠優(yōu)于常規(guī)DB數(shù)據(jù)庫的讀取速度,具有對數(shù)據(jù)高并發(fā)讀寫和高效率存儲訪問的性能[9]。與同樣是內(nèi)存數(shù)據(jù)庫的Memcached相比,Redis支持更多的數(shù)據(jù)類型,除支持字符串類型之外,還支持hash、鏈表、集合及有序集合等數(shù)據(jù)結(jié)構(gòu)[10],可以方便地添加和刪除元素[11]。并且Redis支持數(shù)據(jù)的持久化,可以周期性地將內(nèi)存中的數(shù)據(jù)保存到磁盤中,重啟的時候可以再次加載到內(nèi)存中使用,數(shù)據(jù)可以從主服務器向任意數(shù)量的從服務器上同步,而從服務器又可以作為主服務器關(guān)聯(lián)其他的從服務器,以此實現(xiàn)主從同步的數(shù)據(jù)備份[12]。
在本項目系統(tǒng)數(shù)據(jù)存儲的設(shè)計中,DB數(shù)據(jù)庫采用開源的MySql數(shù)據(jù)庫,而Redis作為DB與業(yè)務應用之間的橋梁,整個內(nèi)存庫的設(shè)計除了緩存分發(fā)用戶的配置信息外,一段時間內(nèi)的數(shù)據(jù)信息也保存在緩存中,避免同一文件每發(fā)送一個用戶就進行一次I/O讀取,大幅度提高分發(fā)效率。如圖2所示,Redis作為擋在其前的一道快速讀取數(shù)據(jù)的屏障,有效緩解了MySql數(shù)據(jù)庫壓力,對提高整個系統(tǒng)性能起到了關(guān)鍵作用。
(2)傳真服務
傳真是為上海市政府、防汛部門傳送氣象服務產(chǎn)品的重要渠道,目前是手動發(fā)送,效率低下。本項目中部署了一部傳真服務器FS(Fax Server),搭載四路的Modem卡。建立基于WSDL的傳真接口協(xié)議FWI(Fax WebService Interface),其利用WebService進行通信,數(shù)據(jù)分發(fā)模塊通過調(diào)用FWI向傳真服務器發(fā)送請求,F(xiàn)WI直接返回需要的數(shù)據(jù),并提供狀態(tài)信息。
整個傳真服務流程為:數(shù)據(jù)分發(fā)模塊根據(jù)用戶名/密碼調(diào)用SignIn登錄FS;如果登錄成功,獲取令牌TokenID,將令牌TokenID作為參數(shù)調(diào)用發(fā)送傳真,獲取傳真狀態(tài)的服務;操作完成,調(diào)用SignOut退出登錄。流程圖如圖3所示。
待發(fā)送的文件傳送到傳真服務器后,通過文件格式轉(zhuǎn)換的功能,將文本或WORD等格式的文件轉(zhuǎn)成TIFF格式的文件后經(jīng)過base64加密封裝,調(diào)用傳真接口自動發(fā)送。
(3)短信服務
預報服務產(chǎn)品的短信發(fā)送是為公眾、領(lǐng)導決策服務的主要手段之一,而短信發(fā)送涉及中國移動、中國電信、中國聯(lián)通三大運營商的網(wǎng)關(guān),為此與移動、聯(lián)通、電信建立合作渠道。短信服務器內(nèi)部集成統(tǒng)一的數(shù)據(jù)庫接口、API接口,與上海中心氣象臺業(yè)務系統(tǒng)融合,其服務器部署在上海市氣象局內(nèi)網(wǎng)DMZ區(qū),短信服務通過固定公網(wǎng)IP連接至中國移動、中國聯(lián)通、中國電信三大運營商的行業(yè)短信網(wǎng)關(guān),數(shù)據(jù)分發(fā)模塊通過內(nèi)網(wǎng)直接調(diào)用短信服務器數(shù)據(jù)庫接口,實現(xiàn)全網(wǎng)手機用戶的短信發(fā)送、接收、查詢、統(tǒng)計等功能,支持移動、聯(lián)通、電信的子賬號功能,滿足中心臺多業(yè)務、多維度的業(yè)務需求。如圖4所示。
(4)語音電話服務
語音分發(fā)是指向指定號碼撥打電話,目前是通過預報員人工操作完成的。通過調(diào)研選定了阿里語音服務。通過調(diào)用阿里云語音呼叫的API,從運營商網(wǎng)絡向指定號碼發(fā)起一通呼叫,呼叫被應答后,播放一段指定的音頻,支持將一個音頻文件同時撥打給多個用戶。支持兩種形式的音頻調(diào)用:①播放的音頻為固定內(nèi)容的音頻文件(mp3/wav),可以直接外呼。②播放的音頻為帶有變量的文本模板,每次調(diào)用時先根據(jù)變量替換值從文本模板轉(zhuǎn)化為音頻文件,再進行外呼。阿里語音服務通過先進的深度學習技術(shù),提供了語音合成功能,可以將文本轉(zhuǎn)換成自然流暢的語音,同時能夠根據(jù)需求調(diào)節(jié)語速、語調(diào)、音量等。
3? ?系統(tǒng)實現(xiàn)(System implementation)
3.1? ?開發(fā)環(huán)境
系統(tǒng)后臺采用SpringBoot框架,前臺基于SpringMVC框架,采用JAVA和HTML5作為開發(fā)工具。
3.2? ?功能模塊
根據(jù)系統(tǒng)架構(gòu)設(shè)計,氣象數(shù)據(jù)分發(fā)管理系統(tǒng)主要包括:監(jiān)控模塊、分發(fā)模塊、管理模塊三大模塊。
(1)監(jiān)控模塊
監(jiān)控服務對指定的數(shù)據(jù)文件目錄進行監(jiān)控,若該目錄下有文件新增,即通過socket發(fā)送文件的相關(guān)信息到收發(fā)核心模塊文件采集任務隊列。為避免有文件遺漏未被消費,設(shè)計了監(jiān)控重發(fā)模塊,每隔2分鐘執(zhí)行一個定時任務遞歸掃描文件夾下所有未消費的文件,發(fā)送相關(guān)信息至核心模塊。
為防止因其他原因造成的系統(tǒng)停止運行,通過運行獨立于整個系統(tǒng)的監(jiān)控腳本,每10分鐘檢查Redis、監(jiān)控模塊、收發(fā)核心模塊、web模塊的運行情況,若停止運行自動重啟。
(2)分發(fā)模塊
分發(fā)模塊是整個系統(tǒng)的核心模塊,消費文件采集隊列獲取文件名,通過正則表達式和文件名進行匹配,若匹配成功則在數(shù)據(jù)歸檔根目錄下按照“產(chǎn)品名稱/年/月/日/時/”建立文件夾,對文件進行歸檔;歸檔后將該條信息加入Redis發(fā)送任務隊列,發(fā)送隊列的消費者根據(jù)產(chǎn)品內(nèi)容ID,查詢數(shù)據(jù)庫的FTP分發(fā)配置、短信分發(fā)配置、郵箱分發(fā)配置、傳真分發(fā)配置、語音分發(fā)配置。根據(jù)獲取的配置信息,進行相應的分發(fā)操作。分發(fā)模塊提供重發(fā)功能。
FTP分發(fā):查詢到分發(fā)的用戶和配置信息,從FTP連接池中獲取連接,進行文件的上傳操作。
短信分發(fā):讀取文件內(nèi)容后,根據(jù)分發(fā)的用戶手機號組裝成規(guī)定的txt文件格式,上傳至短信發(fā)送服務器。
郵箱分發(fā):查詢發(fā)送用戶的郵箱地址,如待發(fā)送的文件為文本文件,則將讀取到文件內(nèi)容作為正文發(fā)送,其余格式的文件將作為附件發(fā)送。
傳真分發(fā):文件先轉(zhuǎn)換tiff格式后經(jīng)過base64轉(zhuǎn)換封裝并調(diào)用傳真接口發(fā)送。
語音分發(fā):讀取文本文件內(nèi)容并查詢?nèi)〕鱿嚓P(guān)的用戶號碼,阿里云語音呼叫的API接口將文字自動轉(zhuǎn)換為語音,撥打電話給用戶。
FTP分發(fā)、短信分發(fā)、語音分發(fā)為同步,可以立即獲得分發(fā)結(jié)果;郵箱分發(fā)為異步,需等待回調(diào)的結(jié)果;傳真發(fā)送后,任務監(jiān)控隊列消費者根據(jù)ID通過接口查詢傳真發(fā)送的結(jié)果。
(3)管理模塊
管理模塊實現(xiàn)發(fā)送配置、用戶管理、系統(tǒng)發(fā)送情況查詢等功能。
系統(tǒng)提供靈活的分發(fā)統(tǒng)計功能,便于用戶查詢不同時間段、不同產(chǎn)品、不同用戶、不同文件名的分發(fā)統(tǒng)計情況,提供對每個統(tǒng)計情況詳細信息的查看功能,提供對分發(fā)文件的下載功能。
4? ?結(jié)論(Conclusion)
本項目投入業(yè)務化運行后,有效減少手工操作,預報員用于產(chǎn)品發(fā)布的時間縮減了90%,大幅度提高工作效率。系統(tǒng)提供了監(jiān)控發(fā)布內(nèi)容的窗口,預報發(fā)布人員可以很直觀地看到發(fā)布情況,如果有發(fā)布失敗的產(chǎn)品,通過簡單操作就可以進行補發(fā)。管理人員方便對發(fā)布信息進行查詢、統(tǒng)計,便于預報產(chǎn)品、服務產(chǎn)品發(fā)布狀況的管理。短消息提醒功能,使得重要路徑發(fā)布失敗時,相關(guān)人員可以在第一時間得到消息,便于及時處理,確保不漏發(fā)。統(tǒng)一的數(shù)據(jù)分發(fā)接口,其他業(yè)務系統(tǒng)不再需要單獨開發(fā)分發(fā)功能,只需簡單調(diào)用接口,或是將產(chǎn)品文件發(fā)送到指定目錄下,就可實現(xiàn)一鍵分發(fā)功能;減少重復開發(fā),提高發(fā)布的穩(wěn)定性。語音呼叫功能,使得原來發(fā)布預警時逐一給各區(qū)氣象局和上海市預警聯(lián)動部門人工撥打電話變得簡單易行,傳真亦是如此。在以后的工作中,根據(jù)業(yè)務需求的變化進一步完善系統(tǒng),提供更優(yōu)質(zhì)地服務。
參考文獻(References)
[1] Gade AN,Larsen TS,Nissen SB,et al.REDIS:A value-based decision support tool for renovation of building portfolios[J].BUILDING AND ENVIRONMENT,2018,142(9):107-108.
[2] Sumba Xavier,Segarra Jos,Ortiz Jos,et al.REDI:A linked data-powered research networking platform[C].Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics),2018,v 11155 LNCS:121-125.
[3] Leea Taeyoung,Kim Yongsung,Hwang Eenjun.Abnormal Payment Transaction Detection Scheme Based on Scalable Architecture and Redis Cluster[C].2018 International Conference on Platform Technology and Service,2018.
[4] 華韻子,林紅.華東區(qū)域自動站數(shù)據(jù)實時融合顯示與多級警示技術(shù)[J].軟件工程,2016,19(5):26-29.
[5] 孫超.Redis內(nèi)存數(shù)據(jù)庫在智慧消防系統(tǒng)設(shè)計中的應用[J].網(wǎng)絡安全技術(shù)與應用,2018(8):103-105.
[6] 熊肖磊,王春偉,趙炯,等.基于Redis與SSM的大型設(shè)備數(shù)據(jù)運用系統(tǒng)設(shè)計[J].現(xiàn)代機械,2018(6):29-34.
[7] 鄧萬宇,劉光達,董瑩瑩.一種基于Scrapy-Redis的分布式微博數(shù)據(jù)采集方案[J].信息技術(shù),2018(11):59-62.
[8] 崔夢天,吳倩.基于Redis緩存的數(shù)字化圖書館應用[J].吉林師范大學學報(自然科學版),2018(2):123-127.
[9] Paul Nicole,Lee Ji Su,Mieler Michael.et al.Improving Estimates of Earthquake-Induced Downtime in Individual Buildings Using the REDi Methodology[C].Structures Congress 2018,2018(4):77-86.
[10] Kimm Haklin,Li Zuqing,Kimm Hanke.SCADIS:Supporting Reliable Scalability in Redis Replication on Demand[C].Proceedings-2nd IEEE International Conference on Smart Cloud,2017:7-12.
[11] Josiah,L.Carlson.黃健宏,譯.Redis實戰(zhàn)[M].北京:人民郵電出版,2015.
[12] Jeremy Nelson.汪佳南,譯.深入理解Redis[M].北京:電子工業(yè)出版社,2017.
作者簡介:
林? 紅(1966-),女,碩士,高級工程師.研究領(lǐng)域:氣象行業(yè)軟件研發(fā).
華韻子(1981-),女,碩士,高級工程師.研究領(lǐng)域:氣象行業(yè)軟件研發(fā).