Skip to content

业务规则

圣杯和银弹:让业务人员写业务逻辑,技术人员写业务功能。

表名:rule_file

字段名类型描述
idBIGINT主键,自增
domain_idBIGINT归属领域
nameVARCHAR(255)文件名
contentTEXT文件内容
typeVARCHAR(32)文件类型/格式,比如DRL
create_timeDATETIME创建时间
update_timeDATETIME更新时间
operatorVARCHAR(50)操作人
remarkVARCHAR(255)备注
statusTINYINT(1)状态 0 - 草稿 1 - 正式
versionINT版本号
  • status: 状态 0 - 草稿 1 - 正式,用于标识规则文件的生命周期。正式状态下的数据库记录,需要备份到历史表(rule_file_history),以便进行规则的版本控制,可以回退到上一个版本。 若考虑到灰色发布,生命周期的状态值需要扩展

一、编写方式

概念定义用法适用场景
DRLDrools Rule Language:Drools 规则语言,用于编写业务规则,包括条件(when)和动作(then),来描述复杂的业务逻辑。.drl 文件中书写规则,并通过 Drools 引擎解析执行。适用于复杂的业务逻辑定义场景,如保险费率、信用评分、营销活动规则等。
DSL/DSLRDomain-Specific Language (DSL) 用于将复杂的 DRL 规则转化为更人类友好的自然语言表达,通过 DSL 模板生成的规则文件称为 DSLR。通过 DSL 编写自然语言描述的规则,系统将其转换为 DSLR(.dslr 文件),最终生成可执行的 DRL。适用于非技术人员定义规则的场景,尤其适合业务人员进行规则编写和修改的场合,降低技术门槛。
YAMLYAML Ain't Markup Language:一种轻量的配置文件格式,常用于配置 Drools 引擎中的规则参数、条件和执行动作。使用 YAML 文件描述 Drools 规则参数或条件,并通过解析器转换为 DRL 规则或其他格式来执行。适用于规则、条件及其他 Drools 配置项经常变动且易于管理的场景,尤其在 DevOps 环境中使用 YAML 更为便捷。
DMN/FEELDecision Model and Notation (DMN) 是一种业务决策模型标准,Friendly Enough Expression Language (FEEL) 是其表达语言。DMN 模型常用于规则自动化。使用 DMN 表或决策模型定义复杂业务决策,FEEL 用于条件表达,主要在 .dmn 文件中描述。适用于需要业务人员直观查看决策逻辑和条件的场景,尤其适合金融、保险等行业,通过决策表直观展示业务决策规则。
BPMNBusiness Process Model and Notation:业务流程建模语言,用于结合业务规则引擎描述业务流程的图形化表示法,显示业务流程的流转和规则执行。使用 BPMN 流程图建模业务流程,并通过 Drools 引擎结合决策节点进行执行。适用于需要结合业务流程自动化和规则引擎的场景,如审批流、订单处理和工作流自动化等。
PMMLPredictive Model Markup Language:一种 XML 标准,用于描述和交换机器学习模型或预测模型,Drools 可以与其结合进行模型预测和规则执行。将 PMML 模型导入 Drools,通过规则引擎结合机器学习模型进行预测和决策。适用于需要通过预测模型进行规则处理的场景,例如风险分析、信用评分、欺诈检测等场合。

二、代码示例

1. DRL 代码示例

java
rule "Apply Senior Discount"
when
    $customer: Customer(age > 65)
then
    $customer.applyDiscount(10);
end

解释:此 DRL 规则表示当客户的年龄大于 65 岁时,给予 10% 的折扣。


2. DSL/DSLR 代码示例

DSL 文件内容

text
# Simple DSL example file

[when]There is a Customer=$c: Customer()
[when]- with age between {low:\d*} and {high:\d*}=age >= {low}, age <= {high}
[then]Apply a {discount} percent discount=modify($c) { setDiscount({discount}) };

DSRL 文件内容

