李水龍,周躍勇,周施文,于偉恒
(福建省地震局,福建 福州 350003)
地震預警利用震中周圍少量觸發(fā)臺站的信息,估算地震基本參數(shù),基于預警目標及時發(fā)出告警信息,以減輕人員傷亡,減少經(jīng)濟損失,因此對地震預警系統(tǒng)的處理時效提出了較高的要求。
地震預警處理涉及的環(huán)節(jié)較多,包括數(shù)據(jù)接收、仿真變換、震相撿拾、幅值量算、特征周期計算、地震事件判定、震中定位、震級估算、可靠度計算、預警烈度預測、預警時間估算等多個環(huán)節(jié)。傳統(tǒng)的處理方式是以串行的方式從數(shù)據(jù)接收開始按流程依次處理,由于各個環(huán)節(jié)計算復雜度不同,計算量存在較大差異,整個過程的處理效率容易受計算較為復雜環(huán)節(jié)的影響,從而降低地震預警處理的時效性。
在地震預警系統(tǒng)的研發(fā)過程中,必須從技術上尋求能夠解耦不同處理環(huán)節(jié)的密切關聯(lián)、探索從串行處理向并行處理轉變的途徑,從而有力地保證地震預警系統(tǒng)的時效性。
生產(chǎn)者—消費者模式是并發(fā)、多線程編程中一種經(jīng)典的設計模式,將串行處理變成并行處理,實現(xiàn)了流程解耦,提升了整個系統(tǒng)的處理效率。生產(chǎn)者—消費者模型通過“找出需要做什么”和“執(zhí)行需要做什么”的分離,簡化了開發(fā)模型。生產(chǎn)者和消費者能夠以不同的速度生產(chǎn)和消費數(shù)據(jù)。
軟件開發(fā)經(jīng)常會遇到這樣的情況:一個模塊負責生成由另一個模塊處理的數(shù)據(jù)(這里的模塊是通用的,它們可以是類、函數(shù)、線程、進程等)。產(chǎn)生數(shù)據(jù)的模塊被形象地稱為生產(chǎn)者,處理數(shù)據(jù)的模塊稱為消費者。為了匹配生產(chǎn)者和消費者之間的速度差異,通常會在兩者之間插入一個倉庫充當中介。生產(chǎn)者將數(shù)據(jù)放入倉庫,消費者從倉庫中取出數(shù)據(jù),完成一次數(shù)據(jù)傳輸過程。
因此,生產(chǎn)者—消費者模式包含三類參與者:生產(chǎn)者——負責生產(chǎn)產(chǎn)品;倉庫——負責存放產(chǎn)品;消費者——負責消耗產(chǎn)品。生產(chǎn)者—消費者模式結構如圖1所示。
圖1 生產(chǎn)者—消費者模式結構示意圖
生產(chǎn)者在倉庫有空位時生產(chǎn),倉庫滿倉時便停止生產(chǎn)。只有倉庫不是空無一物并且處于等待狀態(tài)時,消費者才能消費。當消費者發(fā)現(xiàn)倉庫中沒有產(chǎn)品可以消費時,他們會通知生產(chǎn)者生產(chǎn)。生產(chǎn)者在生產(chǎn)消耗性產(chǎn)品時,應通知等待的消費者進行消費。生產(chǎn)者—消費者運行流程如圖2所示。
圖2 生產(chǎn)者消費者運行流程圖
生產(chǎn)者—消費者模式能為系統(tǒng)研發(fā)帶來以下好處:(1)支持流程解耦——通過引入共享倉庫,實現(xiàn)生產(chǎn)者與消費者之間的解耦,隔離生產(chǎn)者與消費者各自變化導致的連鎖反應。(2)支持并發(fā)執(zhí)行——通過把生產(chǎn)者活動和消費者活動分別放入獨立的并發(fā)主體中,把活動環(huán)節(jié)從串行轉變?yōu)椴⑿?。?)支持忙閑不均——根據(jù)共享倉庫的容量,可以支持生產(chǎn)者和消費者以不同的速度完成各自的工作。
在地震預警系統(tǒng)中引入生產(chǎn)者—消費者模式,可以實現(xiàn)各個地震預警處理環(huán)節(jié)的流程解耦,提升地震預警處理的并行化程度,對提高地震預警處理效率起到至關重要的作用。
通過對地震預警各個具體處理環(huán)節(jié)的歸納抽象,可知地震預警處理過程在較高層面包含以下環(huán)節(jié):數(shù)據(jù)接收、數(shù)據(jù)派發(fā)、通道處理、綜合處理、控制網(wǎng)關、外圍應用,等等。把生產(chǎn)者—消費者模式應用到上述各個環(huán)節(jié),形成地震預警系統(tǒng)的并行化解決方案,如圖3所示。
圖3 生產(chǎn)者—消費者模式在地震預警中應用的示意圖
在地震預警處理的生產(chǎn)活動和消費活動之間,常常將數(shù)據(jù)單元作為交換數(shù)據(jù)的基準。每一項生產(chǎn)活動都被存入倉庫緩沖區(qū)(一個數(shù)據(jù)單元),每個消費活動都從倉庫緩沖區(qū)中取出一個數(shù)據(jù)單元。數(shù)據(jù)單元必須與業(yè)務對象相關聯(lián),因此數(shù)據(jù)單元的設計受到特定業(yè)務邏輯的影響。
在設計數(shù)據(jù)單元時,要滿足以下要求:(1)整體性。在生產(chǎn)活動和消費活動之間交換數(shù)據(jù)單元時,要么將整個數(shù)據(jù)單元傳遞給消費活動,要么根本不傳遞數(shù)據(jù)單元,部分傳遞的情況是不被允許的。(2)獨立性。數(shù)據(jù)單元之間不相互依賴。某個數(shù)據(jù)單元傳輸失敗不影響已完成傳輸和尚未傳輸?shù)臄?shù)據(jù)單元。(3)顆粒度。業(yè)務對象與數(shù)據(jù)單元對應關聯(lián)的程度。粒度粗細的權衡基于眾多因素,出于一些經(jīng)驗上的考慮,是一個綜合權衡的結果。
以數(shù)據(jù)接收和通道處理兩個處理環(huán)節(jié)的流程解耦為例,解釋說明生產(chǎn)者—消費者模式在地震預警系統(tǒng)中的具體應用。原來數(shù)據(jù)接收環(huán)節(jié)與通道處理環(huán)節(jié)直接相連,兩者之間存在著較強的流程綁定關系。在新的設計里,引入數(shù)據(jù)派發(fā),作為數(shù)據(jù)接收和通道處理之間的緩沖。數(shù)據(jù)派發(fā)從數(shù)據(jù)接收中獲取實時波形數(shù)據(jù),內(nèi)部緩存后再將波形數(shù)據(jù)轉發(fā)給通道處理,進行仿真變換和特征提取。通過這種方式,較好地解決了連續(xù)不斷的海量波形數(shù)據(jù)到達與復雜多變的特征處理效率不一致引起的堵塞問題,從整體上保證了地震預警處理的高效穩(wěn)定,具體應用示例如圖4所示。
圖4 生產(chǎn)者—消費者模式的具體應用示例
上述處理的部分核心代碼為:
生產(chǎn)活動——把陸續(xù)到達的二進制字節(jié)數(shù)據(jù)流轉化為一個個MiniSeed對象,存入緩沖隊列中。
倉庫——阻塞式、以先入先出方式訪問的緩沖隊列。MiniSeed對象是基本的數(shù)據(jù)單元,存儲miniseed格式的波形數(shù)據(jù)。
miniSeedQueue = new ArrayBlockingQueue<MiniSeed>(c apac
ity,true);
消費活動——啟動一個新線程,從緩沖隊列中依次獲取MiniSeed對象,遞交給通道處理器進行仿真變換和特征提取等處理。
地震預警波形數(shù)據(jù)接收主要負責從多個實時流服務器接收獲取臺站的實時波形數(shù)據(jù)流,根據(jù)波形數(shù)據(jù)格式,自動產(chǎn)生符合格式要求的波形數(shù)據(jù)包并進行解析,生成對應的波形數(shù)據(jù)對象,為后續(xù)的波形數(shù)據(jù)質(zhì)量檢測提供數(shù)據(jù)來源。另外,實現(xiàn)自動重連實時波形流服務器的功能,以提高實時波形數(shù)據(jù)的連續(xù)性和系統(tǒng)的可靠性。下面是地震預警數(shù)據(jù)接收的主要流程,流程圖如圖5所示。
圖5 地震預警波形數(shù)據(jù)接收流程
(1)當有新的波形數(shù)據(jù)到達時,本項功能就會啟動。
(2)系統(tǒng)置位對應的實時波形流服務器的數(shù)據(jù)到達標記。
(3)系統(tǒng)把接收到的波形數(shù)據(jù)的字節(jié)數(shù)組存放到波形數(shù)據(jù)字節(jié)緩沖區(qū)中。
(4)系統(tǒng)根據(jù)波形數(shù)據(jù)包大小從緩沖區(qū)中提取所需字節(jié)的數(shù)據(jù)。
(5)系統(tǒng)根據(jù)波形數(shù)據(jù)格式解析出波形數(shù)據(jù)對象,并存放到臨時波形數(shù)據(jù)對象列表中。
(6)重復步驟4,直至波形數(shù)據(jù)緩沖區(qū)中的內(nèi)容符合要求為止。
(7)系統(tǒng)輸出臨時波形數(shù)據(jù)對象列表的全部內(nèi)容。
(8)本項功能執(zhí)行結束。
下面是輔助流程,流程圖如圖6所示。
圖6 地震預警波形數(shù)據(jù)接收輔助流程
針對每個連接的實時波形流服務器,建立一個定時監(jiān)控過程:
(1)設定時間間隔到達時,本項功能就會啟動。
(2)檢查對應的實時波形流服務器的數(shù)據(jù)到達標記。
(3)如果數(shù)據(jù)到達標記已被置位,則清空數(shù)據(jù)到達標記,并轉到步驟5。
(4)如果數(shù)據(jù)到達標記并未置位,則重新與對應的實時波形流服務器建立連接。
(5)本項功能執(zhí)行結束。
內(nèi)部信息傳遞接口通過封裝使不同數(shù)據(jù)對象以規(guī)范統(tǒng)一樣式在系統(tǒng)的各個部分之間無礙流通。該接口的簡要定義為:
public interface IDataArrive{
當有新的數(shù)據(jù)對象到達時,dataArrive方法會被激活以實現(xiàn)對數(shù)據(jù)對象的進一步加工處理。dataContainer參數(shù)實現(xiàn)了對不同數(shù)據(jù)對象的統(tǒng)一封裝,它的簡要定義為:
在實際的測試和在線運行過程中,當接入的臺站數(shù)量較多時,生產(chǎn)者產(chǎn)生數(shù)據(jù)多而且快,而消費者卻無法及時處理消費完畢,會產(chǎn)生“快生產(chǎn)者-慢消費者”問題,實時數(shù)據(jù)流服務器將會把預警系統(tǒng)當作“慢消費者”,進而強制斷開其連接,導致預警系統(tǒng)無法接收到臺站數(shù)據(jù),因此,在引入生產(chǎn)者—消費者模式的同時,在臺站數(shù)量足夠龐大時,還需引入高性能并發(fā)處理框架,解決“快生產(chǎn)者—慢消費者”的瓶頸問題。