日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
規(guī)則引擎技術(shù)在轉(zhuǎn)轉(zhuǎn)錢包的實(shí)踐

1.什么是規(guī)則引擎和命令式編程

讓我們先來(lái)看一個(gè)有趣的猜數(shù)字小游戲:玩家需要猜測(cè)一個(gè)1到100之間的隨機(jī)數(shù)字。每次猜測(cè)后,系統(tǒng)會(huì)提示玩家所猜的數(shù)字是大于還是小于隨機(jī)數(shù),玩家需要根據(jù)提示繼續(xù)猜測(cè),直到猜中為止。

// 生成一個(gè)1到100之間的隨機(jī)整數(shù)
secret = random(1, 100)
// 初始化猜測(cè)次數(shù)為0
guesses = 0
// 循環(huán)猜數(shù)字
while true do
// 讀取用戶輸入的整數(shù)
guess = input("Guess a number between 1 and 100: ")
guesses = guesses + 1
// 判斷猜測(cè)結(jié)果
if guess < secret then
    print("Too low, try again.")
  else if guess > secret then
    print("Too high, try again.")
  else
    print("you guessed it in", guesses, "guesses!")
    break
  end if
end while

使用while循環(huán)來(lái)保持程序持續(xù)運(yùn)行,用以判斷數(shù)字大小并記錄猜測(cè)次數(shù)。這是我們常采用的命令式編程方式:明確地指定每個(gè)步驟的執(zhí)行順序和詳細(xì)的操作細(xì)節(jié),例如變量的賦值、條件判斷、循環(huán)控制等。

再來(lái)看下規(guī)則引擎編程方式:

// 定義規(guī)則1
rule "Guess a number"
when
  $guess: Integer()
  $secret: Integer(intValue > $guess) 
  then
  System.out.println("Too low, try again.");
end
 //定義規(guī)則2
rule "Guess a number"
when
  $guess: Integer()
  $secret: Integer(intValue < $guess) 
  then
  System.out.println("Too high, try again.");
end
 //定義規(guī)則3
rule "Guess a number"
when
  $guess: Integer()
  $secret: Integer(intValue == $guess)
then
  System.out.println("you guessed it!");
end

上述代碼定義了3條規(guī)則,每條規(guī)則都包含執(zhí)行條件(when語(yǔ)句)和動(dòng)作(then語(yǔ)句)。其中,規(guī)則1指定:當(dāng)輸入的數(shù)字小于initValue時(shí),應(yīng)打印 “Too low, try again.”。規(guī)則引擎編程方式是:將具體的代碼邏輯抽象為對(duì)應(yīng)的業(yè)務(wù)規(guī)則,并通過(guò)這些規(guī)則的定義和執(zhí)行來(lái)實(shí)現(xiàn)。

規(guī)則引擎編程價(jià)值

當(dāng)我們能夠?qū)I(yè)務(wù)邏輯代碼抽象為相應(yīng)的業(yè)務(wù)規(guī)則時(shí),業(yè)務(wù)人員就可以通過(guò)修改規(guī)則的條件和動(dòng)作來(lái)快速迭代業(yè)務(wù)邏輯。這正是規(guī)則引擎的第一個(gè)價(jià)值:業(yè)務(wù)具有高度的可擴(kuò)展性。

規(guī)則引擎的另一個(gè)價(jià)值是:項(xiàng)目具有高度的可維護(hù)性。與上述命令式編程方式實(shí)現(xiàn)的小游戲代碼相比,多個(gè)if-else語(yǔ)句不僅增加了代碼的復(fù)雜度和維護(hù)成本,還易導(dǎo)致代碼的可讀性和可維護(hù)性降低。而規(guī)則引擎方式使業(yè)務(wù)流程更加清晰和直觀,降低應(yīng)用程序的耦合度,并在一定程度上實(shí)現(xiàn)業(yè)務(wù)與技術(shù)的分離。