text
There is a Customer
- with age between 65 and 100
Apply a 10 percent discount

生成的 DRL 文件

java
rule "Apply Discount to Senior Customers"
when
    $c: Customer(age >= 65, age <= 100)
then
    modify($c) { setDiscount(10) };
end

解释:DSL 文件使用自然语言表达了条件和动作,最后由 Drools 转换为 DRL 规则,用于执行业务逻辑。


3. YAML 代码示例

yaml
rules:
  - name: "Apply Senior Discount"
    condition: "age > 65"
    action: "applyDiscount(10)"

解释:此 YAML 文件描述了一个简单的规则:当客户年龄大于 65 时,执行折扣动作 applyDiscount(10)


4. DMN/FEEL 代码示例

DMN XML 文件

xml
<decision id="SeniorDiscount" name="Senior Discount Decision">
  <input id="CustomerAge" name="age"/>
  <decisionTable>
    <inputExpression id="AgeInput" name="age">
      <text>age</text>
    </inputExpression>
    <rule>
      <inputEntry>
        <text>age > 65</text>
      </inputEntry>
      <outputEntry>
        <text>applyDiscount(10)</text>
      </outputEntry>
    </rule>
  </decisionTable>
</decision>

解释:这是一个 DMN 决策表,使用 FEEL 表达式定义客户年龄大于 65 时应用 10% 折扣的决策规则。


5. BPMN 代码示例

BPMN 流程定义

xml
<bpmn:process id="DiscountProcess" name="Discount Process">
  <bpmn:exclusiveGateway id="AgeCheck" name="Check Age">
    <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">age > 65</bpmn:conditionExpression>
  </bpmn:exclusiveGateway>
  <bpmn:task id="ApplyDiscount" name="Apply Discount">
    <bpmn:incoming>AgeCheck</bpmn:incoming>
    <bpmn:outgoing>EndEvent</bpmn:outgoing>
  </bpmn:task>
</bpmn:process>

解释:BPMN 定义了一个业务流程,当客户年龄超过 65 时,流程流转至 Apply Discount 节点,应用折扣。


6. PMML 代码示例

PMML 模型定义

xml
<PMML version="4.3">
  <MiningModel>
    <MiningSchema>
      <MiningField name="age"/>
      <MiningField name="income"/>
    </MiningSchema>
    <Output>
      <OutputField name="risk" feature="predictedValue"/>
    </Output>
  </MiningModel>
</PMML>

解释:该 PMML 模型用于根据客户年龄和收入预测风险评分。模型可以与 Drools 规则引擎结合,通过规则执行预测和决策。


这些代码示例展示了如何结合 DRLDSL/DSLRYAMLDMN/FEELBPMNPMML 在不同场景下使用 Drools 引擎,帮助处理复杂的业务规则和决策。

三、编写原则

在编写Drools规则时,需要考虑多个维度以确保规则的可扩展性、灵活性和高效执行。以下是相关编写原则:

