錢大媽基于 Flink 的實(shí)時(shí)風(fēng)控實(shí)踐
?摘要:本文作者彭明德,介紹了錢大媽與阿里云 Flink 實(shí)時(shí)計(jì)算團(tuán)隊(duì)共建實(shí)時(shí)風(fēng)控規(guī)則引擎,精確識別羊毛黨以防營銷預(yù)算流失。主要內(nèi)容包括:
- 項(xiàng)目背景
- 業(yè)務(wù)架構(gòu)
- 未規(guī)則模型
- 難點(diǎn)攻堅(jiān)
- 回顧展望
一、項(xiàng)目背景
目前錢大媽基于云原生大數(shù)據(jù)組件(DataWorks、MaxCompute、Flink、Hologres)構(gòu)建了離線和實(shí)時(shí)數(shù)據(jù)一體化的全渠道數(shù)據(jù)中臺,為各業(yè)務(wù)線提供 BI 報(bào)表及數(shù)據(jù)接口支持。除了數(shù)倉的分析場景以外,錢大媽面臨著業(yè)務(wù)系統(tǒng)中的風(fēng)控需求,例如每季度的營銷費(fèi)用中被不少的羊毛黨薅走正常用戶的利益,其中羊毛黨一方面可能導(dǎo)致用戶的口碑下降,另一方面也會影響原有的活動運(yùn)營預(yù)算迅速攀升從而導(dǎo)致資損。錢大媽與阿里云 Flink 實(shí)時(shí)計(jì)算團(tuán)隊(duì)共建實(shí)時(shí)風(fēng)控規(guī)則引擎,精確識別羊毛黨以防營銷預(yù)算流失。
圖一:錢大媽實(shí)時(shí)風(fēng)控流程示意圖
二、業(yè)務(wù)架構(gòu)
錢大媽風(fēng)控業(yè)務(wù)架構(gòu)如圖二所示總共分為四個(gè)部分:事件接入、風(fēng)險(xiǎn)感知、風(fēng)險(xiǎn)應(yīng)對、風(fēng)險(xiǎn)回溯。通過 Flink 在線 ETL 加工處理的實(shí)時(shí)用戶畫像標(biāo)簽和銷售事實(shí)指標(biāo),除了作為線上 BI 指標(biāo)和實(shí)時(shí)大屏數(shù)據(jù)展示,也為實(shí)時(shí)規(guī)則引擎的事件接入提供重要的數(shù)據(jù)支持。
- 事件接入。其中包括黑白灰名單庫、畫像特征數(shù)據(jù)、行為埋點(diǎn)數(shù)據(jù)和中臺交易數(shù)據(jù)。
- 風(fēng)險(xiǎn)感知。策略調(diào)研后發(fā)布到規(guī)則引擎,并對告警結(jié)果進(jìn)行離線回歸和多渠道觸達(dá)。
- 風(fēng)險(xiǎn)應(yīng)對。對涉及到財(cái)務(wù)結(jié)算的規(guī)則提供再審核、豁免機(jī)制或人工補(bǔ)償。
- 風(fēng)險(xiǎn)回溯。策略命中后進(jìn)行統(tǒng)計(jì)和風(fēng)險(xiǎn)分類分級,預(yù)警離線回溯并對風(fēng)控事件閉件。
圖二:錢大媽實(shí)時(shí)風(fēng)控業(yè)務(wù)架構(gòu)圖
三、規(guī)則模型
風(fēng)控業(yè)務(wù)專員通過產(chǎn)品界面簡單配置即可實(shí)時(shí)動態(tài)發(fā)布風(fēng)控規(guī)則,同時(shí)對在線 Flink 作業(yè)的規(guī)則進(jìn)行新增、更新以及刪除,其中風(fēng)控規(guī)則模型主要分為統(tǒng)計(jì)型規(guī)則和序列型規(guī)則,相同模型支持子規(guī)則的嵌套,不同模型之間可以通過與、或關(guān)系進(jìn)行組合。
圖三:錢大媽Flink作業(yè)DAG抽象圖
以下為規(guī)則組合中需要?jiǎng)討B(tài)配置能力的配置項(xiàng):
1)分組字段。不同字段分組、多字段分組的情況在風(fēng)控規(guī)則的應(yīng)用中非常常見。有如下規(guī)則樣例:
- 以用戶 ID 分組:"用戶的下單次數(shù)";
- 以用戶 ID、區(qū)域 ID 作為分組:"用戶同一段時(shí)間內(nèi)不同區(qū)域的訂單數(shù)"。
2)聚合函數(shù)。聚合函數(shù)包括業(yè)務(wù)常用的聚合邏輯,規(guī)則引擎依賴 Flink 內(nèi)置豐富的累加器,并在 Accumulator 接口的基礎(chǔ)上進(jìn)行了根據(jù)需求場景的自定義實(shí)現(xiàn)。樣例規(guī)則如下:
- A 門店近 30 分鐘獨(dú)立消費(fèi)用戶數(shù)小于 100;
- B 門店新客消費(fèi)金額大于 300。
3)窗口周期。窗口周期也即每個(gè)窗口的大小,如業(yè)務(wù)方可能希望在持續(xù) 30 分鐘的秒殺活動周期內(nèi)運(yùn)行規(guī)則,或者希望重點(diǎn)關(guān)注異常時(shí)段。
- 每 30 分鐘時(shí)間窗口內(nèi),單個(gè)用戶發(fā)起超過 20 筆未支付訂單;
- 凌晨 1 點(diǎn)至 3 點(diǎn),單個(gè)用戶支付訂單數(shù)超 50 筆。
4)窗口類型。為了面對不同的業(yè)務(wù)需求,我們將業(yè)務(wù)規(guī)則中常見的窗口類型集成到規(guī)則引擎內(nèi)部。其中包括滑動窗口、累計(jì)窗口、甚至是無窗口(即時(shí)觸發(fā))。
5)聚合前的過濾條件:
- 只對"下單事件"進(jìn)行統(tǒng)計(jì);
- 過濾門店"虛擬用戶"。
6)聚合后的過濾條件:
- 用戶 A 在 5 分鐘內(nèi)下單次數(shù) "超過 150 次";
- 用戶 B 在 5 分鐘內(nèi)購買金額 "超過 300 元"。
7)計(jì)算表達(dá)式。風(fēng)控規(guī)則的字段口徑通常是需要組合計(jì)算的,我們在表達(dá)式計(jì)算和編譯中集成了更輕便和更高性能的 Aviator 表達(dá)式引擎。規(guī)則樣例如下:
- 應(yīng)收金額大于 150 元(應(yīng)收金額 = 商品金額合計(jì) +運(yùn)費(fèi) + 優(yōu)惠合計(jì));
- 通過 POS 端支付的應(yīng)收金額大于 150 元。
8)行為序列。行為序列其實(shí)也是事件與事件之間的組合,他打破了以往風(fēng)控規(guī)則只能基于單事件維度描述事實(shí)的壁壘,在事件與事件之間的事實(shí)信息也將被規(guī)則引擎捕捉。規(guī)則樣例如下:
- 用戶 A 在 5 分鐘內(nèi)依次做了點(diǎn)擊、收藏、加購;
- 用戶 B 在 30 分鐘前領(lǐng)了優(yōu)惠券,但是沒有下單。
圖四:實(shí)時(shí)風(fēng)控規(guī)則配置業(yè)務(wù)邏輯簡圖
四、難點(diǎn)攻堅(jiān)
針對規(guī)則模型的流式序列型數(shù)據(jù),我們選擇 Flink CEP 處理事件序列匹配,由于我們整個(gè)風(fēng)控作業(yè)使用 Flink 實(shí)現(xiàn),并且 Flink CEP 作為 Flink 官方原生支持的 Library,集成度高無需引用額外組件即可滿足事件序列匹配的需求。作業(yè)預(yù)期是允許用戶在產(chǎn)品界面上熱發(fā)布規(guī)則的,但是基于開源的 Flink CEP,實(shí)現(xiàn)規(guī)則動態(tài)更新能力存在以下困難點(diǎn):
- Flink 社區(qū)的 CEP API 無法支持動態(tài)修改 Pattern 即無法滿足上層規(guī)則中臺、風(fēng)控中臺的可集成性;
- Flink 社區(qū)的 CEP API 無法支持Pattern 定義事件之間的超時(shí)。
阿里云 Flink 實(shí)時(shí)計(jì)算團(tuán)隊(duì)和錢大媽工程師共同攻堅(jiān),在 Flink 社區(qū)發(fā)起如下兩個(gè) FLIP 提案并且在阿里云實(shí)時(shí)計(jì)算產(chǎn)品上面輸出相應(yīng)功能解決此問題:
- FLIP-200 [1]:CEP 支持多規(guī)則和動態(tài) Pattern 變更;
- FLIP-228 [2]:CEP 支持 Pattern 定義事件之間的超時(shí)。
阿里云實(shí)時(shí)計(jì)算產(chǎn)品輸出的支持多規(guī)則和動態(tài)規(guī)則變更、支持 Pattern 定義事件之間的超時(shí)以及支持基于 IterativeCondition 的累加器功能拓寬 Flink 在實(shí)時(shí)風(fēng)控的能力,并且上述功能已經(jīng)在錢大媽生產(chǎn)環(huán)境落地實(shí)踐。其中 Flink CEP 動態(tài)更新 Pattern 機(jī)制中內(nèi)部各組件的交互總覽如下:
圖五:社區(qū)Flink CEP動態(tài)Pattern機(jī)制
風(fēng)控規(guī)則由產(chǎn)品界面作為入口,規(guī)則寫入到 Hologres 中,同時(shí) JDBCPatternProcessorDiscover 周期性輪詢發(fā)現(xiàn)規(guī)則的變更。其中規(guī)則表的數(shù)據(jù)結(jié)構(gòu)如下:
- Id:規(guī)則ID;
- Version:規(guī)則對應(yīng)的版本號;
- Keyby:規(guī)則分組字段(如需分組);
- Pattern:CEP Pattern 序列化后的 Json 字符串;
- Function:CEP 匹配后處理的 PatternProcessFunction;
- Relation:統(tǒng)計(jì)型和規(guī)則型之間的與、或關(guān)系(前提:統(tǒng)計(jì)型和規(guī)則型的 ID 相同)。
圖六:社區(qū)Flink動態(tài)CEP規(guī)則表
五、回顧展望
基于 Flink 的實(shí)時(shí)風(fēng)控解決方案已接應(yīng)用于錢大媽集團(tuán)內(nèi)部生產(chǎn)環(huán)境,在此解決方案里未引入新的技術(shù)組件和編程語言,最大化復(fù)用 Flink 資源實(shí)現(xiàn)實(shí)時(shí)風(fēng)控場景需求,極大降低新組件引入存在的潛在運(yùn)維風(fēng)險(xiǎn)。另一方面也極大降低研發(fā)團(tuán)隊(duì)的學(xué)習(xí)成本,高效釋放實(shí)時(shí)計(jì)算的人力資源,并且對于研發(fā)和業(yè)務(wù)應(yīng)用上面帶來如下好處:
- 解耦 Flink 作業(yè)邏輯開發(fā)和業(yè)務(wù)規(guī)則定義;
- 業(yè)務(wù)規(guī)則存儲在 Database 中,便于查看規(guī)則當(dāng)前狀態(tài)和歷史版本;
- 規(guī)則變更只需修改 Database 存儲的規(guī)則,F(xiàn)link 自動加載更新作業(yè)中的規(guī)則列表;
- 結(jié)合 Flink 生態(tài)能夠非常容易集成事件異構(gòu)數(shù)據(jù)源的讀取與寫入;
- 結(jié)合 Flink 分布式能力,大規(guī)模擴(kuò)展至數(shù)千并發(fā)度匹配運(yùn)行規(guī)則。
后續(xù)錢大媽將和阿里云實(shí)時(shí)計(jì)算產(chǎn)品團(tuán)隊(duì),繼續(xù)共建完善基于 Flink 的實(shí)時(shí)風(fēng)控風(fēng)控解決方案,其中在 Flink CEP 的未來規(guī)劃將圍繞以下三個(gè)主要方向展開:
- Flink CEP 能力的進(jìn)一步增強(qiáng);
- Flink CEP SQL 的動態(tài)能力;
- Flink + DSL 的 Native 支持。