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