第 20 章 DRL 的性能调优注意事项
以下主要概念或推荐做法可帮助您优化 DRL 规则和决策引擎性能。本节中总结了这些概念,并在适用的情况下在跨引用文档中进行更详细的说明。本节将根据新版本的 Red Hat Process Automation Manager 根据需要扩展或更改。
- 定义从左到右的模式约束的属性和值
在 DRL 模式限制中,确保事实属性名称位于 Operator 左侧的,并且值(constant 或变量)位于右侧。属性名称必须是索引中的键,而不是值。例如,写
Person (firstName == "John")
而不是Person ("John" == firstName)
。从右到左的定义约束属性和值可能会隐藏决策引擎性能。有关 DRL 模式和约束的详情,请参考 第 14.8 节 “DRL (WHEN)中的规则条件”。
- 在可能的情况下,在模式约束中使用相等的运算符类型
-
虽然决策引擎支持许多 DRL 操作器类型,但可用于定义业务逻辑的很多 DRL 操作器类型,但平等运算符
==
由决策引擎最有效评估。在实际情况时,请使用此操作器而不是其他 Operator 类型。例如,模式Person (firstName == "John")
比Person (firstName != "OtherName")
更高效。在某些情况下,只使用相等的运算符可能并不切实际,因此在使用 DRL 运算符时,请考虑所有业务逻辑需求和选项。 - 首先列出限制性最严格的规则条件
对于具有多个条件的规则,列出最多限制条件,以便在不满足更严格的条件时,决策引擎可以避免评估整个条件集。
例如,以下条件是批量书规则的一部分,适用于将 flight 和 hotel 组合在一起的电信者。在这种情况下,客户很少有 flights 的热线来接收此活动,因此很少满足 hotel 条件,且规则很少被执行。因此,第一个条件排序效率更高,因为它可防止决策引擎经常评估 flight 条件,当不满足 hotel 条件时不必要。
首选条件顺序: hotel 和 flight
when $h:hotel() // Rarely booked $f:flight()
when $h:hotel() // Rarely booked $f:flight()
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 低效率状况顺序:flight 和 hotel
when $f:flight() $h:hotel() // Rarely booked
when $f:flight() $h:hotel() // Rarely booked
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关 DRL 模式和约束的详情,请参考 第 14.8 节 “DRL (WHEN)中的规则条件”。
- 避免使用过量条款来迭代大量对象集合
避免使用 DRL 规则中的
from
condition 元素迭代大型对象集合,如下例所示:from
子句的条件示例when $c: Company() $e : Employee ( salary > 100000.00) from $c.employees
when $c: Company() $e : Employee ( salary > 100000.00) from $c.employees
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在这种情况下,每当评估规则条件并提升规则评估时,决策引擎都会迭代大型图形。
另外,除了添加带有决定引擎必须频繁迭代的大型图形的对象,而是直接将集合添加到 KIE 会话中,然后在条件中加入集合,如下例所示:
没有
来自
条款的条件示例when $c: Company(); Employee (salary > 100000.00, company == $c)
when $c: Company(); Employee (salary > 100000.00, company == $c)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,决策引擎只迭代列表一次,并可更有效地评估规则。
有关
from
元素或其他 DRL 条件元素的更多信息,请参阅 第 14.8.7 节 “DRL 中支持的规则条件元素(关键字)”。- 在规则中使用决策引擎事件监听程序而不是
System.out.println
语句进行调试日志 您可以在规则操作中使用
System.out.println
语句来调试日志和控制台输出,但对许多规则执行此操作可能会妨碍规则评估。作为效率更高的替代方案,请尽可能使用内置的决策引擎事件监听程序。如果这些监听程序不满足您的要求,请使用决策引擎支持的系统日志实用程序,如 Logback、Apache Commons Logging 或 Apache Log4j。有关支持的决策引擎事件监听程序和日志记录工具的更多信息,请参阅 Red Hat Process Automation Manager 中的决策引擎。
- 使用
drools-metric
模块来识别规则中的 obstruction 您可以使用
drools-metric
模块来识别在处理多个规则时的慢规则。drools-metric
模块也可以协助分析决策引擎性能。请注意,drools-metric
模块不用于生产环境。但是,您可以在测试环境中执行分析。要使用 drools-metrics 分析决策引擎性能,请将
drools-metric
org.drools.metric.util.MetricLogUtils
启用追踪日志记录,如下例所示:drools-metric
的项目依赖项示例<dependency> <groupId>org.drools</groupId> <artifactId>drools-metric</artifactId> </dependency>
<dependency> <groupId>org.drools</groupId> <artifactId>drools-metric</artifactId> </dependency>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow logback.xml 配置文件示例
<configuration> <logger name="org.drools.metric.util.MetricLogUtils" level="trace"/> ... <configuration>
<configuration> <logger name="org.drools.metric.util.MetricLogUtils" level="trace"/> ... <configuration>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,通过将系统属性
drools.metric.logger.enabled
设置为true
来启用MetricLogUtils
。另外,您可以通过设置drools.metric.logger.threshold
系统属性来更改指标日志记录的微秒阈值。注意只有超过阈值的节点执行才会被记录。默认值为
500
。完成配置后,规则执行会生成日志,如下例所示:
规则执行输出示例
TRACE [JoinNode(6) - [ClassObjectType class=com.sample.Order]], evalCount:1000, elapsedMicro:5962 TRACE [JoinNode(7) - [ClassObjectType class=com.sample.Order]], evalCount:100000, elapsedMicro:95553 TRACE [ AccumulateNode(8) ], evalCount:4999500, elapsedMicro:2172836 TRACE [EvalConditionNode(9)]: cond=com.sample.Rule_Collect_expensive_orders_combination930932360Eval1Invoker@ee2a6922], evalCount:49500, elapsedMicro:18787
TRACE [JoinNode(6) - [ClassObjectType class=com.sample.Order]], evalCount:1000, elapsedMicro:5962 TRACE [JoinNode(7) - [ClassObjectType class=com.sample.Order]], evalCount:100000, elapsedMicro:95553 TRACE [ AccumulateNode(8) ], evalCount:4999500, elapsedMicro:2172836 TRACE [EvalConditionNode(9)]: cond=com.sample.Rule_Collect_expensive_orders_combination930932360Eval1Invoker@ee2a6922], evalCount:49500, elapsedMicro:18787
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个示例包括以下关键参数:
-
evalCount
是节点执行期间插入的事实的约束评估数量。 -
elapsedMicro
是节点执行的时间(以微秒为单位)。
如果您找到了未完成的
evalCount
或elapsedMicro
日志,请将节点名称与ReteDumper.dumpAssociatedRulesRete ()
输出相关联,以识别与节点关联的规则。ReteDumper 使用示例
ReteDumper.dumpAssociatedRulesRete(kbase);
ReteDumper.dumpAssociatedRulesRete(kbase);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ReteDumper 输出示例
[ AccumulateNode(8) ] : [Collect expensive orders combination] ...
[ AccumulateNode(8) ] : [Collect expensive orders combination] ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -