论坛首页 Java企业应用论坛

关于Drools规则编写的疑问

浏览 2551 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间: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比较了解的朋友指点一下,这样的一个场景,该如何写规则比较好?
   发表时间:2012-01-12  

引用一下我在其他版块提问后 pf_miles 的回复,给有同样疑问的朋友,谢谢 pf_miles 的回复!

pf_miles 32 分钟前

根据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
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics