轉(zhuǎn)轉(zhuǎn)業(yè)務(wù)數(shù)據(jù)校驗(yàn)平臺(tái)介紹
1、背景介紹
隨著轉(zhuǎn)轉(zhuǎn)業(yè)務(wù)規(guī)模快速增長(zhǎng),系統(tǒng)拓?fù)浣Y(jié)構(gòu)越來越復(fù)雜,加上二手交易玩法也非常多(如C2C、C2B、B2B、B2C、C2B2C等),在這種復(fù)雜系統(tǒng)架構(gòu)和業(yè)務(wù)場(chǎng)景下,無法避免會(huì)出現(xiàn)RPC調(diào)用失敗,消息漏發(fā),線上Bug,業(yè)務(wù)新老規(guī)則沖突等因素引發(fā)數(shù)據(jù)異常,導(dǎo)致用戶客訴,以及公司產(chǎn)生損失。當(dāng)時(shí)公司沒有一個(gè)統(tǒng)一的數(shù)據(jù)校驗(yàn)治理方案,行業(yè)也無相關(guān)開源系統(tǒng),導(dǎo)致業(yè)務(wù)數(shù)據(jù)治理這塊一直都是一個(gè)沒有深入治理的領(lǐng)域?;谝陨媳尘?,轉(zhuǎn)轉(zhuǎn)業(yè)務(wù)規(guī)則校驗(yàn)平臺(tái)(簡(jiǎn)稱ZZBCP:ZZ Business Check Platform)孕育而生,此系統(tǒng)幫助業(yè)務(wù)系統(tǒng)實(shí)時(shí)校驗(yàn)線上的每一筆單據(jù)數(shù)據(jù),填補(bǔ)了業(yè)務(wù)數(shù)據(jù)質(zhì)量治理領(lǐng)域的空白。
2 系統(tǒng)目標(biāo)
- 實(shí)時(shí)發(fā)現(xiàn)線上業(yè)異常數(shù)據(jù),及時(shí)間通知相關(guān)人員介入排查,以降低數(shù)據(jù)異常對(duì)用戶和業(yè)務(wù)的影響。
- 低成本接入各種場(chǎng)景數(shù)據(jù)校對(duì)。通過后臺(tái)配置方式,錄入校驗(yàn)規(guī)則信息。
- 實(shí)時(shí)搜集監(jiān)控?cái)?shù)據(jù),并生成統(tǒng)計(jì)監(jiān)控報(bào)表,實(shí)時(shí)掌握系統(tǒng)數(shù)據(jù)質(zhì)量。
3 系統(tǒng)設(shè)計(jì)詳解
下圖是系統(tǒng)執(zhí)行規(guī)則流程圖,觸發(fā)事件源(trigger msg)驅(qū)動(dòng)規(guī)則執(zhí)行(實(shí)時(shí)或者延時(shí)執(zhí)行),目標(biāo)事件數(shù)據(jù)源(Target msg-可以不配置目標(biāo)數(shù)據(jù)源,則通過RPC方式獲取需要校驗(yàn)的目標(biāo)數(shù)據(jù)源)是被校驗(yàn)的數(shù)據(jù)內(nèi)容。
3.1 系統(tǒng)執(zhí)行時(shí)序圖
T1時(shí)刻,系統(tǒng)收到觸發(fā)消息后,命中規(guī)則且延時(shí)到T3時(shí)刻進(jìn)行數(shù)據(jù)校驗(yàn)動(dòng)作。T2時(shí)刻,收到目標(biāo)消息,則將目標(biāo)消息處理后,暫存到Codis中,等到T3時(shí)刻對(duì)目標(biāo)消息進(jìn)行校驗(yàn),然后根據(jù)校驗(yàn)結(jié)果執(zhí)行后續(xù)流程。
3.2 消息訂閱模塊
當(dāng)前支持訂閱MQ和Binlog消息(Redis/ES暫時(shí)不支持)。該模塊將觸發(fā)事件和目標(biāo)事件的數(shù)據(jù),統(tǒng)一轉(zhuǎn)化成ZZBCP系統(tǒng)標(biāo)準(zhǔn)的數(shù)據(jù)格式,方便后續(xù)規(guī)則執(zhí)行引擎統(tǒng)一進(jìn)行處理。當(dāng)前對(duì)binlog消費(fèi)使用的Kafaka,將MySql, TiDB的binlog通過CDC中間件(Canal, Maxwell)推送到Kafka消息中間件。
3.3 規(guī)則執(zhí)行模塊
延時(shí)隊(duì)列中的規(guī)則到期后,會(huì)執(zhí)行數(shù)據(jù)組裝操作,從redis中查詢數(shù)據(jù)(目標(biāo)數(shù)據(jù)源),將數(shù)據(jù)按系統(tǒng)定義的格式組裝好,交給規(guī)則執(zhí)行引擎執(zhí)行。
當(dāng)前我們支持兩種規(guī)則執(zhí)行引擎:
- 一種是Aviator規(guī)則引擎,這種規(guī)則引擎適用校驗(yàn)規(guī)則較為簡(jiǎn)單的場(chǎng)景,編寫效率高, 但是一旦校驗(yàn)邏輯復(fù)雜,使用此方式,則編寫的表達(dá)式晦澀難懂,而且后期維護(hù)成本高。另外, 除了支持Aviator通用函數(shù),我們還內(nèi)置一下內(nèi)置函數(shù),如支持redis訪問的函數(shù),公司通用的中間件的操作函數(shù)。
- 另外一種是Java規(guī)則引擎,業(yè)務(wù)接入按系統(tǒng)規(guī)定實(shí)現(xiàn)接口方法,并支持泛化調(diào)用,不需要依賴業(yè)務(wù)接口協(xié)議接口定義,大大提示了接入效率,并由配置后臺(tái)實(shí)時(shí)動(dòng)態(tài)編譯并生效,這個(gè)方式主要是為了解決校驗(yàn)邏輯較為復(fù)雜,校驗(yàn)的目標(biāo)數(shù)據(jù)需要依賴RPC從第三方獲取的場(chǎng)景。對(duì)于動(dòng)態(tài)編譯這塊,我們使用Java提供的原生編譯工具類進(jìn)行動(dòng)態(tài)編譯并加載到JVM中。這個(gè)過程中需要注意加載和執(zhí)行時(shí)候ClassLoader不一致的問題。
3.4 告警模塊
該模塊主要是根據(jù)規(guī)則執(zhí)行引擎返回的結(jié)果,判斷是否需要進(jìn)行后續(xù)的告警操作,異常數(shù)據(jù)的收集,以及否需要進(jìn)行重試執(zhí)行校驗(yàn)動(dòng)作。
- 告警短信通知信息,透出的業(yè)務(wù)數(shù)據(jù)源按需配置,需要透出哪些信息,方便后續(xù)定位。
- 異常數(shù)據(jù)收集列表
3.5 數(shù)據(jù)自動(dòng)修復(fù)模塊
對(duì)于以下特殊場(chǎng)景的數(shù)據(jù)異常,如果可以自動(dòng)化觸發(fā)數(shù)據(jù)修復(fù),則可以使用此功能進(jìn)行一個(gè)數(shù)據(jù)修復(fù)。當(dāng)前我們的內(nèi)部財(cái)務(wù)對(duì)賬系統(tǒng),就使用了此功能對(duì)異常數(shù)據(jù)進(jìn)行自動(dòng)修復(fù)。鑒于時(shí)刻對(duì)線上數(shù)據(jù)的敬畏之心,此功能具體修復(fù)邏輯,建議控制在業(yè)務(wù)所屬領(lǐng)域內(nèi),ZZBCP平臺(tái)只是一個(gè)觸發(fā)修復(fù)的入口。
3.6 監(jiān)控指標(biāo)
系統(tǒng)會(huì)將所有的規(guī)則信息上報(bào)到轉(zhuǎn)轉(zhuǎn)的監(jiān)控系統(tǒng)(Prometheus- 轉(zhuǎn)轉(zhuǎn)進(jìn)行了二次開發(fā)),對(duì)一些經(jīng)常關(guān)注的指標(biāo)進(jìn)行統(tǒng)計(jì)上報(bào)。如規(guī)則命中統(tǒng)計(jì),執(zhí)行規(guī)則校驗(yàn)通過,執(zhí)行校驗(yàn)未通過次數(shù)等。
3.7 后臺(tái)配置
后臺(tái)配置提供了事件注冊(cè)注冊(cè),報(bào)警相關(guān)配置和灰度以及手動(dòng)執(zhí)行規(guī)則等功能。方便業(yè)務(wù)快速的配置和測(cè)試自己的規(guī)則校驗(yàn)邏輯。
參考資料
??https://www.infoq.cn/article/j*6vp2pbuggcrzbhcaog??
??https://tool.lu/en_US/deck/sw/detail?slide=8??