新聞中心
背景
但凡是跟算錢(qián)相關(guān)的系統(tǒng),都是每個(gè)公司的重中之重,比如說(shuō)價(jià)格系統(tǒng)、運(yùn)費(fèi)系統(tǒng)、計(jì)費(fèi)系統(tǒng)、支付系統(tǒng)、基金系統(tǒng)、財(cái)務(wù)系統(tǒng)、結(jié)算系統(tǒng)等等,因?yàn)檫@些系統(tǒng)運(yùn)行過(guò)程中,隨時(shí)可能因?yàn)榧夹g(shù)問(wèn)題或者運(yùn)營(yíng)的人為誤操作問(wèn)題,把錢(qián)給算錯(cuò)了。

所以今天來(lái)給大家講講這一類(lèi)跟算錢(qián)有關(guān)的系統(tǒng),我們應(yīng)該如何來(lái)保證他不會(huì)把錢(qián)給算錯(cuò)呢?
計(jì)費(fèi)業(yè)務(wù)系統(tǒng)架構(gòu)設(shè)計(jì)
業(yè)務(wù)場(chǎng)景引入
首先,我們先來(lái)引入一個(gè)業(yè)務(wù)場(chǎng)景,假設(shè)我們現(xiàn)在有 B 端、M 端和 C 端三個(gè)系統(tǒng)。
其中 B 端可以由商家/入駐客戶(hù)/供應(yīng)商/合作伙伴這一類(lèi) B 端角色對(duì)自己的一些計(jì)費(fèi)規(guī)則進(jìn)行設(shè)置和調(diào)整,M 端是是公司的運(yùn)營(yíng)可以進(jìn)行統(tǒng)一的基礎(chǔ)性計(jì)費(fèi)規(guī)則調(diào)整,C 端是面向用戶(hù)的,在處理一些請(qǐng)求的時(shí)候,會(huì)根據(jù) B 端和 M 端的計(jì)費(fèi)規(guī)則進(jìn)行計(jì)算,算出當(dāng)前的支付金額。
如下圖:
這個(gè)時(shí)候可能你說(shuō)了,這看起來(lái)沒(méi)啥問(wèn)題啊,不就在平臺(tái)層和商家層允許修改計(jì)費(fèi)規(guī)則,然后c端系統(tǒng)實(shí)時(shí)根據(jù)兩個(gè)系統(tǒng)的計(jì)費(fèi)規(guī)則計(jì)算費(fèi)用么。
真的是這樣嗎?上面那套計(jì)費(fèi)模型里,看著簡(jiǎn)單,其實(shí)蘊(yùn)藏著大量的問(wèn)題,下面來(lái)給大家一一說(shuō)明。
業(yè)務(wù)系統(tǒng)消息同步丟失
首先,因?yàn)闅v史原因,上述計(jì)費(fèi)模型會(huì)非常的復(fù)雜,不是我們看起來(lái)那么的簡(jiǎn)單。
實(shí)際上,B 端系統(tǒng)每次修改完了計(jì)費(fèi)規(guī)則以后,是要把計(jì)費(fèi)規(guī)則通過(guò) MQ 同步給 M 端系統(tǒng)的,然后 M 端系統(tǒng)會(huì)匯總 B 端系統(tǒng)的所有商家的計(jì)費(fèi)規(guī)則,接著后續(xù) C 端系統(tǒng)在計(jì)費(fèi)的時(shí)候,是調(diào)用 M 端系統(tǒng)的接口拉取所有需要的計(jì)費(fèi)規(guī)則來(lái)進(jìn)行計(jì)算的。
如下圖所示:
單單就上圖這一個(gè)架構(gòu),就可能會(huì)讓我們?cè)谟?jì)費(fèi)的時(shí)候可能因?yàn)橐恍┘夹g(shù)原因出現(xiàn)問(wèn)題。
比如說(shuō)最典型的就是,不管因?yàn)槭裁矗珺 端系統(tǒng)那里修改了計(jì)費(fèi)規(guī)則以后,可能因?yàn)榫W(wǎng)絡(luò)原因、MQ 故障、代碼 bug 等各種原因,并沒(méi)有同步到 M 端系統(tǒng)那里去,這就會(huì)導(dǎo)致 C 端系統(tǒng)一直用老的計(jì)費(fèi)規(guī)則在計(jì)費(fèi)。
嚴(yán)格來(lái)說(shuō),這就已經(jīng)導(dǎo)致計(jì)費(fèi)錯(cuò)誤了。
如下圖所示:
這還僅僅只是同步問(wèn)題導(dǎo)致的計(jì)費(fèi)錯(cuò)誤而已,其實(shí)還有更加麻煩的一個(gè)問(wèn)題,那就是當(dāng) M 端系統(tǒng)收到了 B 端系統(tǒng)同步過(guò)來(lái)的計(jì)費(fèi)規(guī)則了以后,他可能會(huì)陸續(xù)把復(fù)雜的計(jì)費(fèi)規(guī)則寫(xiě)入多個(gè)數(shù)據(jù)存儲(chǔ)中。
沒(méi)錯(cuò),你沒(méi)看錯(cuò),有可能 M 端系統(tǒng)會(huì)用異構(gòu)數(shù)據(jù)存儲(chǔ)架構(gòu),來(lái)存放不同的計(jì)費(fèi)規(guī)則,比如 MySQL、MongoDB,等等。
如下圖:
計(jì)費(fèi)業(yè)務(wù)系統(tǒng)計(jì)費(fèi)問(wèn)題
這個(gè)時(shí)候可能會(huì)出現(xiàn)一個(gè)問(wèn)題,那就是 C 端系統(tǒng)可能會(huì)在你的一次計(jì)費(fèi)規(guī)則同步的過(guò)程中,就從你 M 端系統(tǒng)這里來(lái)查詢(xún)各種計(jì)費(fèi)規(guī)則來(lái)進(jìn)行計(jì)費(fèi)。
但是這個(gè)時(shí)候有可能會(huì)出現(xiàn)一個(gè)問(wèn)題,那就是 MongoDB 里可能已經(jīng)是最新的計(jì)費(fèi)規(guī)則,而從 MySQL 里查出來(lái)的還是老的計(jì)費(fèi)規(guī)則,也就是說(shuō),完全可能會(huì)出現(xiàn),用了不一致的計(jì)費(fèi)規(guī)則來(lái)進(jìn)行計(jì)費(fèi)。
比如下圖:
這是第二個(gè)可能出現(xiàn)計(jì)費(fèi)錯(cuò)誤的場(chǎng)景,第一個(gè)計(jì)費(fèi)規(guī)則同步失敗和第二個(gè)計(jì)費(fèi)規(guī)則并發(fā)讀寫(xiě),都是技術(shù)類(lèi)的問(wèn)題。
第三個(gè)計(jì)費(fèi)錯(cuò)誤的場(chǎng)景,就是我們的商家或者自己的運(yùn)營(yíng),手欠甚至手抽,把計(jì)費(fèi)規(guī)則改成了非常離譜的錯(cuò)誤。
比如說(shuō),某一個(gè)計(jì)費(fèi)規(guī)則正?;鶞?zhǔn)金額是百元級(jí)別的,但是他給改成了幾塊錢(qián),這可能會(huì)導(dǎo)致公司出現(xiàn)嚴(yán)重的損失。
如下圖:
所有這一切問(wèn)題,都可能會(huì)導(dǎo)致計(jì)費(fèi)的錯(cuò)誤,那么說(shuō)到這里,大家是不是想說(shuō),那還不簡(jiǎn)單,case by case 的優(yōu)化和處理不就完了。
比如說(shuō)對(duì) B 端和 M 端系統(tǒng)進(jìn)行大范圍的加固,實(shí)現(xiàn) MQ 消息不丟失保障機(jī)制,對(duì) M 端系統(tǒng)異構(gòu)存儲(chǔ)寫(xiě)入和讀取,加個(gè)分布式鎖,寫(xiě)入的時(shí)候不能讀取,讀取的時(shí)候不能寫(xiě)入,對(duì)運(yùn)營(yíng)修改計(jì)費(fèi)規(guī)則的時(shí)候進(jìn)行校驗(yàn),加入各種校驗(yàn)規(guī)則,亂改就不讓你通過(guò)。
沒(méi)錯(cuò),大家說(shuō)的這些其實(shí)都可以,但是不知道大家想過(guò)一個(gè)問(wèn)題沒(méi)有,對(duì)于真正復(fù)雜的公司級(jí)系統(tǒng),比如上述的 B 端系統(tǒng),看起來(lái)在圖里僅僅是一個(gè)框而已。
其實(shí)一家公司里可能是幾十個(gè)人維護(hù)的大平臺(tái),M 端系統(tǒng)也是同理,所以如果要推動(dòng)各方實(shí)現(xiàn)各種技術(shù)方案來(lái)做保障,首先在跨部門(mén)推動(dòng)方面成本就是很高的。
這僅僅是其一,其二,就是你現(xiàn)在做了一些措施做了加強(qiáng),但是不代表以后就不會(huì)有新的問(wèn)題了。
比如說(shuō),你對(duì) MQ 同步實(shí)現(xiàn)了消息不丟失方案,可是哪一天如果 MQ 掛了呢?
比如說(shuō),你如果在 M 端系統(tǒng)實(shí)現(xiàn)寫(xiě)入和讀取加分布式鎖做互斥,那可能會(huì)導(dǎo)致并發(fā)性能大幅度的降低。
比如說(shuō),你給計(jì)費(fèi)規(guī)則修改加入校驗(yàn)規(guī)則,可是隨著計(jì)費(fèi)規(guī)則不停的變化,很可能會(huì)導(dǎo)致你的校驗(yàn)規(guī)則失效,或者要持續(xù)不斷的加入更多新的校驗(yàn)規(guī)則。
如下圖:
計(jì)費(fèi)業(yè)務(wù)數(shù)據(jù)補(bǔ)償系統(tǒng)設(shè)計(jì)
所有這一切其實(shí)都是治標(biāo)不治本,對(duì)于這一類(lèi)線(xiàn)上跟錢(qián)相關(guān)的,固然應(yīng)該在技術(shù)和業(yè)務(wù)上嚴(yán)防死守,但是這都依賴(lài)技術(shù)團(tuán)隊(duì)的技術(shù)素養(yǎng),以及對(duì)業(yè)務(wù)校驗(yàn)規(guī)則的持續(xù)維護(hù),如果想要一勞永逸,那么通常我們會(huì)引入一套計(jì)費(fèi)數(shù)據(jù)補(bǔ)償系統(tǒng)。
這個(gè)計(jì)費(fèi)數(shù)據(jù)補(bǔ)償系統(tǒng),是額外獨(dú)立開(kāi)發(fā)的,我們來(lái)看看,用這個(gè)系統(tǒng)我們會(huì)實(shí)現(xiàn)哪些功能來(lái)解決剛才看到的那些問(wèn)題。
首先,從本質(zhì)上來(lái)說(shuō),我們不管具體的 B 端和 M 端的代碼邏輯是如何寫(xiě)的,第一個(gè)有一點(diǎn)是可以肯定的,那就是 B 端和 M 端是需要實(shí)現(xiàn)數(shù)據(jù)同步和最終一致的。
所以說(shuō),我們不管他們之間是通過(guò) MQ 來(lái)同步或者是什么,我們可以直接監(jiān)聽(tīng) B 端和 M 端系統(tǒng)的數(shù)據(jù)存儲(chǔ),通過(guò)定時(shí)拉取數(shù)據(jù)來(lái)實(shí)現(xiàn)比對(duì),如果一旦發(fā)現(xiàn)兩邊數(shù)據(jù)不一致,則自動(dòng)實(shí)現(xiàn)補(bǔ)償。
如下圖:
接著我們?cè)賮?lái)看第二個(gè)問(wèn)題,不管你的 M 端計(jì)費(fèi)規(guī)則的寫(xiě)入和查詢(xún)邏輯如何,最大的問(wèn)題就是你的某一次計(jì)費(fèi)結(jié)果可能并沒(méi)有按照一致和正確的計(jì)費(fèi)規(guī)則來(lái)進(jìn)行。
所以說(shuō),我們的計(jì)費(fèi)數(shù)據(jù)補(bǔ)償系統(tǒng)可以直接讓 C 端系統(tǒng)的計(jì)費(fèi)接口把每次計(jì)費(fèi)請(qǐng)求的日志上報(bào)給我們。
接著我們可以同時(shí)把 M 端系統(tǒng)的每一次計(jì)費(fèi)規(guī)則的查詢(xún)和修改日志也上報(bào)給我們,我們可以把相關(guān)日志數(shù)據(jù)存儲(chǔ)到大數(shù)據(jù)系統(tǒng)中。
接著我們就可以基于大數(shù)據(jù)技術(shù)來(lái)進(jìn)行相關(guān)系統(tǒng)的日志運(yùn)算,檢查一下每一次計(jì)費(fèi)運(yùn)算查詢(xún)多個(gè)規(guī)則的時(shí)候,是否出現(xiàn)了多個(gè)規(guī)則在短時(shí)間內(nèi)先后修改,然后導(dǎo)致使用了不一致的規(guī)則來(lái)計(jì)算的問(wèn)題。
如下圖所示:
最后就是對(duì)于運(yùn)營(yíng)可能誤操作改錯(cuò)計(jì)費(fèi)規(guī)則的問(wèn)題,我們可以拉取 C 端系統(tǒng)的每一次計(jì)費(fèi)結(jié)果,然后對(duì)計(jì)費(fèi)結(jié)果我們可以進(jìn)行環(huán)比比對(duì)校驗(yàn)。
就是說(shuō),你每一次計(jì)費(fèi)結(jié)果都可以更過(guò)去的類(lèi)似的計(jì)費(fèi)結(jié)果進(jìn)行比對(duì),如果說(shuō)差距過(guò)大,超過(guò)了 50% 的話(huà),那么就會(huì)自動(dòng)發(fā)送告警給運(yùn)營(yíng),提醒他可能出現(xiàn)了計(jì)費(fèi)額規(guī)則誤操作的問(wèn)題。
如下圖所示:
總結(jié)
通過(guò)上述的計(jì)費(fèi)數(shù)據(jù)補(bǔ)償系統(tǒng),就可以直接繞開(kāi)所有的具體計(jì)費(fèi)規(guī)則和計(jì)費(fèi)邏輯,跟 C 端系統(tǒng)、B 端系統(tǒng)、M 端系統(tǒng)完全解耦。
采用自行拉取數(shù)據(jù)、拉取日志、拉取計(jì)費(fèi)結(jié)果等手段,用大數(shù)據(jù)一類(lèi)的技術(shù)進(jìn)行各種檢測(cè),從根本上解決問(wèn)題,以此來(lái)實(shí)現(xiàn)線(xiàn)上計(jì)費(fèi)系統(tǒng)因?yàn)榧夹g(shù)問(wèn)題或者誤操作問(wèn)題導(dǎo)致的計(jì)費(fèi)錯(cuò)誤。
網(wǎng)站欄目:什么!我們開(kāi)發(fā)的計(jì)費(fèi)系統(tǒng)把公司的錢(qián)算錯(cuò)了?
文章出自:http://www.dlmjj.cn/article/djchgdp.html


咨詢(xún)
建站咨詢(xún)
