杜星熠,胡 靜,蔣 偉,宋鐵成
(東南大學(xué) 信息科學(xué)與工程學(xué)院,江蘇 南京 210096)
隨著物聯(lián)網(wǎng)(Internet of Things,IoT)的不斷發(fā)展,數(shù)據(jù)量劇增,對設(shè)備數(shù)據(jù)的監(jiān)控處理成為維護(hù)物聯(lián)網(wǎng)的重要部分。在海量數(shù)據(jù)中獲取、查詢到可供維護(hù)人員使用的有用信息,成為物聯(lián)網(wǎng)數(shù)據(jù)管理系統(tǒng)設(shè)計時需要解決的問題。因此,由數(shù)據(jù)驅(qū)動的針對物聯(lián)網(wǎng)的復(fù)雜事件處理[1]成為研究的熱點。物聯(lián)網(wǎng)的日常管理充斥著大量規(guī)則,并且這種規(guī)則隨著業(yè)務(wù)和上層決策的變化而變化。規(guī)則引擎可以實現(xiàn)業(yè)務(wù)規(guī)則和應(yīng)用代碼的去耦合,可以通過調(diào)整業(yè)務(wù)規(guī)則而不改變應(yīng)用代碼的方式來改變物聯(lián)網(wǎng)的運行機制,讓物聯(lián)網(wǎng)更加快速、平穩(wěn)地應(yīng)對需求的變化。
規(guī)則引擎起源于專家系統(tǒng)[2],其通過規(guī)則來進(jìn)行任務(wù)的決策。規(guī)則用于描述業(yè)務(wù)的邏輯或策略。目前,國內(nèi)外的規(guī)則引擎技術(shù)越來成熟,由于其具備靈活性和廣泛適用性,故在物聯(lián)網(wǎng)、電力、娛樂等領(lǐng)域都發(fā)揮著重要的作用。其中,使用最廣泛的是Drools規(guī)則引擎[3]。目前,國內(nèi)外物聯(lián)網(wǎng)場景中對規(guī)則引擎的使用主要是獲取實時數(shù)據(jù)進(jìn)行推理,并根據(jù)推理過程的結(jié)果進(jìn)行操作。在物聯(lián)網(wǎng)數(shù)據(jù)管理應(yīng)用中,目前的主流方法是使用Drools規(guī)則引擎的DRL文件和XLS決策表[4]文件來配置規(guī)則。這種方式可以實現(xiàn)規(guī)則與應(yīng)用代碼的完全分離,并且可以快速建立規(guī)則網(wǎng)絡(luò)。在查詢數(shù)據(jù)時,每個數(shù)據(jù)均會進(jìn)入網(wǎng)絡(luò)進(jìn)行匹配。但在大數(shù)據(jù)量的環(huán)境下,重復(fù)機械的比對會產(chǎn)生冗余,會對性能產(chǎn)生較大影響。所以,針對不同的使用場景,選擇合適的架構(gòu)對提升查詢性能有著重要的作用。
為了解決物聯(lián)網(wǎng)數(shù)據(jù)查詢中重復(fù)比對產(chǎn)生冗余的問題,在DRL規(guī)則文件與決策表文件架構(gòu)的基礎(chǔ)上,設(shè)計了修正數(shù)據(jù)庫的數(shù)據(jù)查詢方法。該方法通過將JSON格式的規(guī)則文件解析后存入數(shù)據(jù)庫中,動態(tài)地與數(shù)據(jù)關(guān)鍵字對比,從而得到符合約束條件的表單數(shù)據(jù);并通過實驗對比了DRL規(guī)則文件、決策表文件方法和修正數(shù)據(jù)庫在大數(shù)據(jù)環(huán)境下查詢數(shù)據(jù)的性能。實驗結(jié)果證明:修正數(shù)據(jù)庫方法可以有效減少數(shù)據(jù)匹配的冗余。
規(guī)則引擎本質(zhì)上是一種推理引擎[5],通過將事實、數(shù)據(jù)與產(chǎn)生式規(guī)則進(jìn)行匹配,并在規(guī)則庫中對規(guī)則進(jìn)行統(tǒng)一管理,最終匹配的規(guī)則將被執(zhí)行[6]。規(guī)則引擎將代碼與業(yè)務(wù)部分進(jìn)行區(qū)分,使業(yè)務(wù)決策變?yōu)橐粋€單獨的部分。其核心工作就是獲取規(guī)則映射的知識,再將其應(yīng)用到特定的數(shù)據(jù)上。規(guī)則生產(chǎn)寄存器中可以通過解析將復(fù)雜的規(guī)則用清晰的形式表達(dá)出來。圖1為Drools規(guī)則引擎的運行機制[7]。
圖1 Drools規(guī)則引擎的運行機制
在Drools規(guī)則引擎的結(jié)構(gòu)中,事實是對象之間、對象屬性之間的關(guān)系,并且事實存在于工作區(qū)域中,是普通業(yè)務(wù)對象的結(jié)果集[8]。規(guī)則是業(yè)務(wù)人員根據(jù)工作需求使用規(guī)則引擎提供的接口來編寫的規(guī)則文件(在Drools規(guī)則引擎中可以是DRL規(guī)則文件也可以是XLS決策表)。將規(guī)則文件加載至內(nèi)存中,可以對事實進(jìn)行一系列的操作,從而進(jìn)行篩選[9]。
Forgy[10]在1979年提出的Rete算法,是產(chǎn)生式系統(tǒng)高效的模式匹配算法。Rete算法利用規(guī)則各個域之間的公用部分,減少規(guī)則的存儲。同時為了保證匹配過程中的速度,Rete算法保存匹配過程中的臨時結(jié)果[11]。為了保存臨時結(jié)果,算法將規(guī)則拆分,以節(jié)點的形式存在,通過節(jié)點連接成為一個網(wǎng)絡(luò)。將所有事實數(shù)據(jù)通過網(wǎng)絡(luò)進(jìn)行規(guī)則篩選。圖2為Rete算法規(guī)則網(wǎng)絡(luò)。
圖2 Rete算法規(guī)則網(wǎng)絡(luò)
Rete匹配網(wǎng)絡(luò)由知識庫、Alpha網(wǎng)絡(luò)、Beta網(wǎng)絡(luò)和輸出集合組成[12]。知識庫是事實進(jìn)入網(wǎng)絡(luò)的入口,也被稱為root節(jié)點或knowledge節(jié)點。輸出節(jié)點又稱output節(jié)點,代表對應(yīng)的規(guī)則經(jīng)過匹配已經(jīng)激活。Alpha網(wǎng)絡(luò)是模式網(wǎng)絡(luò)[13],由規(guī)則庫中的規(guī)則構(gòu)成,用于記錄每一個匹配條件,每一個節(jié)點代表一種匹配模式,每一個模式的所有節(jié)點相連就構(gòu)成一條匹配鏈[14]。Alpha網(wǎng)絡(luò)由alpha節(jié)點構(gòu)成,每個alpha節(jié)點只有1個輸入。為了減少重復(fù)計算量,不同的規(guī)則中若存在不同的模式則可以共用1個節(jié)點。Beta網(wǎng)絡(luò)是連接網(wǎng)絡(luò)[15],用于檢查規(guī)則內(nèi)部不同模式之間因相同變量造成的約束關(guān)系。Beta網(wǎng)絡(luò)由beta節(jié)點構(gòu)成[16],每個beta節(jié)點最多可以有2個輸入。當(dāng)信息傳遞至輸出節(jié)點時[17],代表Rete網(wǎng)絡(luò)與知識庫對應(yīng)的規(guī)則已經(jīng)被解析激活。
Drools規(guī)則引擎極大地推動了行業(yè)的發(fā)展,但仍有很多問題需要解決。DRL文件的語言是類Java語言,需要一定的維護(hù)門檻。若維護(hù)人員對Java較為生疏,則需要一定的學(xué)習(xí)成本。規(guī)則引擎主要應(yīng)用于金融或政務(wù)服務(wù)部門,用于對復(fù)雜的規(guī)則體系以及較為簡單的數(shù)據(jù)進(jìn)行復(fù)雜事物處理。隨著物聯(lián)網(wǎng)設(shè)備的數(shù)量和種類不斷增加,對設(shè)備數(shù)據(jù)的實時性要求也隨之增加。物聯(lián)網(wǎng)管理也逐漸呈現(xiàn)多規(guī)則的特點。規(guī)則引擎在建立多規(guī)則的規(guī)則網(wǎng)絡(luò)方面有著獨特的優(yōu)勢,但大量數(shù)據(jù)進(jìn)行單一的重復(fù)性比對會造成時間和資源的浪費。
為了驗證Drools規(guī)則引擎在物聯(lián)網(wǎng)數(shù)據(jù)查詢中的性能,設(shè)計的架構(gòu)包括數(shù)據(jù)接入單元、規(guī)則引擎模塊和數(shù)據(jù)庫驅(qū)動模塊。其中,數(shù)據(jù)接入模塊模擬物聯(lián)網(wǎng)傳輸數(shù)據(jù),用于存儲不同量級的數(shù)據(jù);規(guī)則引擎模塊用于物聯(lián)網(wǎng)數(shù)據(jù)查詢語句規(guī)則的解析和數(shù)據(jù)約束條件的解析處理;數(shù)據(jù)庫驅(qū)動模塊用于連接規(guī)則引擎與數(shù)據(jù)庫,使得解析后的查詢語句和查詢到的數(shù)據(jù)可以繼續(xù)解析處理。
規(guī)則引擎模塊是整個實驗系統(tǒng)的核心部分。支持用戶根據(jù)實際靈活定義規(guī)則。匹配規(guī)則分別通過DRL規(guī)則文件、決策表和修正數(shù)據(jù)庫的方式定義。傳入規(guī)則引擎的待解析實例采用JSON格式文件,用于描述數(shù)據(jù)庫查詢語言和數(shù)據(jù)的約束條件。實例通過規(guī)則引擎按照規(guī)則的設(shè)定解析成標(biāo)準(zhǔn)的查詢語句并獲取數(shù)據(jù)的約束條件,最后通過數(shù)據(jù)庫查找到符合查詢規(guī)則和數(shù)據(jù)約束條件的數(shù)據(jù)。
DRL規(guī)則文件描述規(guī)則時一般包含表1所示的內(nèi)容。
表1 DRL文件語法示例
其中,package為定義規(guī)則文件的包名,代表程序?qū)σ?guī)則的指示,不代表真實規(guī)則的存儲路徑;import是需要導(dǎo)入的類名,由于DRL文件用類Java語言編寫,故可以導(dǎo)入外部定義的變量和公共的靜態(tài)方法;rule代表規(guī)則的開始,并且用唯一的規(guī)則名標(biāo)識;salience為規(guī)則的優(yōu)先級,在有多條規(guī)則時,其數(shù)字越大,相應(yīng)規(guī)則的優(yōu)先級程度越高[18];when之后為條件部分[19],定義了當(dāng)前規(guī)則的條件,此部分可以有零或多個條件;結(jié)果部分處于then與end之間,是滿足條件之后需要執(zhí)行的動作,這部分語句可以用Java語言編寫,end代表此規(guī)則結(jié)束。
采用DRL規(guī)則文件方式的工作流程如圖3所示。
圖3 采用DRL規(guī)則文件方式的工作流程
DRL文件中存儲的是解析實例的規(guī)則,將DRL文件導(dǎo)入到規(guī)則引擎的指定路徑,規(guī)則引擎開始根據(jù)規(guī)則文件進(jìn)行查詢語句的解析,循環(huán)遍歷所有規(guī)則,將滿足查詢語句規(guī)則約束條件的終節(jié)點取出拼接成標(biāo)準(zhǔn)的數(shù)據(jù)庫查詢語句;利用關(guān)于數(shù)據(jù)的約束條件的節(jié)點形成規(guī)則網(wǎng)絡(luò);使用JDBC連接數(shù)據(jù)庫查詢到相應(yīng)表單的數(shù)據(jù)后,數(shù)據(jù)作為實例通過數(shù)據(jù)規(guī)則網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)篩選,最后輸出合適的數(shù)據(jù)。
決策表是一個精確且緊湊的表示邏輯的方式,目前決策表支持的文件格式主要有XLS、CSV,其可以與DRL規(guī)則文件實現(xiàn)無縫替換。表2為決策表使用格式。
表2 決策表使用格式
其中,RuleSet相當(dāng)于DRL文件中的package,用于定義規(guī)則的包名;Import是規(guī)則文件中需要導(dǎo)入的類名,可以導(dǎo)入外部定義的變量和公共的靜態(tài)方法;CONDITION是規(guī)則的觸發(fā)文件;ACTION為對應(yīng)條件觸發(fā)后的動作,一般與CONDITION是并行存在的。需要注意的是,決策表判斷的條件參數(shù)需要在文件下方列出,通過傳參的方式進(jìn)行比較。決策表也可在需要的時候解析為普通的DRL文件使用。
決策表在編譯時,也需要與DRL文件一樣在kmodule.xml模塊中配置相應(yīng)的標(biāo)識,并在規(guī)則引擎會話開始時導(dǎo)入相應(yīng)的標(biāo)識。圖4為決策表實現(xiàn)流程。
圖4 決策表實現(xiàn)流程
編寫好相應(yīng)的解析查詢語句規(guī)則和數(shù)據(jù)匹配規(guī)則的決策表文件導(dǎo)入規(guī)則引擎指定路徑并在kmodule.xml中配置好規(guī)則文件標(biāo)識。觸發(fā)規(guī)則引擎和節(jié)點后,會循環(huán)查找規(guī)則文件中的CONDITION,并與ACTION部分進(jìn)行解析與處理,獲得查詢語句和數(shù)據(jù)約束條件的網(wǎng)絡(luò)。通過數(shù)據(jù)庫獲取數(shù)據(jù)后會繼續(xù)匹配數(shù)據(jù)規(guī)則,并篩選出符合條件的數(shù)據(jù),最后會輸出符合查詢條件的數(shù)據(jù)。
2.1節(jié)和2.2節(jié)所述方式要先建立查詢語句與數(shù)據(jù)匹配規(guī)則網(wǎng)絡(luò)之后再將數(shù)據(jù)導(dǎo)入規(guī)則網(wǎng),導(dǎo)致所有的數(shù)據(jù)均要通過匹配網(wǎng)絡(luò)進(jìn)行匹配。這使得大量的無關(guān)數(shù)據(jù)會在節(jié)點中進(jìn)行比較,因此會消耗較多的時間。修正數(shù)據(jù)庫采用JSON格式的規(guī)則語句,通過規(guī)則引擎進(jìn)行JSON規(guī)則的解析,并將解析得到的規(guī)則類型和數(shù)據(jù)的約束條件存入數(shù)據(jù)庫中。在存入規(guī)則類型的同時,規(guī)則引擎操作數(shù)據(jù)庫根據(jù)解析規(guī)則類型選擇相應(yīng)的表單,并將表單數(shù)據(jù)與解析的數(shù)據(jù)約束條件進(jìn)行比較篩選。循環(huán)此過程直至規(guī)則解析結(jié)束,此時,獲取的表單數(shù)據(jù)就是滿足查詢條件的數(shù)據(jù)。圖5為修正數(shù)據(jù)庫實現(xiàn)流程。
圖5 修正數(shù)據(jù)庫實現(xiàn)流程
修正數(shù)據(jù)庫架構(gòu)較DRL規(guī)則文件方法和決策表文件方法的改進(jìn)體現(xiàn)在:使用JSON數(shù)據(jù)格式的規(guī)則文件,解析速度較快;數(shù)據(jù)篩選與解析規(guī)則是在同一時間進(jìn)行,雖然損失了一些解析時間,但優(yōu)化了數(shù)據(jù)查詢輸出的時間;不需要頻繁地更換規(guī)則文件,只需改變相應(yīng)的JSON格式文件的內(nèi)容。
修正數(shù)據(jù)庫方式具體工作流程如下。
(1)用JSON格式的語句描述需要查詢語句的規(guī)則以及相應(yīng)的數(shù)據(jù)約束條件。
(2)配置入規(guī)則引擎進(jìn)行相應(yīng)格式的解析。
① 解析到對應(yīng)數(shù)據(jù)的表單關(guān)系。
② 通過JDBC連接數(shù)據(jù)庫并將相應(yīng)的表單數(shù)據(jù)存入庫中,同時建立網(wǎng)絡(luò)。
③ 依次解析數(shù)據(jù)約束格式并存入與2.2節(jié)對應(yīng)的表單中。
④ 根據(jù)已解析部分規(guī)則網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)篩選,并將數(shù)據(jù)結(jié)果暫存。
(3)重復(fù)執(zhí)行①~④,直至所有規(guī)則及約束條件完全解析。
(4)根據(jù)解析結(jié)果選擇對應(yīng)的表單數(shù)據(jù)。
為了更好地比較規(guī)則引擎在物聯(lián)網(wǎng)數(shù)據(jù)管理中的應(yīng)用,本文設(shè)置了2組實驗。第一組為分析相同規(guī)則數(shù)不同實例數(shù)和相同實例數(shù)不同規(guī)則數(shù)對規(guī)則引擎性能的影響。第二組為基于大數(shù)據(jù)量的查詢對DRL規(guī)則文件方法、決策表方法和修正數(shù)據(jù)庫方法進(jìn)行進(jìn)一步的評估。實驗軟硬件環(huán)境配置如表3所示。
表3 實驗環(huán)境配置
(1)實驗一:為了適應(yīng)多規(guī)則配置的方便性,使用DRL文件進(jìn)行配置,分別設(shè)置規(guī)則數(shù)為10條、100條、200條、500條的規(guī)則文件,并分別用500例、1500例、3000例、5000例、7500例、10000例通過不同的規(guī)則,規(guī)則數(shù)與實例數(shù)耗時如圖6所示。
由圖6可知,隨著規(guī)則數(shù)量的增加,規(guī)則建網(wǎng)時間也隨之增加,同一數(shù)量級實例數(shù)通過不同規(guī)則文件的總耗時不同,并且時間增加主要與建網(wǎng)時間的增加有關(guān);規(guī)則數(shù)相同,不同實例數(shù)經(jīng)過規(guī)則引擎時,時間增加呈現(xiàn)正相關(guān)關(guān)系。在實例數(shù)一定時,規(guī)則數(shù)的增加會使實例匹配的時間變長。尤其是規(guī)則數(shù)達(dá)到500后,規(guī)則的冗余性變強,匹配的增幅變大。由此可知,在物聯(lián)網(wǎng)規(guī)則引擎設(shè)計中,選取適量的規(guī)則數(shù)有利于提升物聯(lián)網(wǎng)管理系統(tǒng)的性能。
圖6 規(guī)則數(shù)與實例數(shù)耗時
(2)實驗二:通過將隨機生成數(shù)據(jù)存入數(shù)據(jù)庫模擬設(shè)備運行期間發(fā)送的各種數(shù)據(jù)。隨機數(shù)據(jù)是通過設(shè)置數(shù)據(jù)整體格式,通過Java隨機產(chǎn)生不同的數(shù)據(jù)。為了對比不同方式對不同數(shù)據(jù)量的處理性能,實驗分別設(shè)置了5000條、10000條、100000條和1000000條數(shù)據(jù)的表單,分別用DRL規(guī)則文件、決策表文件和修正數(shù)據(jù)庫3種方法對規(guī)則進(jìn)行解析并查詢相應(yīng)數(shù)據(jù)。所有測試數(shù)據(jù)保持格式統(tǒng)一。不同配置方法查詢同一量級數(shù)據(jù)時,數(shù)據(jù)類型和數(shù)據(jù)內(nèi)容保持一致。評判標(biāo)準(zhǔn)為總耗時時間、解析規(guī)則時間和查詢輸出時間。以程序開始為總計時起點、程序結(jié)束為計時終點,以此得到總時間。輸出的第一條數(shù)據(jù)作為計算查詢輸出數(shù)據(jù)時間的起點。修正數(shù)據(jù)庫方法、DRL規(guī)則文件方法和決策表文件方法的測試性能如表4所示。
表4 不同配置方法的測試性能
系統(tǒng)的并發(fā)量可以用吞吐量(Throughput)來衡量。表4中的吞吐量為標(biāo)準(zhǔn)時間內(nèi)的吞吐量,即單位時間的吞吐量(單位為條),計算公式為
(1)
式中:m1為t1時刻處理的數(shù)據(jù)總量;m2為t2時刻處理的數(shù)據(jù)總量;Throughput為t1和t2期間系統(tǒng)處理數(shù)據(jù)的平均吞吐量。
由表4可得,隨著各種方式數(shù)據(jù)量的增加,總耗時隨之增加,并且吞吐量也會有所增加。對比3種不同方法對于同一數(shù)據(jù)量級的性能,修正數(shù)據(jù)庫方法的總耗時和吞吐量均優(yōu)于DRL規(guī)則文件方法和決策表文件方法。
圖7~圖10為在4種不同數(shù)據(jù)量級下3種配置方法的性能對比。查詢總時間由解析時間與數(shù)據(jù)匹配查詢時間構(gòu)成,具體數(shù)據(jù)如表5所示。由圖7~圖10可知,在同一數(shù)量級的前提條件下,修正數(shù)據(jù)庫方法的查詢總時間相對于DRL規(guī)則文件方法和決策表文件方法有明顯改善。
圖8 10000條數(shù)據(jù)查詢時間
圖9 100000條數(shù)據(jù)查詢時間
圖10 1000000條數(shù)據(jù)查詢時間
表5 不同配置方法的性能分析 單位:s
由表5可知,DRL規(guī)則文件方法與決策表文件方法解析時間有些許不同,DRL規(guī)則文件方法通過規(guī)則引擎分解規(guī)則建立規(guī)則網(wǎng)絡(luò),故速度更快。決策表文件方法需要讀取決策表文件并將決策表內(nèi)語言轉(zhuǎn)換為相應(yīng)的格式,所以解析性能相較DRL規(guī)則文件方法略有下降。在數(shù)據(jù)篩選查詢階段,兩種方法的耗時差異較小,均是所有數(shù)據(jù)一一進(jìn)入網(wǎng)絡(luò)進(jìn)行匹配。修正數(shù)據(jù)庫方法的解析規(guī)則和約束關(guān)系時間較長,這是因為修正數(shù)據(jù)庫方法在解析規(guī)則時,將規(guī)則和約束條件解析至數(shù)據(jù)庫存儲后進(jìn)行動態(tài)篩選,故解析時間有所增加。
修正數(shù)據(jù)庫方法中,解析時間占據(jù)了大部分查詢總時間,這是因為解析規(guī)則和數(shù)據(jù)初篩選是在一起的,隨著規(guī)則解析結(jié)束和數(shù)據(jù)初篩選的結(jié)束,可以一次性獲得數(shù)據(jù)庫中的表單數(shù)據(jù)。雖然修正數(shù)據(jù)庫方法解析時會有相對較多的時間損耗,但是數(shù)據(jù)匹配查詢時間會大幅減少,因此其查詢總時間可以快速超過DRL規(guī)則文件方法和決策表文件方法,圖7~圖9中的交點就是修正數(shù)據(jù)庫方法查詢總時間逼近DRL規(guī)則文件方法的時間點。相較于DRL規(guī)則文件和決策表文件架構(gòu),修正數(shù)據(jù)庫架構(gòu)雖然損失了一部分解析時間,但是對于大數(shù)據(jù)量的查詢總時間有較大的改善作用,對規(guī)則內(nèi)部形式較為單一且規(guī)則數(shù)量、數(shù)據(jù)數(shù)量大的場景有著較好的性能。
針對DRL規(guī)則文件和決策表文件架構(gòu)在數(shù)據(jù)查詢中出現(xiàn)的重復(fù)比對冗余問題,設(shè)計了一種修正數(shù)據(jù)庫的數(shù)據(jù)查詢方法,并給出了該方法的工作流程。通過實驗分析了Drools規(guī)則引擎中規(guī)則數(shù)、實例數(shù)與查詢性能之間的關(guān)系,以及DRL規(guī)則文件、決策表文件和修正數(shù)據(jù)庫方法在不同量級數(shù)據(jù)環(huán)境下的查詢性能。實驗結(jié)果表明:修正數(shù)據(jù)庫數(shù)據(jù)查詢方法減少了無效數(shù)據(jù)的重復(fù)比對,減少了冗余,有效地提高了數(shù)據(jù)查詢的性能。