国产真人无码作爱视频电影|伊人久久五月丁香综合中文亚洲|久久久99精品免费观看|無碼精品A∨在線觀看中文

行業(yè)動(dòng)態(tài)

.Net Core 環(huán)境下構建強大且易用的規則引擎

2018-06-11 08:43:00 小沐管家 0

1. 引言

1.1 為什么需要規則引擎

在業(yè)務(wù)的早期時(shí)代,也許使用硬編碼或者邏輯判斷就可以滿(mǎn)足要求。但隨著(zhù)業(yè)務(wù)的發(fā)展,越來(lái)越多的問(wèn)題會(huì )暴露出來(lái):

  • 邏輯復雜度帶來(lái)的編碼挑戰,需求變更時(shí)改變邏輯可能會(huì )引起災難

  • 重復性的需求必須可重用,否則必須重復性編碼

  • 運行期間無(wú)法即時(shí)修改規則,但重新部署可能會(huì )帶來(lái)其他問(wèn)題

  • 上線(xiàn)前的測試變得繁瑣且不可控,必須花大量的人力和時(shí)間去測試

這些困境在『 小明歷險記:規則引擎 drools 教程一』 一文中可以體會(huì )一番,一開(kāi)始只是簡(jiǎn)單的根據購物金額來(lái)發(fā)放積分,運行期間又要更改為更多的規則層次,如果不及時(shí)引入對應的規范化處理機制,開(kāi)發(fā)人員將慢慢墜入無(wú)止盡的業(yè)務(wù)深淵。對此,聰明的做法是在系統中引入規則引擎,對業(yè)務(wù)操作員要提供盡量簡(jiǎn)單的操作頁(yè)面來(lái)配置規則,規則引擎和配置盡量不要耦合到一塊。

1.2 .Net Core 環(huán)境下的選擇 -- Nrules

目前最流行的規則引擎應該是Drools, 用 Java 語(yǔ)言編寫(xiě)的開(kāi)放源碼規則引擎,使用 Rete 算法對所編寫(xiě)的規則求值,其操作流程如下:

沐歌環(huán)保

對于 .Net 應用來(lái)說(shuō),可以通過(guò) Kie 組件提供的 Rest 接口調用規則引擎運算。然而其過(guò)于龐大,僅僅只是需要規則引擎計算核心的部分。對此,查找了 .Net 中開(kāi)源的規則引擎,發(fā)現只有同樣實(shí)現 Rete 算法的 Nrules 滿(mǎn)足要求(支持 .Net Core,運行時(shí)加載規則引擎)。

注:本文參考借鑒了美團技術(shù)團隊 從 0 到 1:構建強大且易用的規則引擎 一文的設計思路,對 Drools 從入門(mén)到放棄。

2. Nrules 實(shí)戰 -- 電商促銷(xiāo)活動(dòng)規則引擎設計

2.1 了解 Nrules

NRules 是基于 Rete 匹配算法的.NET 生產(chǎn)規則引擎,基于.NET Standard ,支持 4.5+ 的應用,提供 流式聲明規則、運行時(shí)構建規則、專(zhuān)門(mén)的規則語(yǔ)言(開(kāi)發(fā)中,不推薦使用到生產(chǎn),基于.Net 4.5 而不是 .NETStandard )。
其計算機制也與其他規則引擎大同小異:
沐歌環(huán)保

2.2 設計規則配置

前文提到 對業(yè)務(wù)操作員要提供盡量簡(jiǎn)單的操作頁(yè)面來(lái)配置規則 ,所以我們定義促銷(xiāo)活動(dòng)的規則配置就要盡量簡(jiǎn)單。

沐歌環(huán)保

在設計模型時(shí),我們必須先參考現實(shí)生活中遇到的電商促銷(xiāo)活動(dòng),大致可以想到有這么幾種活動(dòng)類(lèi)型:滿(mǎn)減促銷(xiāo)、單品促銷(xiāo)、套裝促銷(xiāo)、贈品促銷(xiāo)、滿(mǎn)贈促銷(xiāo)、多買(mǎi)優(yōu)惠促銷(xiāo)、定金促銷(xiāo)等。
在這里,我選擇對多買(mǎi)優(yōu)惠促銷(xiāo)做分析,多買(mǎi)促銷(xiāo)優(yōu)惠即所謂的階梯打折,如買(mǎi)一件9折,買(mǎi)兩件8折,其模型大致如下:

沐歌環(huán)保

這里為了簡(jiǎn)化設計,設計的模型并不會(huì )去約束平臺、活動(dòng)范圍、會(huì )員等級等,僅僅約束了使用的產(chǎn)品 id 范圍。為了匹配現實(shí)中可能出現的組合優(yōu)惠(類(lèi)似滿(mǎn)減活動(dòng)后還可以使用優(yōu)惠券等)現象和相反的獨斥現象(如該商品參與xx活動(dòng)后不支持X券),設置了一個(gè)字段來(lái)判斷是否可以組合優(yōu)惠,也可以理解為所有活動(dòng)都為組合優(yōu)惠,只是有些組合優(yōu)惠只有一個(gè)促銷(xiāo)活動(dòng)。

注:想了解更多關(guān)于電商促銷(xiāo)系統設計可參考腦圖

2.3 規則配置轉換

為了實(shí)現 規則引擎和配置盡量不要耦合到一塊,必須有中間層對規則配置進(jìn)行轉換為 Nrules 能夠接受的規則描述。聯(lián)系前文的計算機制,我們可以得到這樣一個(gè)描述模型:

沐歌環(huán)保

由于 Nrules 支持流式聲明,所以約束條件和產(chǎn)生的結果都可以用 LambdaExpression 表達式實(shí)現?,F在我們需要把階梯打折的配置轉換成規則描述,那我們需要先分析一下。假設滿(mǎn)一件9折,滿(mǎn)兩件8折,滿(mǎn)三件7折,那我們可以將其分解為:

  • 大于等于三件打 7 折

  • 大于等于兩件且小于三件打 8 折

  • 大于等于一件且小于兩件 9 折

基于此分析,我們可以看出,只有第一個(gè)最多的數量規則是不一樣的,其他規則都是比前一個(gè)規則的數量小且大于等于當前規則的數量,那么我們可以這樣轉換我們的規則配置:

沐歌環(huán)保

2.4 生成規則集合

在 Nrules 的 wiki 中,為了實(shí)現運行時(shí)加載規則引擎,我們需要引入實(shí)現 IRuleRepository ,所以我們需要將描述模型轉換成 Nrules 中的 RuleSet:

沐歌環(huán)保

2.5 執行規則引擎

做了轉換處理僅僅是第一步,我們還必須創(chuàng )建一個(gè)規則引擎的處理會(huì )話(huà),并把相關(guān)的事實(shí)對象(fact)傳遞到會(huì )話(huà),執行觸發(fā)的代碼,相關(guān)對象發(fā)生了變化,其簡(jiǎn)單代碼如下:

沐歌環(huán)保

2.6 應用場(chǎng)景示例

我們假設有這么一個(gè)應用入口:傳入一個(gè)購物車(chē)(這里等價(jià)于訂單)id,獲取其可以參加的促銷(xiāo)活動(dòng),返回對應活動(dòng)優(yōu)惠后的結果,并按總價(jià)的最低依次升序,那么可以這么寫(xiě):

沐歌環(huán)保

假設這么一個(gè)購物車(chē)id,買(mǎi)一件時(shí)最優(yōu)惠是參加 A 活動(dòng),買(mǎi)兩件時(shí)最優(yōu)惠是參加 B 和 C 活動(dòng),那么其效果圖可能如下:

沐歌環(huán)保

3. 結語(yǔ)

本文只是對規則引擎及 Nrules 的簡(jiǎn)單介紹及應用,過(guò)程中隱藏了很多細節。在體會(huì )到規則引擎的強大的同時(shí),還必須指出其局限性,規則引擎同樣不是銀彈,必須結合實(shí)際出發(fā)。

擴展閱讀:Martin Fowler:應該使用規則引擎嗎?

原文地址: https://www.cnblogs.com/chenug/p/9160397.html


?