1.规则的独立性(Independence)

  • 定义:每条规则应当独立于其他规则,即规则之间的依赖关系应尽量减少。独立性可以确保规则的可扩展性和维护性,同时减少由于规则间的相互影响而引发的复杂性。
  • 示例:针对不同的业务规则,应尽量避免规则之间相互依赖。例如,规则A只处理订单总金额,规则B只处理用户的积分奖励,避免同时在两条规则中修改相同的数据字段。
  1. 规则的原子性(Atomicity)
  • 定义:规则应当尽量保持简单,专注于解决一个明确的问题,避免将多个逻辑组合在同一规则中。原子性规则使得问题的调试和定位更加容易,并且可以最大化并发性。
  • 示例:在处理订单时,分为两个原子规则:一个规则处理订单金额是否满足条件,另一个规则处理用户是否有足够的积分,而不是将两者合并在一起。
  1. 推理性(Reasoning Chain)
  • 定义:规则链是指通过多个规则进行递进式推理,逐步得出结论。规则链通常用于复杂的推理逻辑中。
  • 示例:在保险理赔系统中,规则1首先确定事故类型;规则2基于事故类型决定责任方;规则3进一步决定赔偿金额。通过逐步推导,构成规则链。
  1. 优先级(Salience)
  • 定义:Drools允许为规则设置优先级(salience),从而控制哪些规则先执行。在特殊场景下,规则的执行顺序至关重要。
  • 示例:在订单处理系统中,如果某一规则需要优先处理用户VIP订单,可以将该规则的优先级设定为较高值。
  1. 规则的生命周期(Lifecycle)
  • 定义:规则的生命周期包括规则的激活、条件匹配、执行和失效。设计规则时,需要考虑如何使规则在适当的时间段内生效或失效,以避免影响其他流程。
  • 示例:设计一个促销活动规则,该规则只在特定时间段内有效。通过规则生命周期管理,确保在促销活动结束后规则自动失效。
  1. 决策表(Decision Table)与决策树(Decision Tree)的选择
  • 决策表:适用于当规则的条件是有限的、且条件组合较多的场景。决策表通过表格结构明确列出条件与结果的组合关系,适合管理大量条件组合。

    • 示例:在贷款审批系统中,根据用户的收入水平、信用分数、贷款金额等多维条件组合进行审批,决策表能够直观管理这些条件。
  • 决策树:适用于条件之间具有层次关系的场景。决策树以树状结构的方式逐级分支,从根节点逐步分裂成多个叶节点,每个叶节点代表一个最终的决策结果。

    • 示例:在医疗诊断系统中,决策树可以根据病人的症状和体征逐步排除不相关的疾病,最终得出诊断结论。
  1. 规则组(Rule Group)
  • 定义:在某些场景下,规则可能需要成组运行,并具有一定的内部顺序。规则组可以对多个相关规则进行逻辑组合,并在规则组内部设置执行优先级。
  • 示例:在电商促销活动中,一组规则用于计算多重优惠,先应用满减活动,再应用打折促销,这时规则组就显得十分重要。
  1. 议程组和规则流
  • 定义:Drools 的性能会随着规则数量的增加而下降,因此需要考虑如何优化规则的执行。例如,避免复杂的when条件,使用有效的事实模型设计。
  • 示例:使用agenda-groupruleflow-group来控制规则执行的顺序,避免一次性加载大量无关规则。

总结:

维度原则说明适用场景
规则独立性避免规则间的相互依赖保证规则可扩展性,减少维护成本不同业务逻辑、模块间独立
规则原子性保持规则逻辑简单、专注增强规则的可调试性和可并发性单一问题的规则设计
推理性通过规则链实现复杂推理适用于复杂的业务推导过程,如保险、医疗等系统递进式推理、复杂逻辑
优先级(Salience)根据业务需求设置规则执行优先级保证重要规则先执行,避免冲突VIP订单优先处理等特定场景
生命周期设置规则的生效和失效时间避免规则无效或错用,提升灵活性促销活动的有效期规则
决策表管理多条件组合的业务逻辑适用于有限条件且组合较多的场景贷款审批、折扣计算
决策树逐步分层的决策结构,逐层细化条件之间有依赖、具有层次关系的复杂业务逻辑医疗诊断、分类判断
规则组将相关规则逻辑组合在一起,控制执行顺序处理多步骤业务逻辑电商促销活动的多重优惠规则
议程组和规则流避免复杂条件,使用高效的数据模型设计保证系统高效执行,避免性能瓶颈大规模规则集的场景

选择依据:

  • 当逻辑是多条件组合时,优先选择 决策表
  • 当条件有层次关系时,适用 决策树
  • 对于复杂的业务推导场景,使用 推理链 进行规则链设计。
  • 根据业务场景灵活调整 优先级生命周期

通过这些原则和策略,可以确保在编写Drools规则时,既能保证系统的灵活性,又能提升规则执行的效率和可维护性。