接上一篇(業(yè)務(wù)安全系統(tǒng)淺談(一)),這一篇簡單總結(jié)一下業(yè)務(wù)安全系統(tǒng)在‘非主站應(yīng)用’環(huán)境下的‘指標(biāo)轉(zhuǎn)化與增強’篡诽、‘業(yè)務(wù)安全規(guī)則引擎’兩個服務(wù)在當(dāng)初設(shè)計時的一些考慮清焕。
首先茎毁,為什么需要這兩個服務(wù)?
背后的邏輯是這樣的墓懂,‘業(yè)務(wù)安全’系統(tǒng)為了能夠識別用戶的“非法”行為:
- 需要不斷收集用戶在平臺上產(chǎn)生的各類行為數(shù)據(jù)焰宣,數(shù)據(jù)流向“實時計算平臺”和“大數(shù)據(jù)存儲平臺”
- 基于數(shù)據(jù),對業(yè)務(wù)安全關(guān)注的各個‘指標(biāo)’/特征值 (針對的都是每個用戶的‘指標(biāo)’捕仔,如匕积,‘過去30(指標(biāo)可配)分鐘內(nèi)的貨源的點擊次數(shù)’,‘司機過去3個小時(指標(biāo)可配)內(nèi)的GPS 位移距離’榜跌,過去2個小時內(nèi)(指標(biāo)可配)手機的重力感應(yīng)數(shù)據(jù)變化等等) 進(jìn)行累計計算(’指標(biāo)‘累計計算的公式闪唆,通過后臺配置自動生成代碼在實時計算平臺上進(jìn)行執(zhí)行、存儲結(jié)果)
- 業(yè)務(wù)安全規(guī)則的定義(用groovy或 js 等語言描述的snippet -- 我們用的js)在后臺配置斜做,配置結(jié)果是一組按‘場景’組織的可執(zhí)行的rule set(規(guī)則集苞氮,其中每個rule 分為rule trigger和rule action 兩個部分(其實是一些用js寫的 snippet codes)及規(guī)則中所關(guān)聯(lián)的各類‘指標(biāo)’/特征值
- 通過實時計算平臺,將用戶行為數(shù)據(jù)進(jìn)行過濾瓤逼,并按‘場景’ 分類輸出(輸出成raw_event_data)笼吟。這里‘場景’(通過sceneId表征库物,見上圖)的概念在車貨匹配業(yè)務(wù)中分為,‘searchCargo’(貨源搜索), 'viewCargo'(查看貨源), 'phoneCall'(撥打貨源)贷帮,‘發(fā)布貨源’(sendCargo)戚揭,‘填寫貨源備注’等等(也可以組合定義)∧焓啵‘場景’ 的定義不僅用于分類輸入給?'指標(biāo)轉(zhuǎn)化與增強'服務(wù)的raw_event_data民晒, 還用于關(guān)聯(lián)輸入給規(guī)則引擎的事實數(shù)據(jù)(rule_fact_data)及規(guī)則的定義部分(rule set)
(鋪墊了這么多,才講到“為什么” ~~~~)
- '指標(biāo)轉(zhuǎn)化與增強'服務(wù)將消費MQ(kafka)中的raw_data锄禽,根據(jù)其sceneId 來匹配所定義的業(yè)務(wù)安全規(guī)則集(rule set)潜必,及rule set 關(guān)聯(lián)的‘指標(biāo)’定義,來“轉(zhuǎn)化和增強” raw_event_data 成為rule_fact_data
- '規(guī)則引擎'服務(wù)則接收rule_fact_data, 根據(jù)其中的sceneId 來匹配rule set 并執(zhí)行每個rule 的rule trigger 部分和rule action 部分沃但。 腳本引擎采用的是java 8 中的nashorn磁滚。 當(dāng)初決定采用哪種語言(甚至開源的rule engine 框架)來描述和定義規(guī)則,著實有一個曲折決策的過程
????????-- 我們看了drools宵晚。但認(rèn)為drools 著實有些重垂攘,雖然對于各類復(fù)雜的rule set 的組織(一個完備的規(guī)則引擎所需的“規(guī)則互斥”、“規(guī)則沖突”淤刃、“規(guī)則執(zhí)行順序”設(shè)置等能力均支持良好)及執(zhí)行效率支持的非常好晒他,但真的不太適合我們的場景。我們預(yù)想的是逸贾,隨著系統(tǒng)的不斷演進(jìn)陨仅,情況可能真不是像預(yù)想的那樣美好---- “提供一個各項規(guī)則配置能力靈活的后臺,產(chǎn)品或運營同學(xué)可以信手拈來隨意配置各種復(fù)雜的業(yè)務(wù)規(guī)則”耕陷,而實際上卻可能更加骨感一些 ---- “提供有限的場景及指標(biāo)的定義掂名,通過后臺來配置成業(yè)務(wù)安全的規(guī)則;生成規(guī)則的過程哟沫,通過預(yù)定義的規(guī)則模板來生成饺蔑。個別的情況,可以提供一個text 框嗜诀,讓RD 來輔助寫rule codes 且可以實時地更新到線上并生效”猾警。在這種考慮之下,drools 就pass 了隆敢,而決定采用某個腳本語言來自己實現(xiàn)一個規(guī)則引擎
? ? ? ?--? 至于腳本語言的選擇发皿,就沒那么糾結(jié)了。當(dāng)時拂蝎,在其他項目里面已經(jīng)有采用js 來構(gòu)建規(guī)則引擎的使用經(jīng)驗(很簡單的使用)穴墅,雖然groovy 是一個很好的option (JS 和 Groovy 都‘近’ java,都比較容易集成使用),但還是放棄了(考慮時間等等成本)
再補一張圖玄货,應(yīng)該就更清晰了
PS:
整個業(yè)務(wù)安全系統(tǒng)(工程部分)從最早的版本更新上線到目前的版本大致花了一個多月的時間皇钞,其中對設(shè)計思路、協(xié)議定義規(guī)范松捉、腳本語言的選擇等等架構(gòu)決策也偶有反復(fù)夹界,廢棄了一些原有的代碼,但團隊最后還是都堅持了下來隘世。整個過程走過來回頭來看可柿,留下的也都是財富。
感謝團隊成員 - 曹雷丙者、趙偉复斥、陳長、王雪強蔓钟、李昆鵬永票、牛遷遷的努力與貢獻(xiàn)!
這里沒有對系統(tǒng)細(xì)節(jié)的實現(xiàn)做過多的介紹滥沫,如果有對業(yè)務(wù)安全系統(tǒng)搭建感興趣的同學(xué),歡迎大家一起討論并學(xué)習(xí)進(jìn)步键俱。畢竟兰绣,業(yè)務(wù)安全的topic 非常之豐富。