溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java規(guī)則引擎有什么優(yōu)點

發(fā)布時間:2021-11-15 11:13:19 來源:億速云 閱讀:957 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Java規(guī)則引擎有什么優(yōu)點”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Java規(guī)則引擎有什么優(yōu)點”吧!

一、概述

1 規(guī)則引擎概念

    規(guī)則引擎是一種根據(jù)規(guī)則中包含的指定過濾條件,判斷其能否匹配運行時刻的實時條件來執(zhí)行規(guī)則中所規(guī)定的動作的引擎。

    規(guī)則引擎由推理引擎發(fā)展而來,是一種嵌入在應(yīng)用程序中的組件,實現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離出來,并使用預(yù)定義的語義模塊編寫業(yè)務(wù)決策。

    規(guī)則引擎具體執(zhí)行可以分為接受數(shù)據(jù)輸入,解釋業(yè)務(wù)規(guī)則,業(yè)務(wù)決策三個過程。

2 規(guī)則引擎優(yōu)勢:

    聲明式編程。規(guī)則引擎允許你描述做什么而不是如何去做,規(guī)則比編碼更容易閱讀。

    邏輯與數(shù)據(jù)分離。數(shù)據(jù)保存在系統(tǒng)對象中,邏輯保存在規(guī)則中。打破了面向?qū)ο笙到y(tǒng)中將數(shù)據(jù)和邏輯耦合起來的局面。由于邏輯保存在規(guī)則中,將來邏輯發(fā)生改變時更容易被維護。通過將邏輯集中在一個或數(shù)個清晰的規(guī)則文件中,取代了之前分散在代碼中的局面。

    速度及可測量性。Rete算法、Leaps算法,以及由此衍生出來的Drools的Rete、Leaps算法,提供了對系統(tǒng)數(shù)據(jù)對象非常有效率的匹配。這些算法經(jīng)過了大量實際考驗的證明。

    知識集中化。通過使用規(guī)則,將建立一個可執(zhí)行的規(guī)則庫。這意味著規(guī)則庫代表著現(xiàn)實中的業(yè)務(wù)策略的唯一對應(yīng),理想情況下可讀性高的規(guī)則還可以被當作文檔使用。

    解釋機制。通過將規(guī)則引擎的決斷與決斷的原因一起記錄下來,規(guī)則系統(tǒng)提供了很好的“解釋機制”。

    易懂的規(guī)則。通過建立對象模型以及DSL(域定義語言),可以用接近自然語言的方式來編寫規(guī)則。這讓非技術(shù)人員與領(lǐng)域?qū)<铱梢杂盟麄冏约旱倪壿媮砝斫庖?guī)則(因為程序的復(fù)雜性已經(jīng)被隱藏起來了) 。

3 規(guī)則引擎應(yīng)用場景

    相對于業(yè)務(wù)系統(tǒng),規(guī)則引擎可以認為是一個獨立于業(yè)務(wù)系統(tǒng)的模塊,負責(zé)一些規(guī)則的計算等。一般來說,規(guī)則引擎主要應(yīng)用在下面的場景中:

  • 風(fēng)控模型配置,風(fēng)控規(guī)則的設(shè)置。

  • 用戶積分等配置,如日常操作引起積分變化等。

  • 簡單的離線計算,各類數(shù)據(jù)量比較小的統(tǒng)計等。

    注意事項:規(guī)則引擎作為一個單獨模塊,有其自身的笨重與復(fù)雜,并不是所有相關(guān)業(yè)務(wù)系統(tǒng)都需要引入規(guī)則引擎。

  • 必須建立一些數(shù)據(jù)模型。

  • 考慮規(guī)則的沖突、優(yōu)先級等。

  • 控制規(guī)則的復(fù)雜度,以免給規(guī)則配置人員增加過多的學(xué)習(xí)成本。

    由此可見,對于一些時間周期短、規(guī)則復(fù)雜且不常變更的項目,規(guī)則引擎并不十分適用。

二、原理簡介

    通常情況下,Java規(guī)則引擎內(nèi)部由下面幾個部分構(gòu)成:工作內(nèi)存(Working Memory)即工作區(qū),用于存放被引擎引用的數(shù)據(jù)對象集合;規(guī)則執(zhí)行隊列,用于存放被激活的規(guī)則執(zhí)行實例;靜態(tài)規(guī)則區(qū),用于存放所有被加載的業(yè)務(wù)規(guī)則,這些規(guī)則將按照某種數(shù)據(jù)結(jié)構(gòu)組織,當工作區(qū)中的數(shù)據(jù)發(fā)生改變后,引擎需要迅速根據(jù)工作區(qū)中的對象現(xiàn)狀,調(diào)整規(guī)則執(zhí)行隊列中的規(guī)則執(zhí)行實例。Java規(guī)則引擎的結(jié)構(gòu)示意圖如圖1所示。

Java規(guī)則引擎有什么優(yōu)點

圖1 規(guī)則引擎執(zhí)行結(jié)構(gòu)圖

    當引擎執(zhí)行時,會根據(jù)規(guī)則執(zhí)行隊列中的優(yōu)先順序逐條執(zhí)行規(guī)則執(zhí)行實例,由于規(guī)則的執(zhí)行部分可能會改變工作區(qū)的數(shù)據(jù)對象,從而會使隊列中的某些規(guī)則執(zhí)行實例因為條件改變而失效,必須從隊列中撤銷,也可能會激活原來不滿足條件的規(guī)則,生成新的規(guī)則執(zhí)行實例進入隊列。于是就產(chǎn)生了一種“動態(tài)”的規(guī)則執(zhí)行鏈,形成規(guī)則的推理機制。這種規(guī)則的“鏈式”反應(yīng)完全是由工作區(qū)中的數(shù)據(jù)驅(qū)動的。

三、規(guī)則引擎選型比較

    以下項目均為開源,超鏈接中均有其github鏈接,上面有更為詳盡的使用例子。表1 為綜合對比結(jié)果。

表 1規(guī)則引擎綜合對比

 

適用場景

優(yōu)點

缺點

活躍性

綜合評估

 

Drools

決業(yè)務(wù)代碼和業(yè)務(wù)規(guī)則分離;適用于大型應(yīng)用系統(tǒng)

性能高

可整合

可維護

學(xué)習(xí)成本高

文檔

持續(xù)更新

流行

 

五星

 

MVEL

使用表達式語言定義規(guī)則

靈活,性能高,無類型限制

資料少

Github更新少

三星

Easy Rules

使用表達式語言定義規(guī)則

易學(xué),基于POJO,支持復(fù)合規(guī)則,方式多樣

Github維護者少

最新版本今年4月發(fā)布

四星

Aviator

各種表達式的動態(tài)求值

高性能;輕量級;支持多種類型

Github維護者少

資料齊,例子多

四星

3.1 Drools

    Drools是專注于解決業(yè)務(wù)代碼和業(yè)務(wù)規(guī)則分離的引擎。Drools 規(guī)則是在 Java 應(yīng)用程序上運行的,其要執(zhí)行的步驟順序由代碼確定,Drools 規(guī)則引擎將業(yè)務(wù)規(guī)則轉(zhuǎn)換成執(zhí)行樹。具體結(jié)構(gòu)見圖2。

Java規(guī)則引擎有什么優(yōu)點

圖2 Drools流程圖

    優(yōu)點:非?;钴S的社區(qū)支持;易用;快速的執(zhí)行速度;在 Java 開發(fā)人員中流行;與 Java Rule Engine API(JSR 94)兼容。

3.2 MVEL

    MVEL是一個功能強大的基于Java應(yīng)用程序的表達式語言。作為一個表達式語言,旨在更高的效率,例如:直接支持集合、數(shù)組和字符串匹配等操作以及正則表達式。 MVEL用于執(zhí)行使用Java語法編寫的表達式。

    與Java不同,MVEL是動態(tài)類型(帶有可選分類),也就是說在源文件中是沒有類型限制的。一條MVEL表達式,簡單的可以是單個標識符,復(fù)雜的則可能是一個充滿了方法調(diào)用和內(nèi)部集合創(chuàng)建的龐大的布爾表達式。

    目前最新的版本是2.0,具有以下特性:

  (1)動態(tài)JIT優(yōu)化器。當負載超過一個確保代碼產(chǎn)生的閾值時,選擇性地產(chǎn)生字節(jié)代碼,這大大減少了內(nèi)存的使用量。新的靜態(tài)類型檢查和屬性支持,允許集成類型安全表達;

    (2) 錯誤報告改善,包括行和列的錯誤信息;

    (3) 新的腳本語言特征。MVEL2.0 包含函數(shù)定義,如:閉包,lambda定義,標準循環(huán)構(gòu)造(for, while, do-while, do-until…)。;

    (4) 改進的集成功能。迎合主流的需求,MVEL2.0支持基礎(chǔ)類型的個性化屬性處理器,集成到JIT中;

    (5) 集成不良,字節(jié)碼生成編譯時間慢,還增加了可擴展性問題;不用字節(jié)碼生成運行時執(zhí)行非常慢。

3.3 Easy Rules

    Easy Rules 是一款 Java 規(guī)則引擎,easy-rules首先集成了mvel表達式,后續(xù)可能集成SpEL的一款輕量級規(guī)則引擎,Easy Rules 提供了規(guī)則抽象來創(chuàng)建帶有條件和操作的規(guī)則,以及運行一組規(guī)則來評估條件和執(zhí)行操作的RulesEngine API。

    easy rules有以下特性:輕量級框架;學(xué)習(xí)成本低;基于POJO;為定義業(yè)務(wù)引擎提供有用的抽象和簡便的應(yīng)用;從原始的規(guī)則組合成復(fù)雜的規(guī)則。它主要包括幾個主要的類或接口:Rule,RulesEngine,RuleListener,F(xiàn)acts ,以及幾個主要的注解:@Action,@Condition,@Fact,@Priority,@Rule

3.4 Aviator

    Aviator是一個高性能、輕量級的java語言實現(xiàn)的表達式求值引擎,主要用于各種表達式的動態(tài)求值。Aviator的設(shè)計目標是輕量級和高性能 ,相比于Groovy、JRuby的笨重,Aviator非常小。

    但是Aviator的語法受到限制,它不是一門完整的語言,而只是語言的一小部分集合。其次,Aviator的實現(xiàn)思路與其他輕量級的求值器很不相同,其他求值器一般都是通過解釋的方式運行,而Aviator則是直接將表達式編譯成Java字節(jié)碼,交給JVM去執(zhí)行。其主要特點如下:

(1)支持大部分運算操作符,包括算術(shù)操作符、關(guān)系運算符、邏輯操作符、正則匹配操作符(=~)、三元表達式?: ,并且支持操作符的優(yōu)先級和括號強制優(yōu)先級,具體請看后面的操作符列表;

(2)支持函數(shù)調(diào)用和自定義函數(shù);

(3)支持正則表達式匹配,類似Ruby、Perl的匹配語法,并且支持類Ruby的$digit指向匹配分組。自動類型轉(zhuǎn)換,當執(zhí)行操作的時候,會自動判斷操作數(shù)類型并做相應(yīng)轉(zhuǎn)換,無法轉(zhuǎn)換即拋異常;

(4)支持傳入變量,支持類似a.b.c的嵌套變量訪問;

(5)性能優(yōu)秀;

(6)Aviator的限制,沒有if else、do while等語句,沒有賦值語句,僅支持邏輯表達式、算術(shù)表達式、三元表達式和正則匹配,沒有位運算符。

到此,相信大家對“Java規(guī)則引擎有什么優(yōu)點”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI