如何實(shí)現(xiàn)日常業(yè)務(wù)問(wèn)題的一鍵排查?
背景
而開發(fā)同學(xué)解決這些問(wèn)題也相當(dāng)痛苦:反復(fù)溝通獲取必要的查詢參數(shù),從多個(gè)平臺(tái)得到業(yè)務(wù)數(shù)據(jù),如果沒有相關(guān)的平臺(tái)工具,那么還會(huì)通過(guò)構(gòu)建SQL, rpc服務(wù)入?yún)ⅲ彺鎘ey等查詢獲取所需要的業(yè)務(wù)參數(shù),最后根據(jù)你多年對(duì)業(yè)務(wù)的理解,從這些數(shù)據(jù)中找到答案。
我們可以將以上歸納為兩個(gè)影響我們?nèi)粘?wèn)題排查效率的因素:問(wèn)題流轉(zhuǎn)多;排查鏈路長(zhǎng)。

一鍵獲取所有關(guān)聯(lián)業(yè)務(wù)數(shù)據(jù):輸入不同維度的入?yún)ⅲ@取一致的數(shù)據(jù)結(jié)果;
業(yè)務(wù)數(shù)據(jù)易于理解,人人可用:可對(duì)業(yè)務(wù)數(shù)據(jù)屬性進(jìn)行解釋,以方便非技術(shù)人員自助查詢;
業(yè)務(wù)數(shù)據(jù)可診斷:如果數(shù)據(jù)出現(xiàn)異常,能夠給出異常的數(shù)據(jù)信息。

業(yè)務(wù)數(shù)據(jù)全景與診斷
整體思路
異常case問(wèn)題:業(yè)務(wù)數(shù)據(jù)存在異常(數(shù)據(jù)缺失,狀態(tài)不一致等)
業(yè)務(wù)數(shù)據(jù)查詢:數(shù)據(jù)正常,需要咨詢相關(guān)數(shù)據(jù)(單據(jù)狀態(tài),權(quán)益核銷情況等)


數(shù)據(jù)全景
關(guān)于GraphQL的介紹:https://graphql.cn/
閑魚此前有過(guò)關(guān)于GraphQL的一些實(shí)踐。通過(guò)編寫graphql語(yǔ)句一次性獲取所有的數(shù)據(jù),前端根據(jù)數(shù)據(jù)直接渲染,實(shí)現(xiàn)快速搭建頁(yè)面。通過(guò)將業(yè)務(wù)邏輯前置,服務(wù)端只需要專注于建設(shè)穩(wěn)定的域服務(wù),使我們開發(fā)過(guò)程中免除了前后端的數(shù)據(jù)格式約定和接口聯(lián)調(diào),提高了研發(fā)效率。很多情況下,GraphQL也可以作為FaaS的一種解決方案。
我們以閑魚回收業(yè)務(wù)為例,該業(yè)務(wù)全鏈路涉及到 交易,資金,芝麻信用,螞蟻能量,傭金結(jié)算,和估價(jià)數(shù)據(jù),其graphql語(yǔ)句簡(jiǎn)單描述為:


數(shù)據(jù)重分組
輸入數(shù)據(jù)的不確定性

異構(gòu)數(shù)據(jù)統(tǒng)一

狀態(tài)值轉(zhuǎn)換:通常用于翻譯可枚舉的狀態(tài)值,如交易狀態(tài)=6 解釋為 交易狀態(tài)=6(交易成功);
虛擬屬性值對(duì):類似于宏,如定義 "是否是高價(jià)訂單" = eval(order.price>2000), 計(jì)算表達(dá)式的值,以補(bǔ)充一個(gè)原本不存在的屬性字段。
現(xiàn)在,我們已經(jīng)得到一個(gè)可以查詢業(yè)務(wù)全景數(shù)據(jù)的工具了。你可以使用它作為業(yè)務(wù)數(shù)據(jù)的查詢控制臺(tái)。
業(yè)務(wù)診斷
if(實(shí)際值!=期望值){
print 異常結(jié)果
}
當(dāng) 數(shù)據(jù)中出現(xiàn)A數(shù)據(jù)時(shí),數(shù)據(jù)還應(yīng)當(dāng)有結(jié)果[B1,B2,B3]。

這些規(guī)則可以從業(yè)務(wù)TC用例得出,進(jìn)行可視化后還能幫助新人學(xué)習(xí)業(yè)務(wù)邏輯。
QLExpress(https://github.com/taobao/qlexpress)是阿里開源的一種動(dòng)態(tài)腳本引擎,功能強(qiáng)大,兼容java的大部分語(yǔ)法,可以使用關(guān)鍵字別名替換:
如果(order.isCreditOrder == "1")
則 return order.idleCreditPayAmount > 0;
否則 return true;
//defaultContext 是數(shù)據(jù)轉(zhuǎn)換后的數(shù)據(jù),作為qlexpress的上下文
Object executeResult = QLExpressUtil.execute(ruleExpress, defaultContext,
errorList, false, false);
//將執(zhí)行結(jié)果轉(zhuǎn)換,空結(jié)果默認(rèn)成功, 如果結(jié)果為失敗,則再執(zhí)行一次formater獲得錯(cuò)誤文案
QLExpResult qlExpResult = buildQlExpResult(context, executeResult, formater);
if (!qlExpResult.getSuccess()) {
errors.add(DiagnosisError
.of(ErrorLevel.BIZ_ERROR.name(), ruleName, String.valueOf(qlExpResult.getData())));
}



能力延伸

用例的自動(dòng)化檢查

使用GraphQL 實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)的聚合查詢;
使用JSONPath 解決不同維度的異構(gòu)數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù)的重分組,并進(jìn)行業(yè)務(wù)語(yǔ)義解釋;
使用QLExpress 表達(dá)和執(zhí)行業(yè)務(wù)數(shù)據(jù)規(guī)則,完成數(shù)據(jù)的診斷。
結(jié)合日志檢索工具,用戶行為回放工具提供更多維度的一鍵直達(dá);
對(duì)異常數(shù)據(jù)的處理,包括數(shù)據(jù)訂正,審批,指引;
為客服,答疑等場(chǎng)景提供排查手段,引入敏感數(shù)據(jù)分級(jí),防止數(shù)據(jù)泄露;
接入業(yè)務(wù)消息進(jìn)行對(duì)賬&監(jiān)控預(yù)警。
