決策引擎——決策流路徑規(guī)劃的方案演進(jìn)
決策引擎是整個(gè)風(fēng)控系統(tǒng)的大腦,承載著風(fēng)控策略編排和計(jì)算的任務(wù),對(duì)決策的耗時(shí)與精度有著嚴(yán)格的要求。本文以決策流執(zhí)行路徑實(shí)現(xiàn)方案為切入點(diǎn),探討決策引擎高效執(zhí)行的基本原理,一起來看一下吧。
決策引擎是整個(gè)風(fēng)控系統(tǒng)的大腦,承載著風(fēng)控策略編排和計(jì)算的任務(wù),對(duì)決策的耗時(shí)與精度有著嚴(yán)格的要求,同時(shí)業(yè)務(wù)部門對(duì)數(shù)據(jù)源成本也有一定程度考量。網(wǎng)上介紹決策引擎通識(shí)的文章有很多,這里不再贅述,本文主要以決策流執(zhí)行路徑實(shí)現(xiàn)方案為切入點(diǎn),探討下決策引擎高效執(zhí)行的基本原理。
一、背景
決策流的編排能力,可以滿足策略運(yùn)營(yíng)人員對(duì)當(dāng)前風(fēng)險(xiǎn)場(chǎng)景下的防控策略部署的靈活、高效。
“靈活”往往意味著不可控,從開發(fā)經(jīng)驗(yàn)來看,產(chǎn)品的功能在既定的范圍內(nèi),基本不會(huì)出現(xiàn)不可控的問題(除非是 BUG)。像 SQL 查詢語(yǔ)言,對(duì)數(shù)據(jù)分析人員來說非常的靈活,抽象的語(yǔ)法可以滿足任何數(shù)據(jù)組裝查詢組裝需求,但此時(shí)危機(jī)正在蔓延:隨時(shí)可能出現(xiàn)一個(gè)慢查詢導(dǎo)致性能問題!
“靈活”和“高效”往往在程序內(nèi)是互斥的,足夠的靈活,往往是犧牲一定的效率得到的。產(chǎn)品與研發(fā)人員能做的,就是在兩者中博弈,找到最佳平衡。
二、決策流執(zhí)行演進(jìn)
以下是策略運(yùn)營(yíng)人員配置的較常見的決策流圖:
流程圖看似簡(jiǎn)單,但是在實(shí)際執(zhí)行程序執(zhí)行過程中會(huì)遇到各種各樣的問題和挑戰(zhàn),根本原因還是上下游業(yè)務(wù)對(duì)風(fēng)控決策執(zhí)行的耗時(shí)有嚴(yán)格的控制要求。
方案1:串行執(zhí)行決策流
此階段就像一個(gè)工作審批流,從開始節(jié)點(diǎn)一步一步的往下串行執(zhí)行,直到終點(diǎn)。決策過程中,完全依賴節(jié)點(diǎn)路徑的復(fù)雜度,假設(shè)一個(gè)節(jié)點(diǎn)的平均耗時(shí)為 100ms,那么如下紅色執(zhí)行路徑需要耗時(shí) 500ms。
500ms 對(duì)風(fēng)控來說是比較奢侈的,整個(gè)業(yè)務(wù)線一次請(qǐng)求耗時(shí)可能大半時(shí)間都被我們消耗掉了,這顯然是不能接受的。可以想象,隨著業(yè)務(wù)場(chǎng)景越來越復(fù)雜,策略人員對(duì)決策流的編排復(fù)雜度越來越高,導(dǎo)致整個(gè)決策流的決策路徑越來越長(zhǎng),耗時(shí)呈線性增長(zhǎng),這種技術(shù)實(shí)現(xiàn)方案肯定是不能接受的。
總結(jié):
1)優(yōu)點(diǎn)
- 所見即所得,不會(huì)多執(zhí)行也不會(huì)少執(zhí)行;
- 串行執(zhí)行對(duì)程序調(diào)試和日志友好,方便調(diào)試。
2)缺點(diǎn)
- 性能極差,策略人員可能無法接受。
方案2:并發(fā)執(zhí)行決策流
活干不完,咱就堆人。同樣的,一個(gè)線程干不完的,咱就堆線程并發(fā)計(jì)算。
本著空間換時(shí)間的思想,預(yù)先將決策流內(nèi)的節(jié)點(diǎn)全部預(yù)加載完成,將結(jié)果緩存住,真正執(zhí)行決策流的時(shí)候,請(qǐng)求緩存直接計(jì)算執(zhí)行,大大節(jié)省了決策時(shí)間。
此時(shí)影響決策性能的卡點(diǎn)在最耗時(shí)的那個(gè)節(jié)點(diǎn),只需集中人力解決掉這個(gè)節(jié)點(diǎn)的性能問題就能降低決策流執(zhí)行時(shí)間了。
總結(jié):
1)優(yōu)點(diǎn)
- 性能一流,空間換時(shí)間,最大化地提效。
2)缺點(diǎn)
- 算力很大:所有節(jié)點(diǎn)都并發(fā)請(qǐng)求,對(duì)下游系統(tǒng)的負(fù)載要求很高;
- 浪費(fèi)巨大:當(dāng)筆請(qǐng)求決策在節(jié)點(diǎn) A 就被拒絕了,但是后續(xù)所有節(jié)點(diǎn)都計(jì)算了一遍,很浪費(fèi);
- 成本高:又比如有些收費(fèi)節(jié)點(diǎn),提前調(diào)用了,但是并未使用,成本極大;
- 未考慮節(jié)點(diǎn)依賴問題:假設(shè)節(jié)點(diǎn) C 依賴 節(jié)點(diǎn) A 的結(jié)果,此處會(huì)導(dǎo)致并發(fā)加載節(jié)點(diǎn) C 時(shí)沒有相應(yīng)的入?yún)⒍鲥e(cuò)。
方案3:依賴分析&并行
方案二除了不考慮成本問題外,最大的痛點(diǎn)在于依賴關(guān)系問題,這是致命的。此時(shí)需要在運(yùn)行時(shí)動(dòng)態(tài)分析決策流節(jié)點(diǎn)之間的依賴關(guān)系。
從圖中可以看出,節(jié)點(diǎn) C 依賴節(jié)點(diǎn) A,節(jié)點(diǎn) D 依賴節(jié)點(diǎn) B,其它節(jié)點(diǎn)相互不依賴,那么此時(shí)可以通過依賴分析出節(jié)點(diǎn)與節(jié)點(diǎn)之間的分組關(guān)系,通過分組頭結(jié)點(diǎn)先后順序串行執(zhí)行。
節(jié)點(diǎn)依賴分析:
那么如何實(shí)現(xiàn)節(jié)點(diǎn)的依賴分析及先后執(zhí)行順序呢? 流程圖本身可以就是一個(gè)DAG(有向無環(huán)圖),節(jié)點(diǎn)執(zhí)行的先后順序可以用BFS(廣度優(yōu)先遍歷)遍歷出一維數(shù)組,然后遍歷分析每個(gè)節(jié)點(diǎn)的入?yún)⒑椭暗墓?jié)點(diǎn)的出參是否有關(guān)聯(lián),有關(guān)聯(lián)的歸并到之前節(jié)點(diǎn)組鏈表的“尾巴上”,否則即為不依賴,可并行執(zhí)行。
此時(shí)整個(gè)決策流執(zhí)行耗時(shí)情況如下:
決策流執(zhí)行耗時(shí) = 并行組1耗時(shí) + 并行組2耗時(shí) + … + 并行組 N耗時(shí)
總結(jié):
1)優(yōu)點(diǎn)
- 解決了決策流中并行處理中前后依賴問題。
2)缺點(diǎn)
- 對(duì)策略人員的配置有一定的要求,需要盡量規(guī)避掉依賴關(guān)系,或者減少依賴分組;
- 依然沒有解決方案 2 的成本問題,每個(gè)節(jié)點(diǎn)還是加載了一遍,算力浪費(fèi)嚴(yán)重。
方案4:路徑預(yù)測(cè)&動(dòng)態(tài)剪枝
方案 2、3 都是全量并行加載各節(jié)點(diǎn)數(shù)據(jù),對(duì)算力和成本的消耗是巨大的,實(shí)際在運(yùn)行的過程中,公司在成本這塊肯定是不能接受的,可能資損召回都不定能抵得上服務(wù)器和外部資源的開銷。
通過分析決策流圖,可以發(fā)現(xiàn),分流節(jié)點(diǎn)的功能是排它,即決策數(shù)據(jù)流向只會(huì)選擇一條路徑執(zhí)行,那么此時(shí)我們能在并行執(zhí)行之前確認(rèn)哪些路徑在當(dāng)次決策請(qǐng)求中不會(huì)經(jīng)過,則可以排除掉不會(huì)經(jīng)過路徑上的節(jié)點(diǎn),從而減少不必要的算力和成本。
排它網(wǎng)關(guān)剪枝如上圖,優(yōu)先找出排它網(wǎng)關(guān)節(jié)點(diǎn) S1, S2,分析入?yún)⑹欠褚蕾嚿嫌喂?jié)點(diǎn),此時(shí) S1 依賴節(jié)點(diǎn) B,S2 無依賴,則可按照排它節(jié)點(diǎn)分組并發(fā)執(zhí)行決策出排它路徑,此時(shí) S1 節(jié)點(diǎn)對(duì)應(yīng)的節(jié)點(diǎn) C 被“剪枝”,S2 節(jié)點(diǎn)對(duì)應(yīng)的節(jié)點(diǎn) G 被“剪枝”。
總結(jié):
1)優(yōu)點(diǎn)
- 算力最小化,只并發(fā)加載行進(jìn)路徑中的節(jié)點(diǎn)算力。
2)缺點(diǎn)
- 行進(jìn)路進(jìn)中的節(jié)點(diǎn)未考慮成本問題,可能在前置節(jié)點(diǎn)已經(jīng)拒絕,后直接點(diǎn)算力浪費(fèi)。
方案5:餓漢式&懶漢式
按照方案 4,已經(jīng)解放了一大部分不會(huì)走到分支的算力,但是在正確的決策路徑上,依然存在浪費(fèi),舉例如上:
A 節(jié)點(diǎn)是名單節(jié)點(diǎn),如果命中名單,直接通過或者拒絕,后續(xù)節(jié)點(diǎn)并行加載都是浪費(fèi)的,節(jié)點(diǎn) D 和 節(jié)點(diǎn) F 都是付費(fèi)節(jié)點(diǎn),并發(fā)調(diào)用,成本極高,可能在途中就被拒絕而未實(shí)際用到付費(fèi)結(jié)果。
此時(shí),需要標(biāo)識(shí)出付費(fèi)節(jié)點(diǎn)(或者任何需要控制資源的節(jié)點(diǎn)),改為懶加載模式,即在前置并發(fā)加載所有節(jié)點(diǎn)時(shí)剔除懶加載節(jié)點(diǎn),在決策流路徑真正執(zhí)行到該節(jié)點(diǎn)時(shí)再去計(jì)算,確保調(diào)用了一定是有效的,此時(shí),構(gòu)建節(jié)點(diǎn)時(shí)需要區(qū)分設(shè)置節(jié)點(diǎn)類型是餓漢式or懶漢式。
總結(jié):
1)優(yōu)點(diǎn)
- 基本規(guī)避了上述方案涉及到的問題,在最大化利用率和性能之間取得平衡。
2)缺點(diǎn)
- 決策流的編排需要通力合作,導(dǎo)致性能問題的點(diǎn)可能隨著編排而山下浮動(dòng),需要異動(dòng)監(jiān)控機(jī)制。
三、總結(jié)
本文梳理了決策引擎編排決策流過程中為了提高決策性能和節(jié)約成本上做出的一些列優(yōu)化方案,針對(duì)不同的場(chǎng)景,可自由選擇激進(jìn)的方案 or 性能和成本兼顧的方案。
最后啰嗦一句,脫離規(guī)劃的設(shè)計(jì)再好,也未必能能真正的落地,這就對(duì)產(chǎn)品經(jīng)理的產(chǎn)品規(guī)劃能力提出了極高的要求,產(chǎn)品經(jīng)理一定要從實(shí)際出發(fā),充分資源、環(huán)境與體驗(yàn)等因素,制定切實(shí)可行的方案。
作者:王小賓;微信公眾號(hào):一起侃產(chǎn)品
本文由@并不跳步交叉步 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來自 Unsplash,基于 CC0 協(xié)議
該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺(tái)僅提供信息存儲(chǔ)空間服務(wù)。
- 目前還沒評(píng)論,等你發(fā)揮!