我想知道如何在 LHS 中使用规则的集合(用于包含、成员),可以在包含大元素列表(可能是数万)的 Guvnor 中进行管理。以黑名单匹配为例,如何非常有效地维护 guvnor 中的大黑名单?有任何想法吗?
2 回答
模型是这样的:
declare MyItem
end
和
declare MyList extends ArrayList
end
您需要使用该字段的公式。单击列表,然后单击新公式并编写
this contains myItem
或者在使用 memberOf 时。现在再次对 MyItem 使用公式
this memberOf myList
您可以将每个黑名单项插入工作内存中。这比使用 memberOf 或 contains 更有效。它还使使用 Guvnor 编写规则变得更加容易。如果列表包含字符串,您可以这样做:
declared ListItem
name:String
end
您可以使用 Drools 从列表中插入规则(您也可以在触发 Java 代码中的规则之前执行此操作):
rule "Just to empty the list"
when
list:List()
then
for(String name:list)
insert(Item(name));
end
现在您可以针对黑名单项目编写规则。
首先,我建议您在开始优化应用程序设计之前对此进行测试。这可能是一个完全没有问题的!
但是,如果您有一个庞大的黑名单,那么将其插入工作内存可能是一个缓慢的步骤。事实插入将导致它通过 Rete 网络传播,并且取决于有多少规则取决于其内容,这可能是一个缓慢的过程。Rete 网络更新后,后续评估应该很快。
因此,根据您的规则/会话的运行方式,优化性能的一种技术可能是创建一个长时间运行的会话并在启动时插入黑名单。有了这个,您可以插入一个“请求”事实并查看触发了什么,然后撤回请求,以便工作内存为下一个请求做好准备。
不幸的是,这确实引发了其他一些问题。例如,根据您的规则,您可能需要同步对会话的访问,而不是共享它。这会导致响应速度很快,但也必须彼此等待完成,这可能是一个可扩展性问题。如果这是一个问题,您可以创建一个会话池来支持多个用户同时查询。