賀宏達 劉夢赤
(武漢大學計算機學院 湖北 武漢 430072)
?
INMDB中復合事件監(jiān)測機制的設計與實現(xiàn)
賀宏達劉夢赤
(武漢大學計算機學院湖北 武漢 430072)
對于大多數(shù)主動數(shù)據(jù)庫來說,復合事件監(jiān)測始終是個難題。介紹信息網(wǎng)模型INM(InformationNetworkModel)數(shù)據(jù)庫管理系統(tǒng)中的復合事件監(jiān)測機制,詳細描述利用事件樹模型監(jiān)測復合事件的思想,并提供具體的算法實現(xiàn)。經(jīng)分析,該算法在運行效率和空間占用上均比常見的有限自動機和Petri網(wǎng)有著更好的表現(xiàn)。
信息網(wǎng)模型主動數(shù)據(jù)庫復合事件監(jiān)測事件樹
與傳統(tǒng)數(shù)據(jù)庫相比,主動數(shù)據(jù)庫能夠對數(shù)據(jù)庫管理系統(tǒng)內(nèi)外發(fā)生的事件自動作出響應。這種自動響應機制通過主動規(guī)則來實現(xiàn)。一般來說,主動規(guī)則由三部分組成:事件、條件和動作[1]。事件,指數(shù)據(jù)庫系統(tǒng)中某一時刻的數(shù)據(jù)操作引發(fā)[2]。主動規(guī)則定義之后,一旦對應的事件發(fā)生,數(shù)據(jù)庫系統(tǒng)將對條件部分進行求值,若條件為真,則執(zhí)行對應的動作。也就是說,事件是整個主動規(guī)則執(zhí)行過程的起點。因此,事件的監(jiān)測是主動規(guī)則設計時的首要問題。
要對事件進行監(jiān)測,就必須先提供其描述。按照是否可分,事件通??梢苑譃閮深悾?/p>
(1) 原子事件:指單個的某一類事件。比如插入元組,更新屬性,刪除元組等。
(2) 復合事件:由幾個原子事件或者復合事件通過事件代數(shù)中的操作符連接而成。
復合事件處理CEP(CompositeEventProcessing)的應用極為廣泛,它能夠從看似毫無意義的原子事件組合中查找是否有更復雜的情況發(fā)生。信用卡防盜刷、安全監(jiān)控和商業(yè)活動監(jiān)控等方面對此均有著強烈的應用需求,知名企業(yè)如支付寶等均大量應用CEP來處理網(wǎng)絡欺詐、網(wǎng)絡攻擊等安全威脅[3]。而IBM、Oracle和微軟等更是推出了一系列CEP產(chǎn)品來滿足用戶日益增長的需求。
復合事件監(jiān)測的主要難點在于建模。原子事件的監(jiān)測相對較為容易,因而通常采取的建模方法都是從復合事件與其子事件以及相關原子之間的關系入手,建立起抽象的數(shù)學模型?,F(xiàn)有的復合事件監(jiān)測算法有Petri網(wǎng)、有限狀態(tài)自動機、事件樹以及事件圖等。
Petri網(wǎng)是一種強大的建模工具,能夠簡潔明確的描述各種各樣的復雜系統(tǒng),因此常被用于復合事件建模。它將復合事件抽象為節(jié)點和節(jié)點之間轉換關系的集合。其中,輸出節(jié)點為待監(jiān)測的復合事件,而輸入節(jié)點為與之相關的原子事件。Petri網(wǎng)結構中包含的信息由令牌標記,令牌的轉移方式則代表了原子事件的發(fā)生對復合事件的影響,轉移方式保存在控制矩陣之中。當令牌在節(jié)點之間轉移時,整個Petri網(wǎng)代表的復合事件的狀態(tài)也隨之發(fā)生變化。令牌每經(jīng)過一個節(jié)點,就對此節(jié)點做標記。當Petri網(wǎng)中不再有未被標記的節(jié)點時,就表示對應的復合事件被監(jiān)測到。比較典型的應用有SAMOS[4]和Hi-Fi[5]等。
有限狀態(tài)自動機,將復合事件視為正則表達式,并由此構造出對應的自動機。子事件的發(fā)生將引起自動機狀態(tài)的改變。當自動機進入終止狀態(tài)時,則代表該終止狀態(tài)對應的復合事件發(fā)生。比較典型的應用有ODE[6]和SASE[7]等。
事件樹,基于語法識別時復合事件表達式被解析為語法樹的思想,將復合事件抽象為相應的樹結構。樹結構中的葉子節(jié)點表示原子事件,根節(jié)點表示需要監(jiān)測的復合事件,中間的各節(jié)點表示待監(jiān)測復合事件的子孫事件。只有當一個節(jié)點的子事件都發(fā)生時,該節(jié)點對應的事件才被監(jiān)測到。當整棵事件樹中的所有子節(jié)點對應事件均被監(jiān)測到時,就表示根節(jié)點對應的復合事件的發(fā)生。比較典型的應用有READY[8]和Zstream[9]等。
事件圖的思想與事件樹類似,用有向無環(huán)圖來表示復合事件,其中的葉子節(jié)點表示原子事件,非葉子節(jié)點表示事件復合操作。同一復合事件的不同實例,作為不同對象進行處理。事件發(fā)生的消息從葉子節(jié)點向父節(jié)點傳遞,并標記沿途節(jié)點。當圖中所有節(jié)點均被標記時,該事件圖對應的復合事件被監(jiān)測到。比較典型的應用有Snoop[10]和EVE[11]等。
目前學術界的主流研究方向大多集中于有限狀態(tài)自動機和Petri網(wǎng)。前者的缺點主要在于系統(tǒng)中復合事件子事件的狀態(tài)數(shù)與子事件個數(shù)呈指數(shù)相關。例如,復合事件E=E1ANDE2ANDE3中每個子事件都有兩個狀態(tài),從而需要8=23個狀態(tài)來表示該復合事件。而后者的缺點則在于表示和執(zhí)行太過復雜,處理較為簡單的復合事件時顯得過于累贅。例如,復合事件C2 =E3THENE4,用PetriNets表示之后不僅需要多個對象來表示復合事件的狀態(tài),還需要一個轉換矩陣來控制狀態(tài)之間的遷移,極為繁瑣。至于事件圖,該方法在表示復合事件時缺乏統(tǒng)一的形式框架,同時沒有統(tǒng)一的形式規(guī)范來描述復合事件監(jiān)測過程。
綜合分析以上幾種方法,事件樹的表現(xiàn)更為優(yōu)異。因此,本文結合INMDB的特性,基于事件樹的結構作出改進,提出了一種新型的事件樹結構——高級事件樹AET(AdvancedEventTree),并在此基礎上設計實現(xiàn)了INMDB中的復合事件的監(jiān)測機制。該監(jiān)測機制能夠準確捕獲常見的幾種復合事件,具有較好的運行效率和較低的空間占用,同時,又能夠與原有系統(tǒng)很好地耦合。
信息網(wǎng)模型INM(InformationNetworkModel)是面向對象的語義模型,它將現(xiàn)實世界的實體抽象為數(shù)據(jù)庫中的對象,具有相同特點的實體被抽象為類,實體間的關系轉換為對象之間的關系[12]?;贗NM實現(xiàn)的數(shù)據(jù)庫管理系統(tǒng)INMDB引入了角色關系、復雜關系、多元關系以及它們各自的逆關系等概念,表示對象之間的關系時顯得更為直觀、自然。
2.1原子事件
在INMDB中,事件區(qū)分類型和實例。按照事件代數(shù)中的約定,事件類型用大寫字母開頭,可以包括數(shù)字,如Event、Event1或A等;而事件實例則用小寫字母開頭,末尾加下標數(shù)字,如event1、event11和a1等,下標數(shù)字用于區(qū)分發(fā)生的先后次序,數(shù)字越小,對應的事件實例越先發(fā)生。
前文提到,事件可以分為原子事件和復合事件兩類。INMDB中的原子事件主要包括:
(1) 方法事件。對數(shù)據(jù)庫中的數(shù)據(jù)對象進行操作。
(2) 時序事件。當系統(tǒng)時間運行至某一特定時刻時觸發(fā),用絕對時間表示。
(3) 抽象事件。與外部環(huán)境之間的通信,由應用層的消息或用戶指令顯式觸發(fā)。
抽象事件的發(fā)生具有不確定性,因此,不在事件監(jiān)測的考慮范圍內(nèi)。時序事件與此類似,INMDB底層沒有計時機制,所以該部分通過開放底層接口,由應用層計時來實現(xiàn)。抽象事件和時序事件的監(jiān)測都由應用層實現(xiàn),因此,不在本文的討論范圍之內(nèi)。下文提到的原子事件只包含方法事件。
目前的INMDB包括類、對象和查詢?nèi)齻€部分,其中查詢不涉及對數(shù)據(jù)的修改,因此,原子事件主要與前兩者相關。
例1對類的操作:創(chuàng)建一個“大學”的類。其中帶“@”的指當前類具有的屬性,而不帶“@”的則指當前類與其他類之間的關系,inverse后為該關系的逆關系[13]。
createclass大學[
@建校日期:date,
所在市(N:1):城市(inverse下轄大學),
@世界排名:int];
例2對對象的操作:創(chuàng)建一個對象"教授”,并指定他所指導的學生和教授的課程以及辦公室電話。
insert教授 張三[
指導學生:{李四,王五},
教授課程:數(shù)據(jù)庫系統(tǒng)
];
例3對對象的操作:將對象“A大學”中的關系“地址”的值修改為“B市”。
updateA大學modify地址:B市;
對象數(shù)據(jù)庫中,通過向指定對象傳遞消息進行底層數(shù)據(jù)的訪問與操作。因此,每個方法事件都與特定的類名、方法名以及操作對象的名字相關。與一般對象數(shù)據(jù)庫有所區(qū)別的是,雖然INMDB中不同類型方法事件對應的類不同,如例1、例2和例3,分別對應SchmClass類、Instance類和UpdateModify類,但方法名都相同,均為execute()。因此,原子事件定義時,可以通過指定類名和操作對象名,并在此基礎上進行封裝,來唯一標識該事件。
為了便于索引及組成復合事件,所有事件都具有唯一的事件名。事件名與事件代數(shù)中用于表示事件類型和實例的標識符不同,不受后者定義時對首字母的限制。
事件定義語句的文法描述如下:
CREATEEVENTeventNameEQUeventExpressionSEMICOLON
例4原子事件的定義:定義名為“updateJack”的原子事件,監(jiān)測對象“Jack”中的數(shù)據(jù)的修改。
createeventupdateJack=updateJackmodify;
該定義語句經(jīng)過語法解析之后,可以得到對應的類名UpdateModify和操作對象名Jack。這些信息封裝在原子事件類primitiveEvent中,存入數(shù)據(jù)庫底層。針對原子事件建立兩個索引,分別以“類名+操作對象名”和“事件名”為鍵值。
在原子事件updateJack已被存入數(shù)據(jù)庫底層的前提下,當用戶輸入命令“updateJackmodifyage:25;”時,原子事件監(jiān)測器會以操作類名updateModify和操作對象名Jack為鍵值在數(shù)據(jù)庫底層進行查找,并成功返回。此時,即表示事件updateJack被監(jiān)測到。
2.2復合事件
復合事件的處理往往會涉及到時間范圍的限制。與一般主動數(shù)據(jù)庫不同,INMDB中的時間間隔由子事件來標識,而非絕對時間點。在需要使用絕對時間點的地方,可以先創(chuàng)建對應的原子事件,對其進行封裝。這樣的設計使得INMDB在可擴展性方面表現(xiàn)更好。
按照事件操作符的不同,復合事件具體可以分為六類,操作符依據(jù)涉及的子事件個數(shù)又可分為二元操作符和三元操作符兩大類。
二元操作符對應復合事件具有如下形式:
Event=Event1OPEvent2
具體分為:
合取:對應操作符為AND,只有當Event1、Event2均發(fā)生時,Event才發(fā)生;
析取:對應操作符為OR,當Event1或Event2已發(fā)生時,Event才發(fā)生;
順序:對應操作符為THEN,只有當Event1在Event2之前發(fā)生時,Event才發(fā)生;
二元事件的時間范圍默認為同一事務中。
三元操作符對應復合事件具有如下形式:
Event=OPEvent2inEvent1,Event3
Event1,Event3用于標記一段時間間隔。
具體分為:
截止:對應操作符為ALL,將指定時間間隔內(nèi)Event2的所有發(fā)生視為一次發(fā)生,并以此觸發(fā)Event的發(fā)生。
歷史:對應操作符為mTIMES,只有當Event2在指定時間間隔內(nèi)發(fā)生m次時,Event才發(fā)生。
否定:對應操作符為NO,只有當Event2在指定時間間隔內(nèi)沒有發(fā)生時,Event才發(fā)生。
復合事件的狀態(tài)隨子事件狀態(tài)的變化而變化。下面將用一個例子來大致闡述該過程。
例5定義事件instantiationOfA,監(jiān)測在類A創(chuàng)建之后插入其對象a的行為。
createeventcreateSchmA=createclassA;
createeventinsertInstA=insertAa;
createeventinstantiationOfA=createSchmAtheninsertInstA;
instantiationOfA為順序復合事件,該事件雖然是二元復合事件,卻與三元復合事件有著相似之處。當子事件createSchmA未被監(jiān)測到時,無論另一個子事件insertInstA是否發(fā)生,均不會影響其狀態(tài)。而createSchmA發(fā)生后,則instantiationOfA被“激活”,開始接受insertInstA狀態(tài)的影響。若insertInstA此時發(fā)生,則instantiationOfA狀態(tài)發(fā)生變化,標識著該復合事件被監(jiān)測到,進而觸發(fā)主動規(guī)則中其他部分的執(zhí)行以及當前事件的父事件狀態(tài)的變化。隨后,兩個子事件的狀態(tài)被重置,以便監(jiān)測下一次發(fā)生。
復合事件與其子事件之間狀態(tài)變化信息的傳遞通過高級事件樹AET(AdvancedEventTree)完成。
高級事件樹AET的設計建立在事件樹的基礎之上。其構建基于對復合事件定義語句進行的語法解析。為了方便對復合事件進行詞法分析和語法解析以獲得必要的信息,建立事件表達式的文法描述如下:
eventExpression:primitiveEventExpression
|compositeEventExpression
compositeEventExpression:binaryEventExpression
|ternaryEventExpression
binaryEventExpression:eventNameANDeventName
|eventNameOReventName
|eventNameTHENeventName
ternaryEventExpression:ALLeventNameINeventNameCOMMAeventName
|INT_STRTIMESeventNameINeventNameCOMMAeventName
|NOeventNameINeventNameCOMMAeventName
binaryEventExpression表示二元復合事件,ternaryEventExpression表示三元復合事件。INT_STR表示整型常量,eventName對應事件名。
3.1節(jié)點
AET中的節(jié)點分為葉子節(jié)點和非葉子節(jié)點兩類。節(jié)點與事件相對應,在INMDB中存儲時以事件名為索引。事件可以與多條主動規(guī)則相關,也可以作為其他復合事件的子事件。作為子事件時,事件的狀態(tài)將會對作為父事件的復合事件產(chǎn)生影響。對于順序復合事件和三元復合事件,只有特定位置的子事件狀態(tài)改變后,當前復合事件的狀態(tài)才會發(fā)生變化。因此,存儲相關復合事件時,需要依據(jù)當前事件的狀態(tài)是否會對其造成影響而分類,分別設為activeComEvents和passiveComEvents。同時,還需要保存當前事件在相關復合事件中的位置。
因此,作為基類的Event類設計如下:
classEvent{
private:
stringeventName;
map
//狀態(tài)會受當前事件影響
map
//狀態(tài)不受當前事件影響
vector
};
與事件樹相同,AET中的葉子節(jié)點表示原子事件。不同之處在于,中間節(jié)點不再只表示待監(jiān)測復合事件的子孫事件,而可以表示其他待監(jiān)測復合事件。通過按事件名索引,AET將所有相關的復合事件合并在同一顆樹中,而不是每個復合事件都單獨占用一顆事件樹。
設有以下兩個復合事件表達式:
(1)A=BANDC
(2)C=DORE
用一般的事件樹表示,如圖1所示。
圖1 一般事件樹表示
用AET表示,如圖2所示。
圖2 AET表示
因此,在復合事件表達式相同時,AET的空間占用比一般的事件樹更少。
原子事件中封裝有對應數(shù)據(jù)操作的類名和操作對象名。例如,createclassA[]; 操作對應的類為SchmClassPre,而對應的操作對象名為A。因此,AET中的葉子節(jié)點設計如下:
classPrimitiveEvent{
private:
stringoperationType;
stringoperationName;
};
其中,operationType為事件對應的操作類型,而operationName為事件對應的操作對象名。
依據(jù)文法描述,復合事件可以分為二元復合事件和三元復合事件兩種。對于二元復合事件,其狀態(tài)取決于兩個子事件的狀態(tài)。同時,子事件對齊影響方式取決于二元復合事件的類型。因此,二元復合事件類BinaryEvent設計如下:
classBinaryEvent:publicEvent{
private:
stringeventType;
boolleftStatus;
boolrightStatus;
stringleftEvent;
stringrightEvent;
};
其中,eventType為事件類型,leftEvent和rightEvent分別為左右子事件名。
考慮到三元復合事件與二元復合事件中的順序復合事件有所類似,不妨將事件表達式E=OPE2inE1,E3中的E2視為待監(jiān)測事件。截止、歷史和否定復合事件均需要記錄待監(jiān)測事件的發(fā)生次數(shù),因此,三元復合事件類TernaryEvent設計如下:
classTernaryEvent:publicBinaryEvent{
private:
intmonitoredEventCount;
inttargetValue;
stringmonitoredEvent;
};
monitoredEventCount記錄待監(jiān)測事件的發(fā)生次數(shù)。targetValue保存待監(jiān)測事件的期望發(fā)生次數(shù),在截止復合事件中默認值為-1,歷史復合事件中與定義語句中相同,而否定復合事件中其值為0。
3.2邊
依據(jù)3.1節(jié)中Event類的描述,AET中的邊對應著子事件指向相關復合事件的指針。子事件的狀態(tài)變化通過該指針進行傳遞,表現(xiàn)在AET中便是狀態(tài)變化的消息沿葉子節(jié)點一直向上傳遞。
3.3AET的構建
AET的構建過程,主要分為事件表達式解析過程和預處理過程。前者主要目的在于通過事件表達式的語法解析,生成對應的事件類;而后者的主要目的在于建立起新的事件與數(shù)據(jù)庫中已有事件之間的關系。
在INMDB中,事件定義語句具有如下形式:
createeventeventName=eventExpression;
語法解析過程中,對該定義語句進行處理,可以獲得當前事件的事件名。對于復合事件,還可獲得其子事件的事件名。結合前文中事件表達式的文法描述,便可構建出相應的Event類。
在預處理過程中,借助INMDB底層提供的查詢接口[14],按照子事件名進行查找,找到復合事件對應的子事件,并依據(jù)復合事件的類型修改子事件中的activeComEvents或者passiveComEvents,從而將新的復合事件添加到INMDB中。該過程的AET表示,如圖3、圖4所示。
圖3 AET構建前
圖4 AET構建后
如第3節(jié)所述,事件定義語句中所包含的信息經(jīng)過語法解析后,用于構造對應的Event類,并存入數(shù)據(jù)庫底層。INMDB中的所有Event類彼此關聯(lián),形成一棵完整的AET。PrimitiveEvent類是它的葉子節(jié)點,而BinaryEvent類及其子類對應的事件則通過共同的子事件相關聯(lián),作為中間節(jié)點,并且其中有一部分會成為AET的根節(jié)點。
當數(shù)據(jù)操作命令輸入時,可以通過語法解析獲取操作類型對應的類名operationType和操作對象名operationName。通過在數(shù)據(jù)庫中進行查找,可以確定是否存在對應的原子事件。如果能找到,則證明原子事件被監(jiān)測到。
此后的處理方式與復合事件被監(jiān)測到之后相同,即,將事件發(fā)生的消息傳遞給所有相關的父事件,即activeComEvents,并根據(jù)在父事件中的位置而做出不同的處理。設該部分對應函數(shù)為invoke(),用算法描述如下:
Input:Event中的activeComEvents
Output:無
FORactiveComEvents中的每個activeComEvent
//即
IFactiveComEvent.second==left:
//置對應的左事件狀態(tài)為true
activeComEvent.first.leftStatus=true
ENDIF
IFactiveComEvent.second==right
//置對應的右事件狀態(tài)為true
activeComEvent.first.rightStatus=true
ENDIF
IFactiveComEvent.second==middle
//將待監(jiān)測事件的計數(shù)增1
++activeComEvent.first.monitoredEventCount
ENDIF
ENDFOR
復合事件的監(jiān)測建立在子事件被監(jiān)測到的基礎之上,而不同類型的復合事件的監(jiān)測算法又有所不同。在介紹復合事件監(jiān)測算法前,引入兩個輔助函數(shù),activateIn(subEvent)和deactivateIn(subEvent)。前者的功能為將當前復合事件從指定子事件的passiveComEvents轉移到activeComEvents中。后者反之。
當復合事件被監(jiān)測到之后,用于表示其子事件狀態(tài)的leftStatus、rightStatus等均被重置,以便等待下一次發(fā)生。
4.1二元復合事件
二元復合事件可以分為三類:合取復合事件、析取復合事件以及順序復合事件。
依據(jù)2.2節(jié)中的定義,當且僅當左右子樹對應的事件均被監(jiān)測到時,合取復合事件才被監(jiān)測到;而只要左右子樹對應的事件有一個被監(jiān)測到,則析取復合事件就被監(jiān)測到。
順序復合事件相對較為復雜。對于形如Event1THENEvent2的順序復合事件,只有兩個子事件按順序發(fā)生時,順序復合事件才被監(jiān)測到。即,若Event1未發(fā)生,則Event2的發(fā)生對復合事件而言沒有意義。該狀態(tài)可以通過將順序復合事件置于Event2對應事件類的成員passiveComEvents中來表示。當且僅當Event1發(fā)生之后,Event2才被“激活”,從而能夠影響復合事件的狀態(tài)。相對應地,通過調用activateIn(Event2),順序復合事件從passiveComEvents轉移到activeComEvents中。
根據(jù)上述分析,可以設計出二元復合事件的監(jiān)測算法如下:
Input:BinaryEvent
Output: 無
SWITCHeventType:
CASEconjunction:
IFleftStatus&&rightStatus:
當前復合事件被監(jiān)測到
invoke(activeComEvents)
//重置子事件狀態(tài),等待下一次發(fā)生
leftStatus=false
rightStatus=false
ENDIF
CASEdisjunction:
IFleftStatus||rightStatus
當前復合事件被監(jiān)測到
invoke(activeComEvents)
//重置子事件狀態(tài),等待下一次發(fā)生
leftStatus=false
rightStatus=false
ENDIF
CASEsequence:
IFleftStaus
//在右子樹中激活
activateIn(rightEvent)
ENDIF
IFrightStatus
當前復合事件被監(jiān)測到
invoke(activeComEvents)
//重置子事件狀態(tài),等待下一次發(fā)生
leftStatus=false
rightStatus=false
deactivateIn(rightEvent)
ENDIF
4.2三元復合事件
三元復合事件主要用于監(jiān)測指定時間間隔內(nèi),特定事件的發(fā)生次數(shù)。其左右子事件分別標記這段時間間隔的開始與結束,而三元復合事件類中的monitoredEvent成員則對應特定事件。因此,只有當左子事件發(fā)生之后,待監(jiān)測事件與右子事件才被“激活”。同樣,該步驟用activateIn()函數(shù)的調用來表示。
依據(jù)monitoredEvent發(fā)生次數(shù)的不同,三元復合事件可以分為截止復合事件、歷史復合事件和否定復合事件三類。指定時間間隔內(nèi)只要monitoredEvent發(fā)生,截止復合事件就被監(jiān)測到;反之,若monitoredEvent沒有發(fā)生,則否定復合事件被監(jiān)測到。而只有當monitoredEvent發(fā)生指定次數(shù)時,歷史復合事件才會被監(jiān)測到。
三者均需要統(tǒng)計monitoredEvent的發(fā)生次數(shù),用統(tǒng)一的成員變量monitoredEventCount來保存該值。特別地,歷史復合事件中還需用targetValue來保存指定的monitoredEvent發(fā)生次數(shù)。
根據(jù)上述分析,可以設計出三元復合事件的監(jiān)測算法如下:
Input:TernaryEvent
Outpu: 無
IFleftStatus
activateIn(monitoredEvent)
activateIn(rightEvent)
ENDIF
IFrightStatus
SWITCHeventType
CASEclosure
IFmonitoredEventCount> 0
當前復合事件被監(jiān)測到
invoke(activateComEvents)
ENDIF
CASEhistory
CASEnot
IFmonitoredEventCount==targetValue
當前復合事件被監(jiān)測到
invoke(activateComEvents)
ENDIF
//重置子事件狀態(tài),等待下一次發(fā)生
leftStatus=false
monitoredEventCount= 0
rightStatus=false
deactivateIn(monitoredEvent)
deactivateIn(rightEvent)
ENDIF
目前的主流研究方向集中在有限狀態(tài)自動機和Petri網(wǎng)上,因此,為了測試AET在復合事件監(jiān)測方面的性能,本文使用INMDB與SAMOS(采用Petri網(wǎng))和ODE(采用狀態(tài)機)進行比較。測試指標為處理相同復合事件定義語句所需要的時間。本文中用到的測試環(huán)境為Intel(R)Xeon(R)CPUE5-2407v2 @2.40GHz,memory3GB,RedHatEnterpriseLinuxServerrelease6.4 (Santiago)。
5.1數(shù)據(jù)與實驗設計
我們通過批量處理復合事件定義語句來計算其平均時間。因為復合事件的處理極為耗時,實驗主要測試了百、千、萬級別的復合事件定義語句的處理時間。該時間取5次處理的平均值。每次處理前,數(shù)據(jù)庫中都只有必要的原子事件。
5.2實驗結果
表1和圖5分別記錄了不同數(shù)據(jù)庫處理相同數(shù)量的復合事件定義語句的總時間和平均時間。
表1 復合事件定義語句總處理時間 單位:s
圖5 復合事件平均處理時間/ms
5.3結果分析
表1中的數(shù)據(jù)為多次實驗的平均值,最大限度地排除了偶然誤差。從數(shù)據(jù)來看,處理100條復合事件時,INMDB只需2.451s,而SAMOS則需要7.193s,ODE更是耗時達14.387s。類似的情況也出現(xiàn)在處理千、萬級別數(shù)量的復合事件定義語句時。因此,可以認為,處理相同數(shù)量的復合事件定義語句,INMDB耗時比SAMOS和ODE更少。將復合事件定義語句總處理時間轉換為平均處理時間,用圖5中的柱狀圖表示,可以直觀地看出三者之間的性能差異。
綜上所述,實驗結果表明,單位時間內(nèi),INMDB能處理的復合事件語句數(shù)量比SAMOS和ODE更多,充分體現(xiàn)了AET在復合事件監(jiān)測方面的優(yōu)越性。
本文綜合分析對比了各種主流復合事件監(jiān)測算法之后,選擇了事件樹作為基礎,提出了AET的概念,并以此為模型在INMDB現(xiàn)有基礎之上設計并實現(xiàn)了復合事件監(jiān)測機制。經(jīng)過實驗對比,該模型在單位時間內(nèi)處理復合事件的效率比主流的有限狀態(tài)自動機和Petri網(wǎng)更為出色。
事件監(jiān)測是主動規(guī)則中最重要的一部分,而復合事件監(jiān)測更是重中之重。該部分的順利完成為INMDB中整個主動機制的實現(xiàn)打下了堅實的基礎。放眼未來,分布式是數(shù)據(jù)庫發(fā)展的主流。目前的復合事件監(jiān)測機制主要針對單機環(huán)境,因此,下一步的工作是在保持單機環(huán)境下事件處理優(yōu)勢的前提下,實現(xiàn)分布式環(huán)境下的復合事件監(jiān)測。
[1]PatonNW,DíazO.Activedatabasesystems[J].ACMComputingSurveys(CSUR),1999,31(1):63-103.
[2] 郝忠孝.主動數(shù)據(jù)庫系統(tǒng)理論基礎[M].北京:科學出版社,2009.
[3] 蔡學鏞.輕松理解復合事件處理[J].程序員,2010(6):112-113.
[4]GatziuS,DittrichKR.SAMOS:Anactiveobject-orienteddatabasesystem[J].IEEEDataEng.Bull.,1992,15(1-4):23-26.
[5]AlShaerE,AbdelWahabH,MalyK.Hifi:Anewmonitoringarchitecturefordistributedsystemsmanagement[C]//DistributedComputingSystems,1999.Proceedings.19thIEEEInternationalConferenceon.IEEE,1999:171-178.
[6]GehaniNH,JagadishHV.OdeasanActiveDatabase:ConstraintsandTriggers[C]//Proceedingsofthe17thInternationalConferenceonVeryLargeDataBases,Barcelona,Catalonia,Spain, 1991.SanFrancisco,California,USA:MorganKaufmann,1991:327-336.
[7]AgrawalJ,DiaoY,GyllstromD,etal.Efficientpatternmatchingovereventstreams[C]//Proceedingsofthe2008ACMSIGMODinternationalconferenceonManagementofdata.ACM,2008:147-160.
[8]GruberRE,KrishnamurthyB,PanagosE.ThearchitectureoftheREADYeventnotificationservice[C]//Proceedingsofthe19thInternationalConferenceonDistributedComputingSystems,Austin,TX,USA,1999.Washington,DC,USA:IEEE,1999:0108.
[9]MeiY,MaddenS.Zstream:acost-basedqueryprocessorforadaptivelydetectingcompositeevents[C]//Proceedingsofthe2009ACMSIGMODInternationalConferenceonManagementofdata.ACM,2009:193-206.
[10]ChakravarthyS,MishraD.Snoop:Anexpressiveeventspecificationlanguageforactivedatabases[J].Data&KnowledgeEngineering,1994,14(1):1-26.
[11]GeppertA,TombrosD.Event-baseddistributedworkflowexecutionwithEVE[C]//Middleware’98.SpringerLondon,1998:427-442.
[12]LiuM,HuJ.Informationnetworkingmodel[M]//ConceptualModeling-ER2009.SpringerBerlinHeidelberg,2009:131-144.
[13] 徐倩,胡婕,劉夢赤.復雜語義關系的描述與操作[J].計算機科學與探索,2014,8(12):1432-1441.
[14] 金錚,劉夢赤,胡婕.信息網(wǎng)數(shù)據(jù)庫管理系統(tǒng)的查詢優(yōu)化[J].計算機科學與探索,2015,9(3):300-309.
DESIGNANDIMPLEMENTATIONOFCOMPOSITEEVENTSDETECTIONMECHANISMININMDB
HeHongdaLiuMengchi
(SchoolofComputer,WuhanUniversity,Wuhan430072,Hubei,China)
Formostactivedatabasesystem,it’sdifficulttodetectcompositeevent.ThepaperintroducesthecompositeeventdetectingmechanisminINMDBmanagementsystem,describesindetailtheideaofusingeventtreemodeltodetectcompositeevents,andprovidesspecificalgorithmicimplementationaswell.Accordingtotheanalysis,thisalgorithmisbetterthanfiniteautomatonandPetrinets,whicharemuchmorecommon,inbothrunningefficiencyandmemoryoccupation.
Informationnetworkmodel(INM)ActivedatabasesCompositeeventsdetectionEventtree
2015-07-20。賀宏達,碩士,主研領域:數(shù)據(jù)庫技術。劉夢赤,教授。
TP
ADOI:10.3969/j.issn.1000-386x.2016.10.010