关于Drools规则编写的疑问

liandahu 2012-01-11
    小弟最近搞毕业设计,项目中需要引入规则引擎Drools,对于这个Drools了解比较少,看了一些资料后,现在对“如何编写规则文件才能让规则匹配更高效”这个问题比较困惑。
    先简单介绍一下问题背景:我在做一个比较简单的审计系统,系统可以指定一些审计规则,而我要实现的是拿到一个操作记录之后,去和这些审计规则进行匹配。
    首先看一下我的操作记录的java类:

public class AnalysisInfo{

private int id;
private String time;
private String srcIP;
private String srcMAC;
private String srcPort;
private String destIP;
private String destMAC;
private String destPort;
private String dbName;
private String table;
private String action;
         geter seter...
}
   而审计规则大概是这样子的:(目前只能简单用文字描述,系统如何表示现在还没有做到那里)
    “对于服务器A上的数据库服务器B中的数据库C里的表D在某个时间段E内如果进行了F操作,则通过GHI三种方式进行报警”
    现在的困惑就是对于这样一个场景,如何编写规则能让匹配过程更高效?能想到的最简单的方式就是:
    When
      服务器==A
      数据库服务器==B
      数据库==C
      表==D
      操作==F
      。。。。。。。
    Then
      通过GHI方式报警

    因为我对Drools的那个rete算法不懂,也不知道具体是如何匹配的,如果假设规则集比较大的话,这样写规则效率是否比较低?因为对我这个场景来说,如果操作记录的“服务器==A”的话,那么所有规则里面“服务器!=A”的那些规则就不需要再匹配了。(就是一个树形的结构)
     希望对Drools比较了解的朋友指点一下,这样的一个场景,该如何写规则比较好?
pf_miles 2012-01-12
根据drools的官方建议,其实只要不滥用eval,那么效率都是可以保证的;也就是尽量使用带类型信息的那种写法,也就是最普通的写法了: ClassName(cond1, cond2, cond3....)
引用
如果假设规则集比较大的话,这样写规则效率是否比较低?

drools实现了reteOO算法,它的目的就是:"时间开销不会随着规则集的增大而线性增长",所以也不必担心规则集太大造成的问题;不知道您说的规则集比较大是指多大?之前drools开发人员回复过"20K rules is not excessive",您的规则有多少万条?
所以写法不用太纠结了,只要不把eval用在很大段的代码上,都没问题;
我理解一下您的场景:是否A, B, C, D, E, F这些条件您都放在同一个fact对象里面?文中提到的“AnalysisInfo”?如果是的话,这样写就OK:
when
AnalysisInfo(服务器==A && 数据库服务器==B && 数据库==C && 表==D && 操作==F)
then
通过GHI方式报警
end
liandahu 2012-01-12

引用

drools实现了reteOO算法,它的目的就是:"时间开销不会随着规则集的增大而线性增长",所以也不必担心规则集太大造成的问题;不知道您说的规则集比较大是指多大?之前drools开发人员回复过"20K rules is not excessive",您的规则有多少万条?

其实就是想到这个问题,所以来问一下是否规则的编写会对效率造成比较大的影响而已,我这个只是个毕设,而且规则不会太多。
引用

我理解一下您的场景:是否A, B, C, D, E, F这些条件您都放在同一个fact对象里面?文中提到的“AnalysisInfo”?

您的理解没有错,确实所有需要的数据都已经在AnalysisInfo里面了!
引用

如果是的话,这样写就OK:
when
AnalysisInfo(服务器==A && 数据库服务器==B && 数据库==C && 表==D && 操作==F)
then
通过GHI方式报警
end

恩,这样写对我现在的需求来说,是最简单的,如果对效率没有什么影响,这样最好了!
非常感谢您的指导!
Global site tag (gtag.js) - Google Analytics