`
benbenxiongyuan
  • 浏览: 108711 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Drools 在告警关联分析中的应用

    博客分类:
  • Java
 
阅读更多
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分钟)的数据进行预推理分析,这一步的目的主要是减少大量冗余告警(对推理无用的告警)的数量,并产生推理分析的中间结果。第二步,在第一个规则引擎处理完成后,将数据导入到第二个规则引擎中,进行二次推理。在第二个规则引擎中保存第一次推理后产生的所有告警数据,保证引擎进行充分的推理,然后输出推理结果。上述推理过程应周期触发,保证上报的及时性要求。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics