何仁杰 梁冰
業(yè)務規(guī)則管理系統(tǒng)的基本原理是:用一個或多個規(guī)則引擎替換以程序代碼“固化”在應用系統(tǒng)中的業(yè)務邏輯。一個完善的BRMS可以對業(yè)務規(guī)則的整個生命周期實現(xiàn)全程管理。

業(yè)務規(guī)則的全生命周期管理如圖1所示。BRMS在應用系統(tǒng)中的地位與數(shù)據(jù)庫管理系統(tǒng)(DBMS)類似,處于比較基礎的位置,是其他高端應用的基石。圖2是GIGA Information Group 給出的IT架構中BRMS的位置圖。

業(yè)務規(guī)則管理如何實現(xiàn)?
業(yè)務規(guī)則
一個業(yè)務規(guī)則包含一組條件和在此條件下執(zhí)行的操作,它們表示業(yè)務規(guī)則應用程序的一段業(yè)務邏輯。業(yè)務規(guī)則通常應該由業(yè)務分析人員和策略管理者開發(fā)和修改,但有些復雜的業(yè)務規(guī)則也可以由技術人員使用面向對象的技術語言或腳本來定制。業(yè)務規(guī)則的理論基礎是:設置一個或多個條件,當滿足這些條件時會觸發(fā)一個或多個操作。
規(guī)則引擎
這是一種嵌入在應用程序中的組件,它的任務是把當前提交給引擎的數(shù)據(jù)對象與加載在引擎中的業(yè)務規(guī)則進行測試和比對,激活那些符合當前數(shù)據(jù)狀態(tài)下的業(yè)務規(guī)則,根據(jù)業(yè)務規(guī)則中聲明的執(zhí)行邏輯,觸發(fā)應用程序中對應的操作。
目前主流的規(guī)則引擎組件多是基于Java和C++程序語言環(huán)境。在2000年11月,Java Community Process(簡稱JCP) 組織開始著手起草Java規(guī)則引擎的API標準,即JSR 94 規(guī)范。參與JSR 94起草的有BEA、IBM、ILOG、甲骨文、Novell、ATG、Unisys、Fujitsu等著名的軟件企業(yè)。JSR 94 在2003年11月25日正式定稿,支持JSR 94標準的規(guī)則引擎也幾乎同時推向市場,包括ILOG 的JRules和Blaze的Advisor。
規(guī)則引擎的使用方式
由于規(guī)則引擎是軟件組件,所以只有開發(fā)人員才能夠通過程序接口的方式來使用和控制它,規(guī)則引擎的程序接口至少包含以下幾種API:加載和卸載規(guī)則集的API;數(shù)據(jù)操作的API;引擎執(zhí)行的API。開發(fā)人員在程序中使用規(guī)則引擎基本遵循以下5個典型的步驟:創(chuàng)建規(guī)則引擎對象;向引擎中加載規(guī)則集或更換規(guī)則集;向引擎提交需要被規(guī)則集處理的數(shù)據(jù)對象集合;命令引擎執(zhí)行;導出引擎執(zhí)行結果,從引擎中撤出處理過的數(shù)據(jù)。使用了規(guī)則引擎之后,許多涉及業(yè)務邏輯的程序代碼基本被這五個典型步驟所取代。
一個開放的業(yè)務規(guī)則引擎應該可以“嵌入”在應用程序的任何位置,不同位置的規(guī)則引擎可以使用不同的規(guī)則集,用于處理不同的數(shù)據(jù)對象。此外,對使用引擎的數(shù)量沒有限制。
規(guī)則引擎的內部實現(xiàn)
規(guī)則引擎的基本機制是:對提交給引擎的數(shù)據(jù)對象進行檢索,根據(jù)這些對象的當前屬性值和它們之間的關系,從加載到引擎的規(guī)則集中發(fā)現(xiàn)符合條件的規(guī)則,創(chuàng)建這些規(guī)則的執(zhí)行實例。這些實例將在引擎接到執(zhí)行指令時、依照某種優(yōu)先序依次執(zhí)行。一般,規(guī)則引擎內部由下面幾個部分構成:工作內存,用于存放被引擎引用的數(shù)據(jù)對象集合;規(guī)則執(zhí)行隊列,用于存放被激活的規(guī)則執(zhí)行實例;靜態(tài)規(guī)則區(qū),用于存放所有被加載的業(yè)務規(guī)則,這些規(guī)則將按照某種數(shù)據(jù)結構組織,當工作區(qū)中的數(shù)據(jù)發(fā)生改變后,引擎需要迅速根據(jù)工作區(qū)中的對象現(xiàn)狀,調整規(guī)則執(zhí)行隊列中的規(guī)則執(zhí)行實例。規(guī)則引擎的結構示意圖如圖3所示。

任何一個規(guī)則引擎都需要很好地解決規(guī)則的推理機制和規(guī)則條件匹配的效率問題。
當引擎執(zhí)行時,會根據(jù)規(guī)則執(zhí)行隊列中的優(yōu)先順序逐條執(zhí)行規(guī)則執(zhí)行實例,由于規(guī)則的執(zhí)行部分可能會改變工作區(qū)的數(shù)據(jù)對象,從而會使隊列中的某些規(guī)則執(zhí)行實例因為條件改變而失效,必須從隊列中撤銷,也可能會激活原來不滿足條件的規(guī)則,生成新的規(guī)則執(zhí)行實例進入隊列。于是就產生了一種“動態(tài)”的規(guī)則執(zhí)行鏈,形成規(guī)則的推理機制。這種規(guī)則的“鏈式”反應完全是由工作區(qū)中的數(shù)據(jù)驅動的。
規(guī)則條件匹配的效率決定了引擎的性能,引擎需要迅速測試工作區(qū)中的數(shù)據(jù)對象,從加載的規(guī)則集中發(fā)現(xiàn)符合條件的規(guī)則,生成規(guī)則執(zhí)行實例。1982年美國卡耐基·梅隆大學的Charles L. Forgy發(fā)明了一種叫Rete算法,很好地解決了這方面的問題。目前世界頂尖的商用業(yè)務規(guī)則引擎產品基本上都使用Rete算法。
BOM賦予規(guī)則行業(yè)特性
業(yè)務規(guī)則一定是針對某種業(yè)務的,不同的業(yè)務有自己特有的業(yè)務模型——業(yè)務對象模型(Business Object Mode,簡稱BOM)。BOM為業(yè)務規(guī)則語言提供了絕大多數(shù)的詞匯,多由業(yè)務系統(tǒng)分析員設計,由開發(fā)人員具體實現(xiàn)。從面向對象的編程角度來看,BOM就是一個簡化的類圖,類圖中有類名、類的屬性、類的方法等。這些要素都將是業(yè)務規(guī)則語言中的基本“詞匯”。BOM的來源可以是Java對象模型、C++對象模型、XML Schema、Web服務定義等。
假定我們有一個簡單的寵物商店購物車應用程序,在這個應用程序中,顧客能夠在購物車中放入各種寵物和相關物品對象。這個應用程序的業(yè)務對象集合就可以有ShoppingCart(購物車)、Customer(用戶)、Item (條目)和ItemType(條目類型)這幾個類。
表述業(yè)務規(guī)則的語法就是業(yè)務規(guī)則語言。由于規(guī)則語言的使用者主要有兩類:業(yè)務人員和技術人員,所以規(guī)則語言一般也分為兩類:“面向程序技術”的規(guī)則語言,它技術性很強,可讀性較弱,比較適合IT 技術人員使用,一般每個規(guī)則引擎開發(fā)商都有自己的一套“面向程序技術”的規(guī)則語言語法,不過OASIS組織定義了不同應用情況下的規(guī)則語言規(guī)范,包括SRML(Simple Rule Markup Language),BMRL(Business Markup Rule Language)和RuleML(Rule Markup Language)等;“面向業(yè)務”的規(guī)則語言,它是業(yè)務人員使用的語言,必須具備非技術性和可定制性,通常它需要經過“翻譯”之后才能被規(guī)則引擎解析。BRMS必須提供這種“翻譯”機制,而開發(fā)人員要實現(xiàn)從“面向業(yè)務”規(guī)則語言到“面向程序”規(guī)則語言的映射。
“面向業(yè)務”的規(guī)則語言無論從語法上還是語句結構上都可能千變萬化,不同行業(yè)可能有自己的“行話”。一個好的BRMS應該提供一個完善的規(guī)則語言框架,能夠迅速地為業(yè)務人員定制不同的“行話”,否則業(yè)務人員還是無法真正成為業(yè)務規(guī)則的主人。
“單純”的規(guī)則如何互連?
業(yè)務規(guī)則有一個非常明顯的特性:單純性。每個業(yè)務規(guī)則只描述自己特有的條件和滿足條件的操作,業(yè)務規(guī)則本身并不關心它與其他規(guī)則的關系,如優(yōu)先關系、互斥關系、包含關系等。每個業(yè)務規(guī)則本身可以有自己的屬性,稱元信息,可以用來處理規(guī)則之間相關性,例如引擎可以使用規(guī)則的優(yōu)先級來依序執(zhí)行規(guī)則的操作。
有些BRMS還提供一種稱為“規(guī)則流”的定制功能。規(guī)則流是一個圖表,定義了解決問題或執(zhí)行業(yè)務流程的順序。類似于統(tǒng)一建模語言(UML)的活動圖,由一組任務以及定義這些任務之間執(zhí)行順序的轉換邏輯組成。一個轉換由條件控制,只有當該限制條件為“真”時才能完成這種轉換。
這些任務可以是規(guī)則任務、函數(shù)任務或子規(guī)則流任務。規(guī)則任務包含一組要作為任務主體執(zhí)行的規(guī)則,規(guī)則的執(zhí)行邏輯由用戶設置的任務屬性嚴格控制。這些屬性決定規(guī)則的排序、規(guī)則觸發(fā)策略、執(zhí)行算法等;函數(shù)任務包含要作為任務主體執(zhí)行的腳本代碼;子規(guī)則流任務則包含任務開始后將依次執(zhí)行的子規(guī)則流。
為了方便開發(fā)人員和業(yè)務人員管理業(yè)務規(guī)則,BRMS必須提供具有直觀用戶界面的工具來實現(xiàn)業(yè)務規(guī)則管理。規(guī)則管理工具至少應該具備以下功能:規(guī)則的定制和編輯、規(guī)則流的定制、決策表形式的規(guī)則定制、規(guī)則的查詢、規(guī)則有效期限的控制、規(guī)則的組織結構、規(guī)則模板的定制、規(guī)則庫訪問權限的控制、規(guī)則變更歷史的記錄、規(guī)則文檔的管理等。
·小資料2·
業(yè)務規(guī)則管理系統(tǒng)其實是一組工具集,它包括:規(guī)則引擎、規(guī)則庫、規(guī)則語言框架、規(guī)則管理集成開發(fā)環(huán)境。業(yè)務規(guī)則管理系統(tǒng)的基本工作原理如圖所示。
規(guī)則引擎(Rules Engine)

是執(zhí)行業(yè)務規(guī)則的軟件組件,它嵌入在程序中,是業(yè)務規(guī)則管理系統(tǒng)的核心元素。規(guī)則引擎的類型有:簡單型、數(shù)據(jù)中心型和面向事務型。
規(guī)則庫(Rules Repository)及其服務機制
用于存儲規(guī)則和規(guī)則元數(shù)據(jù)(Meta Data)以及與規(guī)則有關的屬性。它提供一組工具用于存儲、分類、查詢、版本控制、權限控制、測試、提交等,規(guī)則的狀態(tài)和有效性可以跟蹤。規(guī)則庫可以依托文件系統(tǒng)或數(shù)據(jù)庫管理系統(tǒng)。
規(guī)則語言框架(Rules Language Framework)
規(guī)則語言一般分為兩類:“面向程序技術”的規(guī)則語言,使用者是技術人員;“面向業(yè)務”的規(guī)則語言,使用者是業(yè)務人員。規(guī)則語言框架則為定制“面向業(yè)務”的規(guī)則語言提供支持。
規(guī)則管理工具(Rules Management Tool)
用于管理、創(chuàng)建、修改和部署業(yè)務規(guī)則的圖形化工具,易用性強,除了開發(fā)人員外,業(yè)務人員也可以使用這套圖形化工具實現(xiàn)對規(guī)則的管理。
規(guī)則集成開發(fā)環(huán)境(Rules IDE)
一般規(guī)則集成開發(fā)環(huán)境只有規(guī)則編輯器,而高級的規(guī)則集成開發(fā)環(huán)境可以實現(xiàn)對規(guī)則和規(guī)則庫的管理:如規(guī)則的創(chuàng)建、分類、檢索、修改、版本控制、權限管理等;甚至可以實現(xiàn)對多個規(guī)則引擎的“在線”調試;對規(guī)則集合進行沖突檢查等。
一個完整的BRMS應該提供規(guī)則管理(Rules Management)、規(guī)則部署(ules Deployment)、規(guī)則分析(Rules Analysis)、規(guī)則定制和設計(Rules Design and Authoring)等功能。
(計算機世界報 第14期 B6、B7)
posted on 2006-03-26 19:11
哈哈的日子 閱讀(1382)
評論(0) 編輯 收藏 所屬分類:
規(guī)則引擎