使用面向服務的體繫結架構(SOA)的其中一大動力在於提升企業的敏捷度,並將不可避免的改變所帶來的影響減到最小。這一般通過把經常改變和相當穩定的實現工件進行分離來完成。支援這種分離的常用方法是分解(decomposition)和封裝(encapsulation)。SOA的分解導致服務的定義代表更穩定的工件,而商務程序則代表更經常變化的工件1。在一個典型的SOA實現中,服務不會經常改變,但是非常經常地被組合和重組來構建/修改企業的解決方案。
這種分解不會直接標明商務規則的位置——整體IT實現中另一個頻繁改變組件。由於商務規則可能相當經常地改變的事實,其中一種被廣泛採用的實踐是將它們與商務程序關聯起來——更加頻繁地變化的SOA組件。這種方法的普及又得到了“許多實踐者將商務規則當作更廣義的商務程序管理(BMP)的一部分”這一事實的支援,往往把商務規則和商務程序捆綁在一起。結果,許多人把商務規則引擎和商務程序引擎當作商務程序/商務規則實現的兩種相互競爭的技術。這是由於下列幾種普遍的誤解:
商務規則和商務程序有著相同的設計模型和實現模型
商務規則和商務程序提供相同的工件,並且能以同樣的方式使用
在本文中,我們將概括商務規則和商務程序之間的相同點和不同點,並介紹關於在SOA實現中配置商務規則的一些指導方針,以及每種技術的適當用法。
商務規則
“商務規則描述在實現一個組織的目標時所應用到的操作、定義和約束。這些規則用來協助組織去更好地達成目標,在委託方和代理方內部進行更好的溝通,以及在組織和有興趣的第三方之間的更好溝通,更好地示範了法定義務的履行,操作更有效率,操作更好地自動化,在當前的實踐中更好地執行分析,等等”2。商務規則可以被看作是業務實踐的一個集合,定義實際的實現——商務邏輯。這種邏輯的實現經常可以通過使用專門的工具進行簡化——商務規則語言和商務規則引擎。
規則語言是一種特定於領域的語言,包含定義商務規則的構造。這些構造可以根據業務需求而大相徑庭。從文本描述(使用一種特定於規則的語言或者簡單英語),到決策表或者決策樹的使用,都有可能。在有些情況下,也可能以圖形的形式確定使用規則流的那些商務規則的執行順序。最後一種經常是導致商務程序和商務規則之間產生混淆的原因。雖然它們看起來類似,但是商務程序流定義的是可以跨許多不同且異構系統的服務的執行順序。另一方面,商務規則流則受限於規則執行順序的編製(orchestration)。
特定於領域的程式設計語言
“特定於領域的程式設計語言(DSL)是一種對特定的工作群組特別有用的程式設計語言。這是相對於通用程式設計語言(GPL)如C、Java、C#等等而言的3。DSL一般專門針對特定的問題領域進行量身定做。因而它能精確地捕捉領域的語義。為了進一步簡化它們的用法,DSL一般是高度聲明式的,並描述需要發生什麼,而不是如何完成(後者是語言實現者的責任)。由於這一點,DSL經常被當作(可執行檔)規範,而不是程式設計語言。
特定的DSL的主要優點在於特定於領域的抽象和符號,以及有限制(或者相當集中)的表達功能。對於應用程式的有些類而言,使得DSL比GPL更具吸引力的原因有幾個4:
更容易編程
因為它使用了一個更進階別的抽象,與問題領域密切結合,定義要實現的內容,而不是如何?,相比於GPL實現,DSL程式一般來說更加精確(由於它與領域的密切結合),並且更容易實現和理解(不僅對於開發人員,對於領域專家們也是如此)。這一般會致使縮短開發時間,減少昂貴的維護成本。此外,DSL還有進階的資料處理(debagging)支援,允許直接在領域概念層級上分析和調試代碼。
系統的重用
重用始終是改善新應用程式的實現和縮短開發週期的方法之一。雖然GPL通過使用標準的和特定於領域的庫來促進重用,但是它們的實際用法還是取決於開發人員。另一方面,DSL強制重用被DSL實現使用的庫。此外,由於DSL是為特別的問題領域而定義的,因此它們捕捉且因此重用特定的領域知識。
更容易驗證
隨著軟體工程的發展,正規的代碼驗證在成功的開發中正扮演著重要的角色。而對GPL而言,這種驗證僅僅確保代碼會執行,對於DSL而言,由於它們的簡潔和領域結盟,驗證經常可以確保代碼將產生正確的結果。
增進合作
跨組織使用相同的業務相關的語義,促進了資訊的共用,降低了商務邏輯的實際實現與業務使用者的預期之間不符的風險。
商務規則引擎支援用相應的規則語言表達的規則的評估。它們的主要功能是管理事實的集合,並評估由幾個斷言之一組成的規則群組。處理大量的事實,並且有效地評估斷言,這是規則評估的主要挑戰之一。根據商務規則定義,用商務規則語言表達,商務規則引擎一般提供一些映射機制來產生更低層級的執行代碼——一般是通用的語言類。那些類可以用作一個更大業務組件的部分實現。這種方法的一種直接的後果是,商務規則的實現生命週期與它們所屬的業務組件的生命週期緊密地結合在一起。
商務規則實現的靈活性和可修改性,通過啟用動態變化的規則維護支援而實現(使用初始的規則語言)。這種能力提供了一種動態地修改商務規則的方法,並且不用重新構建和重新部署實現來快速地適應改變了的業務環境。
聲明式的編程(例如規定什麼)代表規則的選擇模型:根據規則取值為true還是false,有些東西得以觸發(例如動作)。控制流程(例如這些調用的順序)是隱式的,並在規則引發時顯現出來。