本發(fā)明涉及RFID,復(fù)雜事件處理,分布式實(shí)時(shí)計(jì)算,尤其涉及復(fù)雜事件規(guī)則的動(dòng)態(tài)調(diào)度方法以及規(guī)則數(shù)據(jù)自動(dòng)恢復(fù)方法的設(shè)計(jì)與實(shí)現(xiàn)。
背景技術(shù):
:RFID(無(wú)線射頻識(shí)別)技術(shù)是目前物聯(lián)網(wǎng)數(shù)據(jù)采集技術(shù)中發(fā)展較為成熟的方案之一,其應(yīng)用范圍遍及制造、物流、醫(yī)療、運(yùn)輸、零售、國(guó)防等各行各業(yè)。在物流供應(yīng)鏈領(lǐng)域,隨著RFID標(biāo)簽成本的下降,RFID技術(shù)越來(lái)越多的應(yīng)用在生產(chǎn)、運(yùn)輸、庫(kù)存管理、零售的各個(gè)環(huán)節(jié)。在RFID應(yīng)用環(huán)境中,單個(gè)閱讀器每秒鐘可以產(chǎn)生200~400條數(shù)據(jù),隨著RFID技術(shù)的推廣和應(yīng)用在應(yīng)用環(huán)境中會(huì)產(chǎn)生海量的RFID數(shù)據(jù),如何在產(chǎn)生數(shù)據(jù)的同時(shí)實(shí)時(shí)地、高效得處理這些數(shù)據(jù)變得非常重要。復(fù)雜事件處理技術(shù)作為一種基于內(nèi)存的事件驅(qū)動(dòng)計(jì)算方式,在很多對(duì)實(shí)時(shí)性要求比較嚴(yán)格的領(lǐng)域有著廣泛的應(yīng)用,它提供了一種通用的方法來(lái)定義和描述各種事件之間的關(guān)系,并且可以利用事件間的關(guān)系實(shí)時(shí)地檢測(cè)出更加復(fù)雜的業(yè)務(wù)事件。復(fù)雜事件處理技術(shù)主要包括復(fù)雜事件描述和復(fù)雜事件檢測(cè)兩個(gè)方面,其中復(fù)雜事件描述的形式化語(yǔ)言包括主要成果ZStream、SASE以及基于SASE改進(jìn)的SASE+等,復(fù)雜事件檢測(cè)的常用模型包括基于匹配樹(shù)的處理模型,基于Petri網(wǎng)的處理模型,基于有向圖的處理模型以及基于NFA非確定有限狀態(tài)自動(dòng)機(jī)的處理模型等。目前復(fù)雜事件處理技術(shù)在RFID領(lǐng)域的應(yīng)用通?;谔幚硪鎸?shí)現(xiàn),但是目前開(kāi)源的復(fù)雜事件處理引擎并沒(méi)有提供分布式解決方案,這使得在實(shí)時(shí)處理海量RFID數(shù)據(jù)時(shí)可擴(kuò)展性不是很好。分布式實(shí)時(shí)計(jì)算框架可以解決實(shí)時(shí)處理海量數(shù)據(jù)的可擴(kuò)展性問(wèn)題,但是并不提供具體的業(yè)務(wù)邏輯實(shí)現(xiàn),目前成熟的分布式實(shí)時(shí)計(jì)算框架包括S4、Storm、Puma等。將復(fù)雜事件處理引擎與分布式實(shí)時(shí)計(jì)算框架相結(jié)合可以為處理海量RFID數(shù)據(jù)、實(shí)時(shí)檢測(cè)復(fù)雜的業(yè)務(wù)模式提供有效的解決途徑。技術(shù)實(shí)現(xiàn)要素:本發(fā)明提供了一種分布式環(huán)境下面向RFID的復(fù)雜事件規(guī)則動(dòng)態(tài)調(diào)度與數(shù)據(jù)恢復(fù)方法,具體包括分布式系統(tǒng)運(yùn)行時(shí)復(fù)雜事件規(guī)則的動(dòng)態(tài)調(diào)度方法,以及節(jié)點(diǎn)故障重啟后規(guī)則數(shù)據(jù)的自動(dòng)恢復(fù)方法。面向RFID的復(fù)雜事件規(guī)則動(dòng)態(tài)調(diào)度與數(shù)據(jù)恢復(fù)方法,包括分布式系統(tǒng)中復(fù)雜事件規(guī)則的動(dòng)態(tài)調(diào)度過(guò)程,以及節(jié)點(diǎn)故障重啟后規(guī)則數(shù)據(jù)的自動(dòng)恢復(fù)過(guò)程;復(fù)雜事件規(guī)則的動(dòng)態(tài)調(diào)度是指:系統(tǒng)在處理源源不斷的RFID原子事件過(guò)程中,無(wú)需停止應(yīng)用即能動(dòng)態(tài)地加入或刪除規(guī)則,并最終將規(guī)則調(diào)度到合適的處理節(jié)點(diǎn)中進(jìn)行添加或者刪除;規(guī)則調(diào)度以減少集群中各個(gè)節(jié)點(diǎn)無(wú)效的原子事件和均衡各個(gè)節(jié)點(diǎn)的負(fù)載為目標(biāo),將規(guī)則分配到合適的規(guī)則組中,或者從規(guī)則組中找出特定的規(guī)則進(jìn)行刪除;將規(guī)則組信息以及規(guī)則組與集群中節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系作為元數(shù)據(jù)存儲(chǔ)在Zookeeper服務(wù)器中,當(dāng)有規(guī)則添加或者刪除時(shí)根據(jù)規(guī)則調(diào)度算法更新元數(shù)據(jù)信息,并將更改的規(guī)則信息推送至添加了監(jiān)聽(tīng)器的StormSpout節(jié)點(diǎn)中,最終根據(jù)自定義的流分組策略調(diào)度到最終的處理節(jié)點(diǎn);規(guī)則數(shù)據(jù)的自動(dòng)恢復(fù)指的是節(jié)點(diǎn)出現(xiàn)故障后能夠自動(dòng)重新啟動(dòng),并且能夠重新實(shí)例化Esper引擎并加載故障前的規(guī)則數(shù)據(jù)。進(jìn)一步地,所述將規(guī)則組信息以及規(guī)則組與集群中節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系作為元數(shù)據(jù)存儲(chǔ)在Zookeeper服務(wù)器中,規(guī)則調(diào)度算法不直接更新節(jié)點(diǎn)中Esper引擎的規(guī)則信息,而只是更新Zookeeper中規(guī)則組的元數(shù)據(jù)信息,當(dāng)元數(shù)據(jù)信息發(fā)生變化時(shí)推送規(guī)則調(diào)度信息到添加了監(jiān)聽(tīng)器的StormSpout節(jié)點(diǎn)中。進(jìn)一步地,規(guī)則調(diào)度算法中,當(dāng)需要增加新規(guī)則時(shí),在規(guī)則組對(duì)應(yīng)的節(jié)點(diǎn)不超過(guò)負(fù)載閾值的前提下,新增規(guī)則的關(guān)聯(lián)閱讀器集合與最終匹配的規(guī)則組的關(guān)聯(lián)閱讀器集合滿足并集最小,交集最大的基本原則;當(dāng)需要?jiǎng)h除規(guī)則時(shí),首先查找出該規(guī)則對(duì)應(yīng)的規(guī)則組,然后將規(guī)則刪除;規(guī)則的關(guān)聯(lián)閱讀器集合指的是EPL規(guī)則中出現(xiàn)的閱讀器ID的并集,規(guī)則組的關(guān)聯(lián)閱讀器集合是規(guī)則組中所有規(guī)則的關(guān)聯(lián)閱讀器集合的并集。進(jìn)一步地,StormSpout節(jié)點(diǎn)收到規(guī)則添加或者刪除的消息后,根據(jù)自定義的流分組策略將規(guī)則調(diào)度到真正負(fù)責(zé)復(fù)雜事件處理的Bolt節(jié)點(diǎn),并在其Esper引擎實(shí)例中添加或者刪除規(guī)則。進(jìn)一步地,所述規(guī)則數(shù)據(jù)的自動(dòng)恢復(fù)過(guò)程中,在Storm集群中復(fù)雜事件處理的Bolt節(jié)點(diǎn)在發(fā)生故障后能夠自動(dòng)重啟,并且節(jié)點(diǎn)故障前加載的規(guī)則數(shù)據(jù)也可以自動(dòng)恢復(fù)。進(jìn)一步地,所述恢復(fù)過(guò)程擴(kuò)展了Storm本身的容錯(cuò)機(jī)制,Storm集群中的節(jié)點(diǎn)出現(xiàn)故障后能自動(dòng)重啟,但是之前保存的狀態(tài)信息會(huì)丟失,而規(guī)則數(shù)據(jù)的自動(dòng)恢復(fù)利用存儲(chǔ)在Zookeeper服務(wù)器上的元數(shù)據(jù)信息,在節(jié)點(diǎn)重新啟動(dòng)進(jìn)行初始化時(shí)通過(guò)規(guī)則集合以及規(guī)則集合與節(jié)點(diǎn)ID的對(duì)應(yīng)關(guān)系,將之前的規(guī)則信息重新加載到Esper引擎中。進(jìn)一步地,通過(guò)將規(guī)則元數(shù)據(jù)存儲(chǔ)Zookeeper服務(wù)器的方式,實(shí)現(xiàn)分布式環(huán)境下規(guī)則的動(dòng)態(tài)調(diào)度與規(guī)則數(shù)據(jù)的自動(dòng)恢復(fù),提高了分布式環(huán)境下面向RFID數(shù)據(jù)的復(fù)雜事件處理系統(tǒng)的吞吐量和穩(wěn)定性。與現(xiàn)有技術(shù)相比,本發(fā)明具有如下優(yōu)點(diǎn)和技術(shù)效果:(1)在支持事務(wù)的基礎(chǔ)上設(shè)計(jì)Topology,保證事件的統(tǒng)計(jì)操作完全正確Strom框架雖然提供了一個(gè)通用的分布式計(jì)算模型,可是具體的計(jì)算過(guò)程仍然需要通過(guò)自行設(shè)計(jì)Topology來(lái)實(shí)現(xiàn),而且Storm的Topology只能保證每個(gè)原子事件至少被處理一次,對(duì)于有統(tǒng)計(jì)相關(guān)的業(yè)務(wù)規(guī)則,如果事件由于中間節(jié)點(diǎn)故障而重新處理,則會(huì)導(dǎo)致基于數(shù)量統(tǒng)計(jì)的校驗(yàn)發(fā)生錯(cuò)誤,因此需要使用基于Storm擴(kuò)展的TridentTopology(支持事務(wù)的拓?fù)洌﹣?lái)保證每個(gè)原子事件僅被處理一次。(2)實(shí)現(xiàn)Topology中各個(gè)節(jié)點(diǎn)相應(yīng)的功能,保證系統(tǒng)的高容錯(cuò)和可擴(kuò)展Spout節(jié)點(diǎn)分為兩類:RFIDSpout和RuleSpout;Bolt節(jié)點(diǎn)主要分為四類:SchedulerBolt、EsperBolt、OutputAdapterBolt以及LoadCalculatorBolt,具體各個(gè)節(jié)點(diǎn)的功能可以參考3.3.1節(jié)的內(nèi)容。此外,為提高整個(gè)系統(tǒng)的處理系統(tǒng),負(fù)責(zé)執(zhí)行復(fù)雜事件檢測(cè)的EsperBolt會(huì)存在多個(gè)實(shí)例,需要提供相應(yīng)的擴(kuò)展性機(jī)制。最后,需要對(duì)Storm本身的容錯(cuò)機(jī)制進(jìn)行改進(jìn),實(shí)現(xiàn)有狀態(tài)的節(jié)點(diǎn)在故障恢復(fù)后,之前內(nèi)容中的狀態(tài)也能夠恢復(fù)。(3)設(shè)計(jì)RFID中間件ALE層與拓?fù)涞耐ㄐ拍P?,保證通信的效率和可靠性傳統(tǒng)基于WebService方式進(jìn)行通信的方式,由于其通信協(xié)議SOAP以HTTP協(xié)議為基礎(chǔ)來(lái)實(shí)現(xiàn),當(dāng)面對(duì)大量消息的實(shí)時(shí)處理時(shí),其通信的效率和可靠性都不能得到很好的保障。因此在對(duì)RFID中間件與復(fù)雜事件處理系統(tǒng)進(jìn)行集成時(shí)其通信模型需要基于底層的TCP協(xié)議并長(zhǎng)連接的方式實(shí)現(xiàn),以減少每次通信建立連接和釋放連接的開(kāi)銷。(4)設(shè)計(jì)動(dòng)態(tài)的規(guī)則調(diào)度算法,并基于該算法實(shí)現(xiàn)規(guī)則管理調(diào)度引擎Storm通過(guò)數(shù)據(jù)流分組(StreamGrouping)來(lái)定義一個(gè)數(shù)據(jù)流中的Tuple分發(fā)給哪些后續(xù)的Bolt處理節(jié)點(diǎn)。為了抬高整個(gè)系統(tǒng)的處理性能,對(duì)于RFID原子事件流的分發(fā)需要滿足兩個(gè)條件:第一需要保證分發(fā)時(shí)不會(huì)產(chǎn)生的過(guò)多的噪聲數(shù)據(jù);第二需要保證多個(gè)復(fù)雜事件處理節(jié)點(diǎn)的負(fù)載相對(duì)均衡。RFID原子事件流依賴于規(guī)則進(jìn)行分組,因此需要以上述兩點(diǎn)為目標(biāo)設(shè)計(jì)優(yōu)秀的規(guī)則調(diào)度算法,而規(guī)則管理調(diào)度引擎需要根據(jù)調(diào)度算法將規(guī)則分配到合適的處理節(jié)點(diǎn)。附圖說(shuō)明圖1為系統(tǒng)功能架構(gòu)圖圖2為實(shí)例中規(guī)則組元數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)圖。圖3為RFID原子事件UML類圖。圖4為RFID原子事件與EPL規(guī)則的關(guān)系圖。圖5為動(dòng)態(tài)的規(guī)則調(diào)度算法流程圖。圖6為Storm集群拓?fù)浣Y(jié)構(gòu)圖。圖7為面向規(guī)則的輸入流適配器工作流程圖。圖8為規(guī)則調(diào)度信息UML類圖。圖9為RFID原子事件與EPL規(guī)則調(diào)度關(guān)系示意圖。圖10為流分組策略層工作原理圖。圖11為策略集合StrategyMapUML類圖。圖12為規(guī)則RuleUML類圖。圖13為流分組策略層工作流程圖。圖14為規(guī)則的動(dòng)態(tài)加載和數(shù)據(jù)恢復(fù)流程圖。具體實(shí)施方式為了使本發(fā)明的技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,下面結(jié)合附圖,進(jìn)行進(jìn)一步的詳細(xì)說(shuō)明,但本發(fā)明的實(shí)施和保護(hù)不限于此,需指出的是,以下文字或附圖中若有未特別詳細(xì)說(shuō)明之處如字符均是本領(lǐng)域及人員可參照現(xiàn)有技術(shù)理解或?qū)崿F(xiàn)的。整個(gè)系統(tǒng)的總體架構(gòu)如圖1所示,其中RFID中間件由設(shè)備適配層、設(shè)備管理層和ALE服務(wù)層以及規(guī)則管理層組成,復(fù)雜事件處理系統(tǒng)由事件輸入適配層、規(guī)則輸入適配層、流分組策略層、復(fù)雜事件處理層、輸出適配層以及負(fù)載計(jì)算層組成。RFID閱讀器采集的數(shù)據(jù)經(jīng)由ALE服務(wù)層進(jìn)行預(yù)處理,以ECReport的形式傳遞給輸入適配層,輸入適配層將數(shù)據(jù)轉(zhuǎn)換為原子事件并通過(guò)事件流分組策略層交給合適的后續(xù)處理節(jié)點(diǎn)。而規(guī)則管理層通過(guò)與規(guī)則元數(shù)據(jù)存儲(chǔ)層的交互,最終通過(guò)規(guī)則輸入適配層將規(guī)則調(diào)度元數(shù)據(jù)推送到事件分組策略層,流分組策略層將規(guī)則及其操作信息(增加或者刪除)發(fā)送給合適的復(fù)雜事件處理單元,實(shí)現(xiàn)在運(yùn)行時(shí)新規(guī)則的加載以及舊規(guī)則的卸載。分布式系統(tǒng)基于實(shí)時(shí)計(jì)算框架ApacheStorm實(shí)現(xiàn),復(fù)雜事件規(guī)則采用Esper引擎的EPL語(yǔ)言進(jìn)行描述,RFID中間件作為RFID原子事件發(fā)生器產(chǎn)生RFID原子事件,系統(tǒng)中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)Executor線程,每個(gè)線程對(duì)應(yīng)一個(gè)Esper引擎實(shí)例負(fù)責(zé)檢測(cè)復(fù)雜事件,每個(gè)Esper引擎的實(shí)例維護(hù)一個(gè)規(guī)則組對(duì)輸入的RFID原子事件進(jìn)行處理,各個(gè)規(guī)則組的交集為空。規(guī)則動(dòng)態(tài)調(diào)度方法將規(guī)則組中的信息以及規(guī)則組與集群中處理節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系作為元數(shù)據(jù)保存在Zookeeper服務(wù)器中,并以減少系統(tǒng)中各個(gè)節(jié)點(diǎn)的無(wú)效原子事件和均衡各個(gè)節(jié)點(diǎn)的負(fù)載為目標(biāo),將新加入系統(tǒng)的規(guī)則調(diào)度到Zookeeper中對(duì)應(yīng)的規(guī)則集合中,Zookeeper將規(guī)則調(diào)度信息推送到Storm集群中規(guī)則對(duì)應(yīng)的Spout節(jié)點(diǎn),該Spout節(jié)點(diǎn)通過(guò)自定義的流分組策略最終將規(guī)則調(diào)度到合適的處理節(jié)點(diǎn),并根據(jù)調(diào)度信息在Esper引擎中添加或者刪除規(guī)則。規(guī)則調(diào)度的過(guò)程中系統(tǒng)可正常接收和處理RFID原子事件,RFID原子事件通過(guò)自定義的流分組策略到達(dá)最終負(fù)責(zé)處理的節(jié)點(diǎn)。Storm提供的容錯(cuò)機(jī)制使得在節(jié)點(diǎn)故障后可以自動(dòng)重新啟動(dòng),但是并不能恢復(fù)故障前的狀態(tài)信息,規(guī)則數(shù)據(jù)的自動(dòng)恢復(fù)方法在節(jié)點(diǎn)重新啟動(dòng)后重新實(shí)例化Esper引擎,并通過(guò)Zookeeper中的規(guī)則組和節(jié)點(diǎn)ID的對(duì)應(yīng)關(guān)系加載規(guī)則組中的規(guī)則數(shù)據(jù)到引擎實(shí)例中。1.規(guī)則組元數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)本方法涉及的規(guī)則組數(shù)據(jù)以及規(guī)則組與集群中節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系在Zookeeper服務(wù)器中的存儲(chǔ)結(jié)構(gòu)如圖2所示,具體包含兩個(gè)根節(jié)點(diǎn):RuleZnode和MatchZnode,其中虛線表示該節(jié)點(diǎn)在創(chuàng)建后,內(nèi)容會(huì)發(fā)生變化,實(shí)線表示節(jié)點(diǎn)創(chuàng)建后,節(jié)點(diǎn)內(nèi)容不會(huì)發(fā)生變化,并且只有葉子節(jié)點(diǎn)才可以在操作過(guò)程中被刪除。(1)RuleZnodeRuleZnode是規(guī)則調(diào)度算法的計(jì)算結(jié)果,它存放著對(duì)新增加規(guī)則或者待刪除規(guī)則的調(diào)度信息,其中的根節(jié)點(diǎn)為rule_znode,它的子節(jié)點(diǎn)rule_group節(jié)點(diǎn)表示各個(gè)規(guī)則組,每一個(gè)規(guī)則組和一個(gè)具體執(zhí)行復(fù)雜事件處理邏輯的節(jié)點(diǎn)相對(duì)應(yīng)。每個(gè)rule_group創(chuàng)建時(shí)其下都包含了四個(gè)子節(jié)點(diǎn),其中rule_list下存放著具體的規(guī)則,其中描述規(guī)則的EPL語(yǔ)句和自然語(yǔ)句以“#”分隔;current_rule存放的是當(dāng)前增加或者要?jiǎng)h除的規(guī)則對(duì)應(yīng)的EPL語(yǔ)句以及自然語(yǔ)言描述;current_operation節(jié)點(diǎn)存放的是當(dāng)前要進(jìn)行的操作是新增還是刪除,其值為“add”或者“delete”;reader_set下存放著該規(guī)則組的關(guān)聯(lián)閱讀器集合,每個(gè)閱讀器名稱之間用逗號(hào)分隔。(2)MatchZnodeMatchZnode的根節(jié)點(diǎn)是match_znode,它的子節(jié)點(diǎn)rule_group與rule_znode一樣都是在通過(guò)RuleManager增加新的規(guī)則組group_name時(shí)生成,同時(shí)rule_group的兩個(gè)子節(jié)點(diǎn)也被初始化,這兩個(gè)子節(jié)點(diǎn)分別代表著對(duì)應(yīng)的復(fù)雜事件處理節(jié)點(diǎn)的ID,以及該節(jié)點(diǎn)的負(fù)載。在初始化時(shí),沒(méi)有為規(guī)則組分配相應(yīng)的處理節(jié)點(diǎn)時(shí),esper_task_id和load子節(jié)點(diǎn)的默認(rèn)值分別為-1和0。2.RFID原子事件與EPL規(guī)則系統(tǒng)接收的RFID原子事件是一個(gè)Bean對(duì)象,其UML類圖如圖3所示,其中epc表示RFID標(biāo)簽的EPC碼,type表示RFID標(biāo)簽對(duì)應(yīng)的實(shí)體類型,time表示RFID標(biāo)簽讀取的時(shí)間,reader表示讀取標(biāo)簽的閱讀器ID,otherAttrs表示可擴(kuò)展的其他屬性,如表1。一個(gè)RFID原子事件的示例如下所示,它表示客戶編號(hào)31782324且SKU為151387產(chǎn)品在2016年3月30日下午15點(diǎn)10分出現(xiàn)在01號(hào)入庫(kù)大門(mén)處。表1屬性名稱屬性值epc31782324.1513877.0000000007type31782324.1513877.*time1459321802readerReader_Indoor_01otherAttrsnull復(fù)雜事件規(guī)則采用Esper引擎的EPL語(yǔ)言進(jìn)行描述,RFID原子事件與EPL規(guī)則的關(guān)系如圖4所示,圖中EPL規(guī)則的關(guān)聯(lián)閱讀器集合為{Reader_Check_01,Reader_Outdoor_01},而event1表示標(biāo)簽被閱讀器Reader_Check_01讀到,因此對(duì)于規(guī)則是有效的,而event2被閱讀器Reader_Indoor_02讀到,與規(guī)則沒(méi)有關(guān)系,對(duì)于該規(guī)則來(lái)說(shuō)是無(wú)效事件。3.動(dòng)態(tài)的規(guī)則調(diào)度規(guī)則調(diào)度算法以減少集群中各個(gè)節(jié)點(diǎn)無(wú)效的原子事件和均衡各個(gè)節(jié)點(diǎn)的負(fù)載為目標(biāo),將規(guī)則添加到合適的規(guī)則組中,或者找到規(guī)則對(duì)應(yīng)的規(guī)則組將規(guī)則從中刪除。一個(gè)節(jié)點(diǎn)的無(wú)效原子事件數(shù)指的是一段時(shí)間內(nèi)規(guī)則組中所有規(guī)則對(duì)應(yīng)的無(wú)效事件的總和,每個(gè)節(jié)點(diǎn)的負(fù)載指的是一段時(shí)間內(nèi)規(guī)則組中每條規(guī)則處理的原子事件總和。規(guī)則調(diào)度的具體算法流程如圖5所示,其中對(duì)于新增規(guī)則的調(diào)度來(lái)說(shuō),該算法的核心思想是:在規(guī)則組不超過(guò)負(fù)載閾值的情況下,新增規(guī)則的關(guān)聯(lián)閱讀器集合與最終匹配的規(guī)則組的關(guān)聯(lián)閱讀器集合滿足并集最小,且交集最大的基本原則,其中主要分為四種情況:(1)新增規(guī)則的關(guān)聯(lián)閱讀器集合是某個(gè)規(guī)則組關(guān)聯(lián)閱讀器集合的子集,如果有至少一個(gè)規(guī)則組滿足要求,選擇并集最小的規(guī)則組,如果有多個(gè)規(guī)則組滿足并集最小的情況,選擇負(fù)載最小的規(guī)則組;(2)新增規(guī)則的關(guān)聯(lián)閱讀器集合與某些規(guī)則組的關(guān)聯(lián)閱讀器集合存在交集,且新增規(guī)則的關(guān)聯(lián)閱讀器集合不是子集,如果有至少一個(gè)規(guī)則組滿足要求,優(yōu)先選擇并集最小的規(guī)則組,這個(gè)基礎(chǔ)上如果有多個(gè)規(guī)則組滿足要求,選擇交集最小的規(guī)則組,這個(gè)基礎(chǔ)上如果還有多個(gè)規(guī)則組滿足要求,選擇負(fù)載最小的規(guī)則組;(3)所有規(guī)則組的關(guān)聯(lián)閱讀器集合都是新增規(guī)則關(guān)聯(lián)閱讀器集合的子集,選擇并集最小的規(guī)則組,如果有多個(gè)規(guī)則組滿足情況,選擇負(fù)載最小的規(guī)則組;(4)新增規(guī)則關(guān)聯(lián)閱讀器集合與所有規(guī)則組的關(guān)聯(lián)閱讀器集合都沒(méi)有交集,選擇負(fù)載最小的規(guī)則組。4.Storm集群的拓?fù)浣Y(jié)構(gòu)Storm集群的拓?fù)浣Y(jié)構(gòu)如圖6所示,其中數(shù)據(jù)流包含兩類:一類是事件流,另外一類是規(guī)則流,而拓?fù)渲械奶幚砉?jié)點(diǎn)包含RFIDSpout、RuleSpout、SchedulerBolt、EsperBolt、EventOutputAdapterBolt以及LoadCalculatorBolt。RFIDSpout接收來(lái)自RFID中間件的RFID原子事件;RuleSpout接收規(guī)則調(diào)度服務(wù)器Zookeeper推送的規(guī)則調(diào)度元數(shù)據(jù)信息,其中包含了規(guī)則描述信息、規(guī)則操作信息(新增還是刪除)、規(guī)則組信息;SchedulerBolt分別實(shí)現(xiàn)了針對(duì)規(guī)則調(diào)度元數(shù)據(jù)和RFID原子事件的的流分組策略;EsperBolt的每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)一個(gè)Storm的Executor線程實(shí)例,這些實(shí)例分布在不同的Worker進(jìn)程中,每個(gè)Executor實(shí)例擁有一個(gè)Esper引擎的引用,每一個(gè)Esper引擎加載一個(gè)規(guī)則組中的規(guī)則并處理接收的原子事件,檢測(cè)復(fù)雜的業(yè)務(wù)模式;EventOutputAdapterBolt接收來(lái)自各個(gè)EsperBolt的復(fù)雜事件流,對(duì)檢測(cè)出的復(fù)雜事件進(jìn)行進(jìn)一步分組、統(tǒng)計(jì)、校驗(yàn)等處理;LoadCalculatorBolt用來(lái)統(tǒng)計(jì)各個(gè)EsperBolt節(jié)點(diǎn)的負(fù)載,并定時(shí)更新Zookeeper中的負(fù)載信息。4.1面向規(guī)則的輸入流適配器面向規(guī)則的輸入流適配器RuleSpout接收Z(yǔ)ookeeper服務(wù)器推送的規(guī)則調(diào)度元信息,并將其包裝成流分組策略層可以處理的規(guī)則調(diào)度信息,其工作流程圖如圖7所示。規(guī)則調(diào)度信息ScheduledRule的UML類圖如圖8所示,其中epl屬性指的是用EsperEPL語(yǔ)言描述的規(guī)則;operarion屬性的值為“add”或者“delete”,表示該次調(diào)度是向相應(yīng)的處理節(jié)點(diǎn)新增規(guī)則還是刪除規(guī)則;屬性groupName指的是規(guī)則組的名稱,groupName最終會(huì)被發(fā)送到后續(xù)的SchedulerBolt,并且在SchedulerBolt中建立起與后續(xù)EsperBolt節(jié)點(diǎn)一一對(duì)應(yīng)的關(guān)系,EsperBolt的taskId與gropuName的對(duì)應(yīng)關(guān)系會(huì)被更新到Zookeepr的MatchZnode節(jié)點(diǎn)中;屬性connectedReaderSet是規(guī)則EPL關(guān)聯(lián)的閱讀器集合;而description屬性是用自然語(yǔ)言描述的EPL規(guī)則對(duì)應(yīng)的復(fù)雜事件。其中屬性groupName以及屬性connectedReaderSet是對(duì)數(shù)據(jù)流進(jìn)行分組的重要依據(jù)。4.2流分組策略層流分組策略層包含了Storm拓?fù)渲械腟chedulerBolt節(jié)點(diǎn),它接收RFIDSpout節(jié)點(diǎn)傳來(lái)的RFID原子事件流,以及RuleSpout傳來(lái)的規(guī)則調(diào)度信息ScheduledRule對(duì)象,并根據(jù)自定義的流分組策略將數(shù)據(jù)發(fā)送到合適的復(fù)雜事件處理節(jié)點(diǎn)EsperBolt。分組策略包含了兩類:面向規(guī)則的分組策略以及面向RFID事件流的分組策略。規(guī)則調(diào)度信息經(jīng)過(guò)流分組策略層只能夠到達(dá)一個(gè)處理節(jié)點(diǎn),而RFID原子事件經(jīng)過(guò)流分組策略層可以到達(dá)多個(gè)符合要求的處理節(jié)點(diǎn),其關(guān)系如圖9所示。流分組策略層以StrategyMap為核心,同時(shí)調(diào)度RFID原子事件和規(guī)則信息,在調(diào)度規(guī)則時(shí)根據(jù)ScheduledRule對(duì)象轉(zhuǎn)換為Rule對(duì)象進(jìn)行調(diào)度,具體的關(guān)系如圖10所示。其中StrategyMap的UML類圖如圖11所示,Rule的UML類圖如圖12所示,流分組策略層的工作流程如圖13所示。5.規(guī)則的動(dòng)態(tài)加載和數(shù)據(jù)恢復(fù)規(guī)則的動(dòng)態(tài)加載在Storm集群中復(fù)雜事件處理層中的各個(gè)節(jié)點(diǎn)中實(shí)現(xiàn),每個(gè)EsperBolt節(jié)點(diǎn)作為一個(gè)Executor線程擁有一個(gè)Esper引擎的實(shí)例,Esper引擎通過(guò)為加載的每個(gè)規(guī)則維護(hù)一個(gè)非確定有限狀態(tài)自動(dòng)機(jī)來(lái)實(shí)現(xiàn)復(fù)雜事件的檢測(cè),當(dāng)又復(fù)雜事件發(fā)生時(shí)通過(guò)觸發(fā)監(jiān)聽(tīng)器將檢測(cè)到的復(fù)雜事件發(fā)送到下游處理節(jié)點(diǎn)。當(dāng)處理節(jié)點(diǎn)接收的Tuple元組為RFID原子事件時(shí),會(huì)將原子事件直接輸入到引擎實(shí)例中進(jìn)行處理,當(dāng)接收的Tuple元組為規(guī)則時(shí),按照operation屬性從引擎實(shí)例中加載或者卸載規(guī)則。如果處理節(jié)點(diǎn)出現(xiàn)故障,Storm集群通過(guò)Supervisor進(jìn)程重新啟動(dòng)節(jié)點(diǎn),之后實(shí)例化Esper引擎,并根據(jù)Zookeeper服務(wù)器中規(guī)則組與處理節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系重新加載規(guī)則,規(guī)則加載完成后接收故障期間沒(méi)有處理的RFID原子事件。復(fù)雜事件處理層動(dòng)態(tài)加載規(guī)則和恢復(fù)數(shù)據(jù)的工作流程如圖14所示。當(dāng)前第1頁(yè)1 2 3