第 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()
Copy to Clipboard Toggle word wrap

低效率状况顺序:flight 和 hotel

when
  $f:flight()
  $h:hotel() // Rarely booked
Copy to Clipboard Toggle word wrap

有关 DRL 模式和约束的详情,请参考 第 14.8 节 “DRL (WHEN)中的规则条件”

避免使用过量条款来迭代大量对象集合

避免使用 DRL 规则中的 from condition 元素迭代大型对象集合,如下例所示:

from 子句的条件示例

when
  $c: Company()
  $e : Employee ( salary > 100000.00) from $c.employees
Copy to Clipboard Toggle word wrap

在这种情况下,每当评估规则条件并提升规则评估时,决策引擎都会迭代大型图形。

另外,除了添加带有决定引擎必须频繁迭代的大型图形的对象,而是直接将集合添加到 KIE 会话中,然后在条件中加入集合,如下例所示:

没有 来自 条款的条件示例

when
  $c: Company();
  Employee (salary > 100000.00, company == $c)
Copy to Clipboard Toggle word wrap

在本例中,决策引擎只迭代列表一次,并可更有效地评估规则。

有关 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>
Copy to Clipboard Toggle word wrap

logback.xml 配置文件示例

<configuration>
  <logger name="org.drools.metric.util.MetricLogUtils" level="trace"/>
  ...
<configuration>
Copy to Clipboard Toggle word wrap

另外,通过将系统属性 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
Copy to Clipboard Toggle word wrap

这个示例包括以下关键参数:

  • evalCount 是节点执行期间插入的事实的约束评估数量。
  • elapsedMicro 是节点执行的时间(以微秒为单位)。

如果您找到了未完成的 evalCountelapsedMicro 日志,请将节点名称与 ReteDumper.dumpAssociatedRulesRete () 输出相关联,以识别与节点关联的规则。

ReteDumper 使用示例

ReteDumper.dumpAssociatedRulesRete(kbase);
Copy to Clipboard Toggle word wrap

ReteDumper 输出示例

[ AccumulateNode(8) ] : [Collect expensive orders combination]
...
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat