加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • Part 1●?規(guī)則引擎?●
    • Part 2●??規(guī)則比較操作符?●
    • Part 3●??Drools 規(guī)則屬性 attributes?●
    • Part 4●??項(xiàng)目應(yīng)用?●
    • Part 5●??規(guī)則示例?●
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

五分鐘技術(shù)趣談 | Drools規(guī)則引擎實(shí)戰(zhàn)

2023/10/16
4006
閱讀需 12 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

作者:余賢雷 ?盧陽,單位:中國移動智慧家庭運(yùn)營中心

在機(jī)頂盒軟探針項(xiàng)目中,項(xiàng)目需要針對地域維度對機(jī)頂盒指標(biāo):播放成功率、收視用戶數(shù)、EPG請求成功率,實(shí)現(xiàn)準(zhǔn)實(shí)時的告警判定。針對告警規(guī)則的多變性,我們引入了規(guī)則引擎作為告警規(guī)則的實(shí)現(xiàn)方式。

Part 1●?規(guī)則引擎?

規(guī)則引擎:全稱為業(yè)務(wù)規(guī)則管理系統(tǒng),英文名為BRMS。規(guī)則引擎的主要思想是將應(yīng)用程序中的業(yè)務(wù)決策部分分離出來,并使用預(yù)定義的語義模塊編寫業(yè)務(wù)決策(業(yè)務(wù)規(guī)則),由用戶或 開發(fā)者在需要時進(jìn)行配置、管理。需要注意的是規(guī)則引擎并不是一個具體的技術(shù)框架,而是指的一類系統(tǒng),即業(yè)務(wù)規(guī)則管理系統(tǒng)。

java開源的規(guī)則引擎有:Drools、Easy Rules、Mandarax、IBM ILOG。使用最為廣泛并且開源的是Drools。

主要應(yīng)用場景:對于一些存在比較復(fù)雜的業(yè)務(wù)規(guī)則并且業(yè)務(wù)規(guī)則會頻繁變換的系統(tǒng)比較適合使用規(guī)則引擎,如下:

風(fēng)控決策系統(tǒng)-------風(fēng)險貸款、風(fēng)險評估

反欺詐項(xiàng)目-----銀行貸款、征信驗(yàn)證、反洗錢

實(shí)時反欺詐平臺-----手機(jī)支付、信用卡消費(fèi)

Drools規(guī)則引擎構(gòu)成

drools規(guī)則引擎由以下幾部分構(gòu)成:

Working Memory(工作內(nèi)存)

Rules(規(guī)則庫)

Inference Engine(推理引擎)

◆Pattern Match(匹配器)具體匹配那一個規(guī)則,由它來完成◆Agenda(議程)◆Execution Engine(執(zhí)行引擎)

Drools規(guī)則引擎概念

Working Memory:工作內(nèi)存,drools規(guī)則引擎會從Working Memory中獲取數(shù)據(jù)并和規(guī)則文件中定義的規(guī)則進(jìn)行模式匹配,所以我們開發(fā)的應(yīng)用程序只需要將我們的數(shù)據(jù)插入到Working Memory中即可,例如本案例中我們調(diào)用kieSession.insert(order)就是將order對象插入到了工作內(nèi)存中。

Fact:事實(shí),是指在drools 規(guī)則應(yīng)用當(dāng)中,將一個普通的JavaBean插入到Working Memory后的對象就是Fact對象,例如本案例中的Order對象就屬于Fact對象。Fact對象是我們的應(yīng)用和規(guī)則引擎進(jìn)行數(shù)據(jù)交互的橋梁或通道。

Rules:規(guī)則庫,我們在規(guī)則文件中定義的規(guī)則都會被加載到規(guī)則庫中。

Pattern Matcher:匹配器,將Rule Base中的所有規(guī)則與Working Memory中的Fact對象進(jìn)行模式匹配,匹配成功的規(guī)則將被激活并放入Agenda中。

Agenda:議程,用于存放通過匹配器進(jìn)行模式匹配后被激活的規(guī)則。

Drools 基礎(chǔ)語法

規(guī)則文件構(gòu)成

關(guān)鍵字 描述
package 包名 只限于邏輯上的管理,同一個包名下的查詢或者函數(shù)可以直接調(diào)用
import 用于導(dǎo)入類或者靜態(tài)方法
global 全局變量
function 自定義函數(shù)
query 查詢
rule end 規(guī)則體

一個規(guī)則通常包含三個部分:屬性部分(attribute)、條件部分(LHS)和結(jié)果部分(RHS)

語法結(jié)構(gòu)體

rule "ruleName"    attributes    when        LHS    then        RHSend

rule:關(guān)鍵字,表示規(guī)則開始,參數(shù)為規(guī)則的唯一名稱。

attributes:規(guī)則屬性,是rule與when之間的參數(shù),為可選項(xiàng)。

when:關(guān)鍵字,后面跟規(guī)則的條件部分。

LHS(Left Hand Side):是規(guī)則的條件部分的通用名稱。它由零個或多個條件元素組成。如果LHS為空,則它將被視為始終為true的條件元素。

then:關(guān)鍵字,后面跟規(guī)則的結(jié)果部分。

RHS(Right Hand Side):是規(guī)則的后果或行動部分的通用名稱。

end:關(guān)鍵字,表示一個規(guī)則結(jié)束。

Part 2●??規(guī)則比較操作符?

符號 說明
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
contains 檢查一個Fact對象的某個屬性值是否包含一個指定的對象值
not contains 檢查一個Fact對象的某個屬性值是否不包含一個指定的對象值
memberOf 判斷一個Fact對象的某個屬性是否在一個或多個集合中
not memberOf 判斷一個Fact對象的某個屬性是否不在一個或多個集合中
matches 判斷一個Fact對象的屬性是否與提供的標(biāo)準(zhǔn)的Java正則表達(dá)式進(jìn)行匹配
not matches 判斷一個Fact對象的屬性是否不與提供的標(biāo)準(zhǔn)的Java正則表達(dá)式進(jìn)行匹配

Part 3●??Drools 規(guī)則屬性 attributes?

Drools中提供的屬性如下表(部分屬性)

屬性名 說明
salience 指定規(guī)則執(zhí)行優(yōu)先級
dialect 指定規(guī)則使用的語言類型,取值為java和mvel
enabled 指定規(guī)則是否啟用
date-effective 指定規(guī)則生效時間
date-expires 指定規(guī)則失效時間
activation-group 激活分組,具有相同分組名稱的規(guī)則只能有一個規(guī)則觸發(fā)
agenda-group 議程分組,只有獲取焦點(diǎn)的組中的規(guī)則才有可能觸發(fā)
timer 定時器,指定規(guī)則觸發(fā)的時間
auto-focus 自動獲取焦點(diǎn),一般結(jié)合agenda-group一起使用
no-loop 防止死循環(huán),防止自己更新規(guī)則再次觸發(fā)
lock-on-active no-loop增強(qiáng)版本??煞乐箘e人更新規(guī)則再次出發(fā)

Part 4●??項(xiàng)目應(yīng)用?

省機(jī)頂盒軟探針平臺為實(shí)現(xiàn)機(jī)頂盒用戶視頻使用質(zhì)量的實(shí)時監(jiān)控,采用實(shí)時大數(shù)據(jù)進(jìn)行準(zhǔn)實(shí)時的指標(biāo)統(tǒng)計(jì),指標(biāo)結(jié)果推送kafka,由平臺新增的告警引擎實(shí)時消費(fèi)kafka數(shù)據(jù)并通過預(yù)定制的專家規(guī)則實(shí)現(xiàn)實(shí)時的告警判定,最終告警結(jié)果實(shí)時通知反饋到告警平臺,實(shí)現(xiàn)告警到告警恢復(fù)的生命周期。

Part 5●??規(guī)則示例?

rule "播放成功率告警"no-loop truewhen    $fact:Fact()    eval($fact.getPlay() > 0.0)    eval($fact.getPlay() < MapUtils.getDoubleValue($fact, "playThreshold", 0.96))then    RuleResult fr = new RuleResult("播放成功率告警");    fr.setRuleCode(900001);    fr.setActualTime(MapUtils.getString($fact, "actualTime"));    fr.setAlarmTime(RuleUtil.getAlarmTime(MapUtils.getString($fact, "actualTime"), MapUtils.getString($fact, "900001")));    //說明當(dāng)前是要告警的    fr.setAlarmStatus("1");    fr.setAlarmTitle("指標(biāo)播放成功率異常");    fr.setLocateInfo("指標(biāo)播放成功率異常");    fr.setAlarmText(RuleUtil.playAlarmText($fact, MapUtils.getDoubleValue($fact, "playThreshold", 0.96)));    insert(fr);end

rule "播放成功率告警結(jié)束"no-loop truewhen    $fact:Fact()    eval($fact.getPlay() >= MapUtils.getDoubleValue($fact, "playThreshold", 0.96))    eval(MapUtils.getLongValue($fact, "900001") > 0)    eval(RuleUtil.checkAlarmTime($fact.getActualTime(), MapUtils.getLongValue($fact, "900001_time"), MapUtils.getLongValue($fact, "reThreshold", 900000)))then    RuleResult fr = new RuleResult("播放成功率告警恢復(fù)");    fr.setRuleCode(900001);    fr.setActualTime(MapUtils.getString($fact, "actualTime"));    fr.setAlarmTime(MapUtils.getString($fact, "900001"));    fr.setAlarmStatus("0");    fr.setMsg("告警恢復(fù)");    fr.setAlarmTitle("指標(biāo)播放成功率異常");    fr.setLocateInfo("指標(biāo)播放成功率異常");logger.info("播放告警恢復(fù)了{(lán)}", $fact);insert(fr);

 

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
KSZ8863FLL 1 Microchip Technology Inc DATACOM, LAN SWITCHING CIRCUIT, PQFP48
$5.57 查看
KSZ8863MLL 1 Microchip Technology Inc DATACOM, LAN SWITCHING CIRCUIT, PQFP48

ECAD模型

下載ECAD模型
$4.59 查看
KSZ9477STXI 1 Microchip Technology Inc IC ETHERNET SWITCH 7PORT 128TQFP

ECAD模型

下載ECAD模型
$18.04 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

移動Labs是中國移動的社交化新媒體平臺,是面向外部行業(yè)及產(chǎn)業(yè)鏈合作伙伴的信息發(fā)布、業(yè)務(wù)發(fā)展和產(chǎn)業(yè)推進(jìn)門戶。