浏览 2577 次
锁定老帖子 主题:关于Drools规则编写的疑问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-01-11
先简单介绍一下问题背景:我在做一个比较简单的审计系统,系统可以指定一些审计规则,而我要实现的是拿到一个操作记录之后,去和这些审计规则进行匹配。 首先看一下我的操作记录的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比较了解的朋友指点一下,这样的一个场景,该如何写规则比较好? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |