段洪杰,楊黎薇,段 然,劉瓊仙,崔建文
(1.云南省地震局,云南 昆明 650224;2.中國(guó)電信翼支付,上海 200000)
軟件框架是應(yīng)用系統(tǒng)的核心骨架,其應(yīng)用水平?jīng)Q定了應(yīng)用系統(tǒng)開(kāi)發(fā)的質(zhì)量(周曉翠等,2016;周偉良,2012;袁帥,2017)。
國(guó)際上,開(kāi)發(fā)者們正嘗試將各種軟件框架與不同新的編程思想相互融合,從而產(chǎn)出許多著名的編程思想及軟件框架。很多著名的開(kāi)源框架正在快速升級(jí)完善,有的框架已經(jīng)連續(xù)開(kāi)發(fā)了十多年,水平和層次步步提高,如Spring,Hibernate,EJB,SOAP,Open Stack,Struts等。而在國(guó)內(nèi),大部分軟件開(kāi)發(fā)人員不愿投入精力去自主研發(fā)軟件框架,而是直接使用國(guó)外開(kāi)發(fā)的開(kāi)源框架,將其應(yīng)用到系統(tǒng)的開(kāi)發(fā)工作中,軟件框架的自主研發(fā)水平與世界水平的距離逐漸拉大。國(guó)內(nèi)技術(shù)論壇上存在部分框架程序的代碼片段,但多數(shù)為娛樂(lè)性質(zhì),實(shí)用性不大。少數(shù)的軟件科技公司擁有自己開(kāi)發(fā)并可以應(yīng)用的PHP框架,但是設(shè)計(jì)有短板。例如不同功能模塊的HTTP上POST和GET的入口點(diǎn)只有同一個(gè)page、把程序不相關(guān)邏輯的模塊捆綁一體、編程的可視化效果很差等。國(guó)內(nèi)地震行業(yè)中軟件框架存在兩種情況:一是簡(jiǎn)單的地球物理算法小程序編程,無(wú)需運(yùn)用軟件工程技術(shù)、軟件版本控制、設(shè)計(jì)模式理念以及考慮軟件框架;二是規(guī)模較大的地震應(yīng)用系統(tǒng),但這些系統(tǒng)仍然依托于國(guó)外流行的軟件框架開(kāi)發(fā)。
本文分析了缺乏自主框架技術(shù)造成的危害,并借鑒國(guó)外地震系統(tǒng)的設(shè)計(jì)思想及設(shè)計(jì)模式,自主研發(fā)了軟件框架,并對(duì)自主研發(fā)框架的使用情況進(jìn)行了總結(jié)。
在開(kāi)發(fā)地震應(yīng)用系統(tǒng)的過(guò)程中,國(guó)外開(kāi)源的軟件框架得到了豐富的應(yīng)用,也取得了很多成果。但沒(méi)有基本框架的自主研發(fā),會(huì)產(chǎn)生一系列嚴(yán)重的問(wèn)題:①存在隱性風(fēng)險(xiǎn)。國(guó)內(nèi)有很多開(kāi)發(fā)系統(tǒng),例如單位保密系統(tǒng)、電子政務(wù)系統(tǒng)(OA)等(魏玉嬌,2017;高峻,2014;楊璇,2009),就是采用國(guó)外開(kāi)源的框架,如果該框架隱匿了難以發(fā)現(xiàn)的后門漏洞,就有信息泄漏的風(fēng)險(xiǎn),一旦發(fā)生國(guó)際糾紛,國(guó)外框架構(gòu)建者就可遠(yuǎn)程入侵或破壞(沈逸,2013;趙衍,2011);②受制于人,存在使用局限性。就要遵守相應(yīng)限制規(guī)則,不僅軟件框架的開(kāi)發(fā)費(fèi)用會(huì)增多,應(yīng)用價(jià)值也會(huì)大大縮小。如果使用許可證帶有政治因素(開(kāi)源社區(qū)的軟件框架會(huì)受到美國(guó)的出口管制等),還容易引起法律風(fēng)險(xiǎn)。③國(guó)外的軟件框架的開(kāi)發(fā)者若停止升級(jí),會(huì)導(dǎo)致發(fā)現(xiàn)重大漏洞后無(wú)法挽救,將建立在該框架上的應(yīng)用系統(tǒng)置于不安全非穩(wěn)定狀態(tài),甚至突然崩潰。例如由于開(kāi)發(fā)者在2010年停止升級(jí)WebWork2框架,致使使用該框架開(kāi)發(fā)的各種應(yīng)用系統(tǒng)面臨無(wú)補(bǔ)丁可打的難題(何華,2006)。④世界上流行的軟件框架并不是針對(duì)地震應(yīng)用系統(tǒng)去開(kāi)發(fā)設(shè)計(jì)的??蚣軟](méi)有專屬功能,就需要多種框架融合并行,將造成軟件框架龐大、功能重復(fù)、運(yùn)行效率低等問(wèn)題(楊萬(wàn)里,2016),并且需要開(kāi)發(fā)人員長(zhǎng)時(shí)間的學(xué)習(xí)磨合才能熟練掌握。例如Struts為MVC模式(唐琳,2014),但Spring帶有自身的MVC(薛峰等,2012);Hibernate是數(shù)據(jù)庫(kù)通用接口層的實(shí)現(xiàn)(克里斯蒂安,2016),但Spring也有自己的數(shù)據(jù)庫(kù)接口層;Spring自身的數(shù)據(jù)庫(kù)接口功能又弱于Hibernate;而Spring的AOP和IOC功能強(qiáng)大,又是開(kāi)發(fā)應(yīng)用系統(tǒng)的利器(翟劍錕,2013)。將Struts,Spring,Hibernate組合在一起使用非常有益,但是也產(chǎn)生了大量的冗余(林志燦,2018;張志鋒,2013;范新?tīng)N,2014)。⑤將不同類型的軟件框架強(qiáng)行捆綁,無(wú)法深入各框架的內(nèi)核銜接。這在性能、安全和穩(wěn)定性方面均是隱患。例如,Struts2軟件框架就出現(xiàn)了很多安全漏洞,而且多數(shù)都是高危、緊急的重大安全漏洞,詳見(jiàn)表1。
表1 2017—2018年3月Struts2框架的安全漏洞列表Tab.1 Security hole list of Strusts2 framewrok from 2017 to March 2018
注:表中數(shù)據(jù)來(lái)源于:https://cwiki.apache.org/confluence/display/WW/Security+Bulletins(Apache Struts網(wǎng)站).
國(guó)外開(kāi)源軟件框架曾多次因安全漏洞問(wèn)題在中國(guó)導(dǎo)致大規(guī)模的網(wǎng)絡(luò)安全事件。如數(shù)量眾多的服務(wù)操作系統(tǒng)被破壞或被植入特洛伊木馬,大量重要的敏感數(shù)據(jù)外泄(呂志泉,賈子驍,2018)等。其中,大學(xué)、科研所、金融、保險(xiǎn)等行業(yè)網(wǎng)站屬于重災(zāi)區(qū)?!皣?guó)家信息安全漏洞共享平臺(tái)網(wǎng)站”的“綿羊墻”公開(kāi)查詢的資料顯示:在沒(méi)有出現(xiàn)大規(guī)模網(wǎng)絡(luò)安全事件的平靜期,僅2018年4月20日一天,國(guó)內(nèi)就有不少運(yùn)用系統(tǒng)或網(wǎng)站被入侵??梢?jiàn)應(yīng)用系統(tǒng)的安全是一個(gè)嚴(yán)峻的問(wèn)題,詳見(jiàn)表2。
表2 2018年4月20日公布在“綿羊墻”的被黑客入侵的應(yīng)用系統(tǒng)(公開(kāi)來(lái)源)Tab.2 The hacked application system released on Sheep Wall on April 20,2018(From public websites)
注:表中數(shù)據(jù)來(lái)源于:http://www.cnvd.org.cn/sheepWall/list(國(guó)家信息安全漏洞共享平臺(tái)網(wǎng)站).
地震應(yīng)用系統(tǒng)在地震后要及時(shí)處理地震數(shù)據(jù),承擔(dān)著重大的社會(huì)責(zé)任,出現(xiàn)安全漏洞、不穩(wěn)定、系統(tǒng)崩潰等問(wèn)題會(huì)造成不可挽回的損失。使用國(guó)外的開(kāi)源軟件框架,會(huì)嚴(yán)重影響系統(tǒng)的穩(wěn)定性(王懷,2018)。因此,開(kāi)發(fā)具有自主研發(fā)的軟件框架,是非常重要和迫切的任務(wù)。
筆者分析了國(guó)內(nèi)一些地震應(yīng)用系統(tǒng)使用軟件框架的情況,見(jiàn)表3。將多種軟件框架整合到一起,不但會(huì)使應(yīng)用系統(tǒng)變得更加復(fù)雜,還對(duì)開(kāi)發(fā)人員的專業(yè)能力有較高的要求。例如云南強(qiáng)震臺(tái)網(wǎng)烈度速報(bào)系統(tǒng)使用的Struts + Spring + Hibernate的流行開(kāi)源框架的組合(段洪杰等,2009),需要配置一個(gè)管理Session會(huì)話的Servlet程序OpenSessionInViewFilter,以便啟動(dòng)服務(wù)時(shí)加載,還要配置ContextLoaderListener監(jiān)聽(tīng)等。
國(guó)際上地震行業(yè)的應(yīng)用系統(tǒng)主要使用自主開(kāi)發(fā)的軟件框架,對(duì)第三方開(kāi)源軟件的依賴較少。美國(guó)地質(zhì)調(diào)查局(USGS)開(kāi)發(fā)的ShakeMap 是一個(gè)震動(dòng)圖生成軟件,在世界上得到了廣泛的運(yùn)用。ShakeMap可繪制地震后儀器烈度的分布和嚴(yán)重程度,可以衡量受地震影響區(qū)域的范圍,確定哪些區(qū)域可能受到最大破壞,這些信息對(duì)地震救援的快速評(píng)估損失有重要意義。新版的ShakeMap4.0使用python語(yǔ)言開(kāi)發(fā),使用自主設(shè)計(jì)的框架,減少了對(duì)開(kāi)源框架的依賴,不再使用ShakeMap3.5以前版本使用的開(kāi)源框架LWP,DBD(Perl語(yǔ)言)等。ShakeMap4.0的軟件框架的結(jié)構(gòu)和作用是:①數(shù)據(jù)準(zhǔn)備、處理和渲染都在不同的計(jì)算單元中進(jìn)行;②處理序列在識(shí)別地震并決定產(chǎn)生震動(dòng)圖時(shí),通過(guò)震動(dòng)組合模塊收集關(guān)于地震事件(起源和破裂參數(shù),地震數(shù)據(jù)等)的可用信息,以及ShakeMap4.0的配置信息(其中包括關(guān)于事件的地震構(gòu)造模型和關(guān)于GMPE選擇的相關(guān)選擇的信息),并生成HDF5格式的shake-data.hdf文件;③該文件被注入到消息傳遞系統(tǒng)中,生成各種周期的波譜和特定位置的地面震動(dòng)信息,再通過(guò)網(wǎng)絡(luò)服務(wù)請(qǐng)求任何必需的震動(dòng)圖圖件數(shù)據(jù),然后通過(guò)shake模塊,由shake-result.hdf渲染繪制出震動(dòng)圖圖件,通過(guò)消息傳遞系統(tǒng)或其他手段將其傳送到網(wǎng)站;④網(wǎng)站程序自動(dòng)為該地震事件創(chuàng)建“頁(yè)面”,震動(dòng)圖件在網(wǎng)站的緩存中緩沖,以提高網(wǎng)站響應(yīng)速度和圖片的顯示速度。ShakeMap4.0框架增加了穩(wěn)定性,減少了數(shù)據(jù)在模塊之間交互的復(fù)雜程度,具體如圖1所示。
表3 地震應(yīng)用系統(tǒng)開(kāi)發(fā)中使用的國(guó)外軟件框架Tab.3 Foreign software frameworks used in the development of seismic application systems
圖1 美國(guó)聯(lián)邦地質(zhì)調(diào)查局(USGS)ShakeMap4.0軟件框架Fig.1 Software framework of USGS ShakeMap 4.0
亥姆霍茲中心波茨坦,GFZ德國(guó)地球科學(xué)研究中心開(kāi)發(fā)的SeisComP應(yīng)用系統(tǒng),是全球運(yùn)用最廣泛的通過(guò)互聯(lián)網(wǎng)進(jìn)行地震數(shù)據(jù)采集和實(shí)時(shí)數(shù)據(jù)交換的地震應(yīng)用系統(tǒng),其數(shù)據(jù)傳輸網(wǎng)絡(luò)協(xié)議SeedLink成為了事實(shí)上的世界標(biāo)準(zhǔn)。SeisComP被設(shè)計(jì)為高標(biāo)準(zhǔn)的全自動(dòng)數(shù)據(jù)采集和(近)實(shí)時(shí)數(shù)據(jù)處理工具,包括質(zhì)量控制、事件檢測(cè)和位置以及事件警報(bào)的傳播,并在此基礎(chǔ)上實(shí)現(xiàn)了德國(guó)印度洋海嘯預(yù)警系統(tǒng)。SeisComP3使用自己的軟件框架,即SeisComP3軟件框架,由C語(yǔ)言開(kāi)發(fā),其軟件框架的結(jié)構(gòu)和作用是:由一組獨(dú)立的應(yīng)用程序組成,每個(gè)應(yīng)用程序執(zhí)行一項(xiàng)離散任務(wù),應(yīng)用程序之間的通信通過(guò)基于TCP / IP的消息傳遞系統(tǒng)來(lái)實(shí)現(xiàn)。該消息系統(tǒng)基于工具包Spread(開(kāi)源),可在本地和廣域網(wǎng)上提供高性能消息服務(wù)。在Spread的頂部,通過(guò)scmaster負(fù)責(zé)處理非原生由Spread提供的其他SeisComP3需求。使用消息傳遞交換元數(shù)據(jù)(例如揀選)和配置信息,實(shí)現(xiàn)系統(tǒng)各個(gè)模塊的協(xié)作,如圖2所示。
圖2 亥姆霍茲中心波茨坦,GFZ德國(guó)地球科學(xué)研究中心開(kāi)發(fā)的SeisComP3軟件框架Fig.2 SeisComP3 software framework of Helmholtz Centre Potsdam,GFZ German Research Centre for Geosciences
SeisComP3可將關(guān)鍵功能作為獨(dú)立模塊實(shí)施,以保證與其他功能的獨(dú)立性(例如選擇器,量級(jí)計(jì)算,交互式分析);輕松實(shí)現(xiàn)自定義模塊,強(qiáng)化了硬件和軟件的獨(dú)立性;具備在不同的自動(dòng)實(shí)時(shí)系統(tǒng)之間進(jìn)行數(shù)據(jù)交換的能力(分布式分發(fā)模塊);提高了地震發(fā)生時(shí)系統(tǒng)運(yùn)行速度,并增加了系統(tǒng)的可靠性。
綜上所述,國(guó)外的地震應(yīng)用系統(tǒng)主要針對(duì)地震業(yè)務(wù)的應(yīng)用特點(diǎn)自己設(shè)計(jì)框架,以消息控制器軟件模塊為主線,精練、高效。國(guó)內(nèi)的地震應(yīng)用系統(tǒng)主要依賴于國(guó)外的開(kāi)源軟件框架,缺乏自主研發(fā)。在軟件框架自主研發(fā)方面,國(guó)外地震行業(yè)遠(yuǎn)遠(yuǎn)地走在了國(guó)內(nèi)地震行業(yè)的前面。
國(guó)際上的計(jì)算機(jī)專家重視制定各種軟件開(kāi)發(fā)標(biāo)準(zhǔn),成立了一些計(jì)算機(jī)開(kāi)發(fā)的標(biāo)準(zhǔn)委員會(huì)。各種軟件框架主要是實(shí)現(xiàn)其制定的最新軟件標(biāo)準(zhǔn),現(xiàn)實(shí)中,性能、易用性、兼容性等是放在第二位的。隨著軟件標(biāo)準(zhǔn)的快速更新,其軟件框架也不斷快速更新。由于軟件標(biāo)準(zhǔn)的前后差異,造成軟件框架功能龐雜、不穩(wěn)定、有些脫離實(shí)際應(yīng)用。因此要自主研發(fā)軟件框架,除了要吸收國(guó)際上通用的軟件框架和國(guó)際上地震行業(yè)軟件框架的優(yōu)點(diǎn)外,還要以實(shí)用為目標(biāo)。筆者在計(jì)算機(jī)語(yǔ)言的選擇上考慮了python,Java,PHP三種編程語(yǔ)言:①Python語(yǔ)法簡(jiǎn)潔清晰,具有豐富和強(qiáng)大的庫(kù),能夠把用其他語(yǔ)言制作的各種模塊輕松地聯(lián)結(jié)在一起,但考慮到Python各個(gè)版本之間的兼容性太差,未來(lái)升級(jí)Python版本時(shí)可能需要對(duì)已經(jīng)開(kāi)發(fā)完成的軟件框架進(jìn)行修改,因此放棄Python。②Java曾經(jīng)用于開(kāi)發(fā)云南強(qiáng)震臺(tái)網(wǎng)烈度速報(bào)系統(tǒng),在開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)Java操作系統(tǒng)底層的能力太弱。③為了增加系統(tǒng)底層控制能力,不得不另外使用PHP語(yǔ)言開(kāi)發(fā)系統(tǒng)底層。形成兩種計(jì)算機(jī)語(yǔ)言的底層混合編程,增加了復(fù)雜性。筆者根據(jù)不同的應(yīng)用場(chǎng)景,開(kāi)發(fā)了2個(gè)自主設(shè)計(jì)框架的版本:一個(gè)是PHP版,專門用于需要對(duì)操作系統(tǒng)底層進(jìn)行操作控制的應(yīng)用系統(tǒng)的開(kāi)發(fā)(在Linux系統(tǒng)下,可以方便使用C Shell、管道命令等);另一個(gè)是Java版,用于不需要對(duì)操作系統(tǒng)底層進(jìn)行操作控制,需要增強(qiáng)網(wǎng)絡(luò)通信能力的應(yīng)用系統(tǒng)的開(kāi)發(fā)。
設(shè)計(jì)自主的軟件框架時(shí)需考慮3點(diǎn):一是盡量避免使用現(xiàn)有的流行國(guó)外軟件框架作為基礎(chǔ)框架,這樣才能擁有框架的自主性;二是使用消息做主線控制器模塊,以便適應(yīng)地震業(yè)務(wù)的特點(diǎn);三是軟件框架要有通用性,除了應(yīng)用于地震系統(tǒng)外,還要可以運(yùn)用于不同行業(yè)的應(yīng)用系統(tǒng)開(kāi)發(fā)。所以筆者自主設(shè)計(jì)開(kāi)發(fā)了:面向方面編程的安全策略模塊Check,實(shí)現(xiàn)MVC(Action)設(shè)計(jì)模式的軟件模塊、Message消息主線控制器、Service業(yè)務(wù)邏輯層、DAO數(shù)據(jù)庫(kù)訪問(wèn)模塊、Cache緩沖模塊。本軟件框架以實(shí)用為出發(fā)點(diǎn),簡(jiǎn)單、高效、優(yōu)雅。PHP版命名為PSimple框架,而Java版命名為JSimple框架,兩個(gè)版本的框架結(jié)構(gòu)基本相同,軟件框架的模塊(包),見(jiàn)表4。
PSimple 和JSimple 框架的結(jié)構(gòu)和作用是:在系統(tǒng)啟動(dòng)后調(diào)用init模塊進(jìn)行初始化。JSimple框架的初始化放在Servlet或構(gòu)造函數(shù)中,PSimple框架的初始化放在構(gòu)造方法中。初始化時(shí)開(kāi)辟3個(gè)緩沖區(qū),分別是內(nèi)存緩沖、數(shù)據(jù)緩沖、網(wǎng)頁(yè)緩沖,并啟動(dòng)消息傳遞控制器(地震消息)處于待命狀態(tài)。各個(gè)MVC模塊的Action都可以與地震消息通信,實(shí)現(xiàn)了各個(gè)Action的協(xié)同工作(地震發(fā)生后,監(jiān)測(cè)地震信息服務(wù)器的2個(gè)Action分別取到地震參數(shù)和強(qiáng)震數(shù)據(jù),通過(guò)地震消息將數(shù)據(jù)傳到各個(gè)Action中,步調(diào)一致協(xié)同工作)。每個(gè)Action又將工作分解為MVC模式,數(shù)據(jù)放在模型(M)中,通過(guò)運(yùn)算流程(C)控制,如果Action有視圖(V)的話調(diào)用視圖層。在Action下增加一層業(yè)務(wù)邏輯層,專門用于存放數(shù)據(jù)計(jì)算處理的程序代碼。業(yè)務(wù)邏輯層之下再加一個(gè)數(shù)據(jù)庫(kù)接口層(孟晨等2012),專門用于程序與數(shù)據(jù)庫(kù)的聯(lián)結(jié)以及數(shù)據(jù)入庫(kù)、出庫(kù)等。數(shù)據(jù)緩沖接到數(shù)據(jù)庫(kù)接口中,用于提升數(shù)據(jù)庫(kù)查詢性能;網(wǎng)頁(yè)緩沖接入到MVC的視圖(V)層,用于增加網(wǎng)頁(yè)的打開(kāi)速度;內(nèi)存緩沖可以在軟件框架的任何地方調(diào)用,用于緩沖任何開(kāi)發(fā)人員需要緩沖的數(shù)據(jù)。數(shù)據(jù)攔截模為一個(gè)自動(dòng)化模塊,在視圖層數(shù)據(jù)轉(zhuǎn)入轉(zhuǎn)出Action層,Action層數(shù)據(jù)轉(zhuǎn)入轉(zhuǎn)出業(yè)務(wù)邏輯層,業(yè)務(wù)邏輯層數(shù)據(jù)轉(zhuǎn)入轉(zhuǎn)出數(shù)據(jù)庫(kù)接口層時(shí),成批處理數(shù)據(jù)賦值,大幅提高開(kāi)發(fā)效率(比如模型數(shù)據(jù),不需要一一賦值每個(gè)數(shù)據(jù)屬性,只需要指定到模型即可)。另外,實(shí)現(xiàn)了SSO跨域的分布式單點(diǎn)登錄,便于將多個(gè)應(yīng)用系統(tǒng)的用戶整合在一起(汪禺,2017)。該自主設(shè)計(jì)的軟件框架的通用性、靈活性好,便于系統(tǒng)維護(hù)、升級(jí)和擴(kuò)展,能運(yùn)行于UNIX系列的多種操作系統(tǒng)上(圖3)。
表4 基于自主研發(fā)的軟件框架PSimple,JSimple的主要框架模塊Tab.4 Framework modules of PSimple and JSimple based on independent development
圖3 自主研發(fā)的PSimple和JSimple軟件框架Fig.3 Self-developed PSimple and JSimple software framework
為了強(qiáng)化自主設(shè)計(jì)的軟件框架的安全性能,筆者專門設(shè)計(jì)了安全策略。自動(dòng)進(jìn)行入侵檢測(cè),實(shí)現(xiàn)方法是獲取Linux操作系統(tǒng)的進(jìn)程信息,自動(dòng)定時(shí)做快照和比對(duì)。發(fā)現(xiàn)有變化時(shí)給出警示,幫助用戶及時(shí)發(fā)現(xiàn)和排除特洛伊木馬(后門程序)。國(guó)外的軟件框架需要兼容全球不同國(guó)家的文字編碼,要在軟件模塊間傳遞特殊字符,容易形成unicode編碼漏洞和數(shù)據(jù)庫(kù)SQL注入漏洞。自主設(shè)計(jì)的軟件框架使用數(shù)據(jù)字典的設(shè)計(jì)方式,簡(jiǎn)化了軟件模塊之間復(fù)雜的信息傳遞。外界程序交互界面(Web等)與軟件模塊之間只允許傳遞阿拉伯?dāng)?shù)字和26個(gè)英文字母信息(包括數(shù)據(jù)字典的ID),其它字符全部過(guò)濾掉,完全杜絕了unicode編碼漏洞和數(shù)據(jù)庫(kù)SQL注入漏洞。用自主軟件框架開(kāi)發(fā)出的應(yīng)用系統(tǒng),要求以獨(dú)立的用戶身份運(yùn)行,進(jìn)行權(quán)限安全隔離(否則給出警示),避免了權(quán)限提升漏洞,防止黑客獲得ROOT權(quán)限等。
早期的云南強(qiáng)震臺(tái)網(wǎng)中心的烈度速報(bào)系統(tǒng)使用國(guó)外流行的開(kāi)源軟件框架開(kāi)發(fā),主要由3個(gè)自行研發(fā)的分布式系統(tǒng)共同組成,并且使用了ShakeMap3.5的部分軟件模塊進(jìn)行渲染制圖。通過(guò)分布式系統(tǒng)協(xié)同工作,實(shí)現(xiàn)了云南烈度速報(bào)發(fā)布的全自動(dòng)化。由于沒(méi)有掌握國(guó)外軟件框架的設(shè)計(jì)技術(shù),烈度速報(bào)系統(tǒng)在運(yùn)行過(guò)程中存在國(guó)外軟件框架的常見(jiàn)的問(wèn)題和安全隱患,為系統(tǒng)的維護(hù)工作帶來(lái)了麻煩。因此,筆者使用自主研發(fā)的軟件框架PSimple和JSimple對(duì)烈度速報(bào)系統(tǒng)進(jìn)行了升級(jí)。主要升級(jí)了3個(gè)自主研發(fā)的分布式系統(tǒng)(圖4):一是PHP控制中心子系統(tǒng)(PSimple框架)。系統(tǒng)啟動(dòng)后駐留在內(nèi)存中,(近)實(shí)時(shí)檢查云南強(qiáng)震臺(tái)網(wǎng)是不是收到新的強(qiáng)震數(shù)據(jù),如果發(fā)現(xiàn)有新的強(qiáng)震數(shù)據(jù),自動(dòng)解碼,將數(shù)據(jù)存入數(shù)據(jù)庫(kù);二是地震自動(dòng)響應(yīng)子系統(tǒng)(JSimple框架)。系統(tǒng)啟動(dòng)后駐留在內(nèi)存中,(近)時(shí)實(shí)檢查是否有地震速報(bào)信息,如果有地震發(fā)生,通過(guò)系統(tǒng)自動(dòng)組建虛擬強(qiáng)震臺(tái)站網(wǎng)絡(luò),獲取PHP控制中心子系統(tǒng)解碼后的強(qiáng)震臺(tái)站數(shù)據(jù),計(jì)算出烈度數(shù)據(jù)后自動(dòng)調(diào)用烈度圖制圖子系統(tǒng)的部分軟件模塊進(jìn)行渲染制圖;三是HTML視覺(jué)發(fā)布網(wǎng)站系統(tǒng)(JSimple框架)。如果地震自動(dòng)響應(yīng)子系統(tǒng)產(chǎn)生震動(dòng)圖,則自動(dòng)將震動(dòng)圖傳到HTML視覺(jué)發(fā)布網(wǎng)站上,自動(dòng)顯示出來(lái)(圖4)。從圖4可以看出:PHP控制中心、地震自動(dòng)響應(yīng)和HTML視覺(jué)發(fā)布3個(gè)子系統(tǒng)雖然實(shí)現(xiàn)的是不同的功能,但都具有基本相同的軟件框架結(jié)構(gòu),其中地震自動(dòng)響應(yīng)子系統(tǒng)駐留內(nèi)存運(yùn)行,沒(méi)有與用戶交互的可視化界面,所以MVC模型只使用了MC模式。
圖4 基于自主研發(fā)的軟件框架的烈度速報(bào)系統(tǒng)構(gòu)架圖Fig.4 Architecture diagram of the intensity report system of software framework based on independent development
用自主研發(fā)的軟件框架升級(jí)后,減少了大量的冗余運(yùn)算代碼,構(gòu)架系統(tǒng)簡(jiǎn)潔、運(yùn)行穩(wěn)定。且框架安全性較好,沒(méi)有發(fā)現(xiàn)有黑客成功入侵的痕跡。同時(shí),對(duì)漢化(震動(dòng)圖圖件)等底層的開(kāi)發(fā)工作有較好的幫助,有利于將軟件復(fù)雜性隱藏在框架底層(例如在框架內(nèi)部對(duì)漢字進(jìn)行硬編碼等),提高了源程序代碼可讀性、便于維護(hù)性能。烈度速報(bào)系統(tǒng)升級(jí)后應(yīng)用效果良好,能夠在地震發(fā)生后的20 min內(nèi)自動(dòng)產(chǎn)出地震儀器烈度圖,及時(shí)將地震儀器烈度圖提交給應(yīng)急救災(zāi)相關(guān)部門。例如:2017年3月27日云南漾濞5.1級(jí)地震的地震儀器烈度圖的震中烈度與云南省地震局現(xiàn)場(chǎng)調(diào)查發(fā)布的震中烈度一致(VI度)(圖5),且局部場(chǎng)地效應(yīng)明顯,對(duì)應(yīng)急救災(zāi)有較好的參考價(jià)值。
圖5 2017年3月27日云南漾濞5.1級(jí)地震儀器烈度圖Fig.5 Instrumental intensity diagram for the Yunnan Yangbi M5.1 earthquake occurred on March 27,2017
烈度速報(bào)系統(tǒng)是一個(gè)全自動(dòng)系統(tǒng),由實(shí)際地震的信息觸發(fā),自動(dòng)產(chǎn)出震動(dòng)圖。為了適應(yīng)地震演練等需要,工作人員與烈度速報(bào)信息交互的新情況,筆者用自主研發(fā)的軟件框架開(kāi)發(fā)了新的系統(tǒng)firstShake(JSimple框架),該系統(tǒng)實(shí)現(xiàn)了烈度速報(bào)系統(tǒng)的人機(jī)交互界面,可以通過(guò)系統(tǒng)界面對(duì)地震參數(shù)等數(shù)據(jù)進(jìn)行設(shè)置,有利于將其它方式算出的有價(jià)值的地震模型參數(shù)加入到全自動(dòng)烈度速報(bào)系統(tǒng)中。在2018年4月19日的大理洱源的地震演練中,通過(guò)自行研發(fā)的firstShake系統(tǒng)交互界面產(chǎn)出了加速度峰值預(yù)測(cè)圖和地震烈度預(yù)測(cè)圖。錄入地震參數(shù)后的5 min內(nèi)生成PS打印機(jī)格式的圖形。在沒(méi)有實(shí)際強(qiáng)震臺(tái)站收到可用數(shù)據(jù)的情況下,使用了Wald(2017)和Worden等(2010)提出的通過(guò)地形坡度計(jì)算剪切波速分布,再計(jì)算得到近似場(chǎng)地放大效應(yīng)(VS30)。所得到的加速度峰值預(yù)測(cè)圖和地震烈度預(yù)測(cè)圖的局部場(chǎng)地效應(yīng)效果明顯,應(yīng)用效果好(圖6,7)。
地震是突發(fā)事件,在沒(méi)發(fā)生地震時(shí)地震應(yīng)用系統(tǒng)的運(yùn)算量較小,而當(dāng)發(fā)生地震后地震應(yīng)用系統(tǒng)的數(shù)據(jù)計(jì)算量可能呈指數(shù)增長(zhǎng),因此要防止地震應(yīng)用系統(tǒng)在關(guān)鍵時(shí)刻停止工作或崩潰。筆者對(duì)用自主研發(fā)軟件框架開(kāi)發(fā)的地震應(yīng)用系統(tǒng)進(jìn)行了長(zhǎng)達(dá)一年多的性能優(yōu)化和測(cè)試,模擬對(duì)地震應(yīng)用系統(tǒng)進(jìn)行DDOS分布式攻擊(王飛,2013)。方法是從數(shù)臺(tái)服務(wù)器上,使用壓力測(cè)試工具,遠(yuǎn)程對(duì)應(yīng)用系統(tǒng)進(jìn)行攻擊。隨著攻擊強(qiáng)度的不斷增強(qiáng),不斷強(qiáng)化軟件框架性能、應(yīng)用系統(tǒng)性能和優(yōu)化運(yùn)行環(huán)境,具體操作如下:一是對(duì)軟件框架內(nèi)部的優(yōu)化。使用數(shù)據(jù)庫(kù)聯(lián)結(jié)池(JSimple框架),使用數(shù)據(jù)庫(kù)長(zhǎng)聯(lián)結(jié)(PSimple框架)。增大緩沖內(nèi)存,改進(jìn)緩沖數(shù)據(jù)獲取算法、存貯算法;二是對(duì)Java虛擬機(jī)、Web服務(wù)的優(yōu)化(王曉亮,2017),優(yōu)化Xmx和Xms等內(nèi)存(JSimple框架),把Apache服務(wù)改為Nginx(PSimple框架)(黃靜,李炳,2016);三是對(duì)Linux操作系統(tǒng)的底層參數(shù)進(jìn)行優(yōu)化,包括最大打開(kāi)文件數(shù),TCP/IP聯(lián)結(jié)數(shù)等,最后關(guān)閉Linux的OOM,以避免Linux操作系統(tǒng)承受不住內(nèi)存壓力而殺掉地震應(yīng)用系統(tǒng)的進(jìn)程。經(jīng)過(guò)這一系列的優(yōu)化后,用JSimple框架和PSimple框架開(kāi)發(fā)的地震應(yīng)用系統(tǒng)性能優(yōu)異。實(shí)測(cè)結(jié)果表明:同時(shí)可以承受3 500個(gè)以上的TCP/IP聯(lián)結(jié),響應(yīng)快速,內(nèi)存釋放速度快,已經(jīng)達(dá)到了目前國(guó)內(nèi)專業(yè)網(wǎng)站系統(tǒng)的高流量的優(yōu)異性能,如圖8所示。
圖6 在2018年4月19日的大理洱源的地震演練時(shí)產(chǎn)出的加速度峰值預(yù)測(cè)圖Fig.6 Prediction of peak ground acceleration for earthquake drills in Eryuan,Dali on April 19,2018
圖7 在2018年4月19日的大理洱源的地震演練時(shí)產(chǎn)出的地震儀器烈度預(yù)測(cè)圖Fig.7 Prediction of seismic instrument intensity for earthquake drills in Eryuan,Dali,April 19,2018
圖8 基于自主研發(fā)的軟件框架的性能優(yōu)化Fig.8 Performance optimization based on self-developed software framework
本文分析了國(guó)內(nèi)軟件開(kāi)發(fā)缺乏自主研發(fā)的問(wèn)題與危害。在研究國(guó)際上通用著名框架和地震應(yīng)用系統(tǒng)框架的基礎(chǔ)上,吸收其優(yōu)點(diǎn)開(kāi)發(fā)了自主研發(fā)的軟件框架。在框架的設(shè)計(jì)上始終堅(jiān)持不過(guò)度設(shè)計(jì),把復(fù)雜的事件做簡(jiǎn)單的原則,框架具有靈活性、高效性,簡(jiǎn)單易用性等,在地震應(yīng)用系統(tǒng)的開(kāi)發(fā)上取得了良好的效果。同時(shí),對(duì)軟件框架做了深入的優(yōu)化、測(cè)試與研究,取得了優(yōu)異的性能,達(dá)到了開(kāi)發(fā)高性能、高容量的(地震)應(yīng)用系統(tǒng)的目標(biāo)。此外,該框架具有較好的通用性,可廣泛應(yīng)用于各種行業(yè)。該框架的CRUD開(kāi)源模塊按照PGL許可證協(xié)議,在全球性網(wǎng)站github.com提供免費(fèi)下載。當(dāng)然,一個(gè)成熟的軟件框架,需要幾十年的升級(jí)維護(hù),才會(huì)越來(lái)越成熟,未來(lái)依然任重道遠(yuǎn)。