Drools 在告警关联分析中的应用
http://benbenxiongyuan.iteye.com/blog/1121479
Drools5當(dāng)中提供了兩個對象與規(guī)則引擎進(jìn)行交互: StatefulKnowledgeSession
和 StatelessKnowledgeSession。
StatefulKnowledgeSession
顧名思義,就是有狀態(tài)的會話,在推理過程中可以記錄對象推理的中間狀態(tài)。StatefulKnowledgeSession對象是一種最常用的與規(guī)則引擎進(jìn)行交互的方式,它可以與規(guī)則引擎建立一個持續(xù)的交互通道,在推理計算的過程當(dāng)中可能會多次觸發(fā)同一數(shù)據(jù)集。在用戶的代碼當(dāng)中,最后使用完 StatefulKnowledgeSession 對象之后,一定要調(diào)用其 dispose()方法以釋放相關(guān)內(nèi)存資源。
規(guī)則引擎可以接受外部插入(insert)的業(yè)務(wù)數(shù)據(jù)——也叫 fact,一個fact對象通常是一個普通的Java的POJO,一般它們會有若干個屬性,每一個屬性都會對應(yīng)
getter和 setter方法,用來對外提供數(shù)據(jù)的設(shè)置與訪問。一般來說,在Drools規(guī)則引擎當(dāng)中,fact所承擔(dān)的作用就是將規(guī)則當(dāng)中要用到的業(yè)務(wù)數(shù)據(jù)從應(yīng)用當(dāng)中傳入進(jìn)來,對于規(guī)則當(dāng)中產(chǎn)
生的數(shù)據(jù)及狀態(tài)的變化通常不用 fact傳出。如果在規(guī)則當(dāng)中需要有數(shù)據(jù)傳出,那么可以通過
在 StatefulKnowledgeSession 當(dāng)中設(shè)置 global 對象來實現(xiàn),一個 global 對象也是一個普通的Java 對象,在向 StatefulKnowledgeSession 當(dāng)中設(shè)置 global 對象時不用 insert 方法而用setGlobal方法實現(xiàn)。
在將FACT插入規(guī)則引擎后,StatefulKnowledgeSession 需調(diào)用 fireAllRules()方法觸發(fā)所有的規(guī)則執(zhí)行,最后調(diào)用 dispose()方法將內(nèi)存資源釋放。
StatelessKnowledgeSession
StatelessKnowledgeSession的作用與 StatefulKnowledgeSession 相仿,它們都是用來接收業(yè)務(wù)數(shù)據(jù)、執(zhí)行規(guī)則的。事實上,StatelessKnowledgeSession 對StatefulKnowledgeSession做了包裝,使得在使用 StatelessKnowledgeSession 對象時不需要再調(diào)用 dispose()方法釋放內(nèi)存資源了。
因為 StatelessKnowledgeSession 本身所具有的一些特性,決定了它的使用有一定的局限
性。在使用 StatelessKnowledgeSession 時不能進(jìn)行重復(fù)插入 fact的操作、也不能重復(fù)的調(diào)用fireAllRules()方法來執(zhí)行所有的規(guī)則,對應(yīng)這些要完成的工作在 StatelessKnowledgeSession當(dāng)中只有 execute(…)方法,通過這個方法可以實現(xiàn)插入所有的 fact并且可以同時執(zhí)行所有的規(guī)則或規(guī)則流,事實上也就是在執(zhí)行 execute(…)方法的時候就在 StatelessKnowledgeSession內(nèi)部執(zhí)行了 insert()方法、fireAllRules()方法和 dispose()方法。
在告警關(guān)聯(lián)分析中的應(yīng)用。
在告警關(guān)聯(lián)分析中,插入規(guī)則引擎的FACT就是產(chǎn)生的實時告警對象。因告警是隨著時間持續(xù)遞增的,是一個動態(tài)的過程。為了分析持續(xù)遞增的大量告警間的相關(guān)性,需要對產(chǎn)生的告警進(jìn)行連續(xù)的推理分析。
在實際的應(yīng)用中,我們有兩種方式對對大量告警進(jìn)行推理分析。
一是用StatelessKnowledgeSession,將所有告警導(dǎo)入規(guī)則引擎后,進(jìn)行推理分析,然后導(dǎo)出推理結(jié)果。每隔一定時間后,再將所有的告警導(dǎo)入規(guī)則引擎,再進(jìn)行推理分析,循環(huán)執(zhí)行上述過程。這種方式適合總告警量不太大的情況。但在實際中,告警數(shù)量往往較多。所以在實際應(yīng)用中,這種方式不太實際。因告產(chǎn)生的警數(shù)量巨大,在將FACT導(dǎo)入規(guī)則引擎的過程中,規(guī)則引擎在構(gòu)造鑒別網(wǎng)絡(luò)在的時候,會花費大量的時間并消耗大量的內(nèi)存空間。在實際應(yīng)用中,規(guī)則引擎常常由于耗費的內(nèi)存太多而造成內(nèi)存溢出。即使內(nèi)存不發(fā)生溢出,也會因為在構(gòu)造鑒別網(wǎng)絡(luò)所耗費的大量時間,而讓人難以忍受,更談不上滿足告警上報的實時性要求了。
結(jié)合在實際應(yīng)用中的業(yè)務(wù)需要,綜合StatelessKnowledgeSession和StatefulKnowledgeSession的特點。在實際的告警關(guān)聯(lián)分析中我們往往采用第二種方式。即使用StatefulKnowledgeSession進(jìn)行規(guī)則的推理,在推理過程中,持續(xù)插入(insert)新產(chǎn)生的告警對象(FACT)到規(guī)則引擎中,然后調(diào)用fireAllRules()進(jìn)行推理分析。注:一次插入的告警對象不宜過多,不然會找造成較大的時間和內(nèi)存消耗。在調(diào)用規(guī)則引擎fireAllRules()方法進(jìn)行推理分析的過程中,應(yīng)盡量將規(guī)則引擎中的無用的數(shù)據(jù)retract掉,保證規(guī)則引擎中的數(shù)據(jù)量不要太多,否則還是會出現(xiàn)消耗內(nèi)存過大的情況,從而最終造成程序內(nèi)存溢出。
因告警量太大,在實際應(yīng)用中可考慮實現(xiàn)兩個規(guī)則引擎對告警進(jìn)行推理分析。首先由第一個規(guī)則引擎在告警處理平臺對一段時間比如(XX小時或XX分鐘)的數(shù)據(jù)進(jìn)行預(yù)推理分析,這一步的目的主要是減少大量冗余告警(對推理無用的告警)的數(shù)量,并產(chǎn)生推理分析的中間結(jié)果。第二步,在第一個規(guī)則引擎處理完成后,將數(shù)據(jù)導(dǎo)入到第二個規(guī)則引擎中,進(jìn)行二次推理。在第二個規(guī)則引擎中保存第一次推理后產(chǎn)生的所有告警數(shù)據(jù),保證引擎進(jìn)行充分的推理,然后輸出推理結(jié)果。上述推理過程應(yīng)周期觸發(fā),保證上報的及時性要求。
總結(jié)
以上是生活随笔為你收集整理的Drools 在告警关联分析中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: log4j无法打印日志的问题
- 下一篇: Drools 5.1.1(一)