總之,規(guī)則引擎是一種更高級(jí)的條件判斷手段。它通過(guò)規(guī)則的方式來(lái)決定行為,使用簡(jiǎn)單的規(guī)則語(yǔ)言來(lái)表達(dá)復(fù)雜的業(yè)務(wù)邏輯,并具有更好的業(yè)務(wù)可擴(kuò)展性和項(xiàng)目可維護(hù)性。

2.規(guī)則引擎在轉(zhuǎn)轉(zhuǎn)錢包的應(yīng)用

轉(zhuǎn)轉(zhuǎn)錢包是一個(gè)有溫度的金融錢包。在這里,可以參與免息分期購(gòu)物活動(dòng),使用安全快捷的小額借貸服務(wù),甚至可以1元租用高端手機(jī)。歡迎大家來(lái)體驗(yàn)和使用。

轉(zhuǎn)轉(zhuǎn)錢包

在最近對(duì)“我的錢包”進(jìn)行的改版中,業(yè)務(wù)同學(xué)提出需求:根據(jù)各個(gè)用戶當(dāng)前的業(yè)務(wù)狀態(tài)展示相應(yīng)的分期、借錢以及租賃的卡片內(nèi)容和頁(yè)面跳轉(zhuǎn)路徑。

如上圖所示的需求中,借錢卡片包含7種場(chǎng)景,分期卡片包含5種場(chǎng)景,手機(jī)租賃包含3種場(chǎng)景。如果按照常規(guī)的命令式編程方式:

  1. 代碼中將包含大量的if-else語(yǔ)句,可維護(hù)性會(huì)變差
  2. 一旦業(yè)務(wù)方想要調(diào)整某狀態(tài)下的交互行為,需要修改代碼并重新發(fā)版

規(guī)則引擎在執(zhí)行前,需要計(jì)算所有用戶的業(yè)務(wù)狀態(tài),而在某些場(chǎng)景下,命令式編程可能無(wú)需計(jì)算所有業(yè)務(wù)狀態(tài)就可以得出結(jié)果,這可以在一定程度上提高性能。在權(quán)衡利弊后,我們決定在轉(zhuǎn)轉(zhuǎn)錢包中采用規(guī)則引擎,因?yàn)槠鋬?yōu)點(diǎn)遠(yuǎn)大于缺點(diǎn)。

規(guī)則建模

在使用規(guī)則引擎之前,有一個(gè)關(guān)鍵點(diǎn)需要充分考量:是否可以構(gòu)建一個(gè)良好的規(guī)則模型。一個(gè)好的規(guī)則模型可以使規(guī)則系統(tǒng)更易于理解、維護(hù)和擴(kuò)展。比如上文提到的借錢卡片狀態(tài),我們可以抽象出以下規(guī)則:賬戶是否停用、是否新戶、是否可以申請(qǐng)貸款、是否有額度。找到這些規(guī)則條件后,我們可以反過(guò)來(lái)檢查這些規(guī)則是否可以覆蓋所有的狀態(tài)描述,以避免業(yè)務(wù)場(chǎng)景有遺漏。簡(jiǎn)言之,我們要找出業(yè)務(wù)邏輯中共性的規(guī)則條件,然后使用這些條件來(lái)倒推校驗(yàn)業(yè)務(wù)邏輯的完整性。

選擇引擎組件

你可以自己構(gòu)建一個(gè)簡(jiǎn)單的規(guī)則引擎。只需要?jiǎng)?chuàng)建一組帶有條件和操作的對(duì)象,將它們存儲(chǔ)在合適的集合中,然后遍歷這些對(duì)象來(lái)評(píng)估條件和執(zhí)行操作。當(dāng)然,我們沒(méi)有必要重新造輪子,市面上已經(jīng)有幾個(gè)常用的規(guī)則引擎組件,例如:drools、easy-rules、aviator和liteFlow等。大家可以根據(jù)自己的業(yè)務(wù)場(chǎng)景選擇合適的組件。轉(zhuǎn)轉(zhuǎn)錢包選擇了easy-rules,因?yàn)樵跐M足業(yè)務(wù)需求的基礎(chǔ)上,它短小強(qiáng)悍。

整體設(shè)計(jì)

如下圖所示,我們將規(guī)則配置在Apollo中以實(shí)現(xiàn)動(dòng)態(tài)調(diào)整。高效地計(jì)算每個(gè)用戶的分期、借錢和租賃狀態(tài),再將規(guī)則集和相關(guān)事實(shí)輸入到規(guī)則引擎中,最后得到各卡片的結(jié)果狀態(tài)。在此過(guò)程中,可能會(huì)有以下疑問(wèn):該規(guī)則引擎的執(zhí)行效率如何?它又是如何評(píng)估規(guī)則的?帶著這些疑問(wèn),讓我們來(lái)看看規(guī)則引擎的源碼實(shí)現(xiàn)。

3.EasyRules性能分析

本節(jié)將通過(guò)閱讀easy-rules規(guī)則引擎中與規(guī)則評(píng)估和執(zhí)行相關(guān)的源碼,來(lái)了解其效率水平

支持MVEL和Spel表達(dá)式

規(guī)則評(píng)估

通過(guò)查看org.jeasy.rules.core.DefaultRulesEngine#fire方法,我們進(jìn)入到doFire() 方法里

void doFire(Rules rules, Facts facts) {
  for (Rule rule : rules) {   //遍歷規(guī)則
    boolean evaluationResult = false;
    evaluationResult = rule.evaluate(facts); //評(píng)估規(guī)則條件是否成立
    if (evaluationResult) {
        rule.execute(facts);  //如果成立,執(zhí)行規(guī)則的動(dòng)作
            }
        }
    }

上面代碼只保留了主要邏輯,規(guī)則評(píng)估通過(guò)for循環(huán)遍歷規(guī)則集,逐一評(píng)估每個(gè)規(guī)則的條件是否滿足,如果條件滿足則執(zhí)行相應(yīng)的動(dòng)作。但是,如果您的規(guī)則量非常大,此規(guī)則引擎組件可能不是最佳選擇。這時(shí)可以考慮使用高效的Rete規(guī)則匹配算法。Rete算法巧妙地利用了規(guī)則之間的關(guān)聯(lián)關(guān)系,構(gòu)建一個(gè)高效的規(guī)則匹配網(wǎng)絡(luò)。當(dāng)有新事實(shí)進(jìn)入時(shí),它可以高效地匹配該事實(shí)與已有規(guī)則的匹配情況。

規(guī)則執(zhí)行

protected Rule createSimpleRule(RuleDefinition ruleDefinition) {
    MVELRule mvelRule = new MVELRule(parserContext)
        .name(ruleDefinition.getName())
        .priority(ruleDefinition.getPriority())
        .when(ruleDefinition.getCondition());  //步驟1
        for (String action : ruleDefinition.getActions()) {
            mvelRule.then(action);  //步驟2
        }
        return mvelRule;
    }
     
public MVELAction(String expression, ParserContext parserContext) {
    this.expression = expression;
    compiledExpression = MVEL.compileExpression(expression, parserContext);  // 使用mvel編譯規(guī)則 
}

步驟1和步驟2在創(chuàng)建規(guī)則時(shí),easy-rules利用MVEL或SpEL表達(dá)式語(yǔ)言的能力,提前編譯規(guī)則的條件表達(dá)式(condition)和動(dòng)作表達(dá)式(action)。因此,規(guī)則的執(zhí)行效率非常高。

這一點(diǎn)在我們準(zhǔn)備618大促的壓力測(cè)試數(shù)據(jù)中也得以體現(xiàn)。測(cè)試結(jié)果顯示,即使峰值QPS達(dá)到1.5萬(wàn),響應(yīng)時(shí)間的最大值也僅為10.3ms

qps

響應(yīng)時(shí)間

關(guān)于作者:
李文,轉(zhuǎn)轉(zhuǎn)金融技術(shù)部研發(fā)工程師


當(dāng)前題目:規(guī)則引擎技術(shù)在轉(zhuǎn)轉(zhuǎn)錢包的實(shí)踐
本文URL:http://www.dlmjj.cn/article/cdoopje.html