——我對(duì)公司機(jī)房數(shù)據(jù)處理流程的改造體會(huì)
公司第三方代收水費(fèi)前置機(jī)程序開(kāi)發(fā)肇始于2014年。當(dāng)時(shí)因?yàn)橹挥朽]政一家接入,所以采用的數(shù)據(jù)流處理方式為串行,如圖1所示,流程為3個(gè)步驟:接受請(qǐng)求、處理請(qǐng)求、返回結(jié)果。
這個(gè)處理方式對(duì)于“一對(duì)一”的請(qǐng)求沒(méi)有任何問(wèn)題,除了效率上差一些外起碼不會(huì)出現(xiàn)問(wèn)題。但是隨著公司更多的第三方平臺(tái)的接入,這種串行處理方式就暴漏出它的問(wèn)題了,最致命的弱點(diǎn)恰恰就在一對(duì)一這個(gè)問(wèn)題上?!耙粚?duì)一”的意思就是同一時(shí)刻只處理一個(gè)業(yè)務(wù)請(qǐng)求,只有等數(shù)據(jù)全部處理完成后,才會(huì)再接受另一個(gè)請(qǐng)求;但是處理請(qǐng)求是需要時(shí)間的,如果在處理請(qǐng)求期間有另外一個(gè)平臺(tái)的業(yè)務(wù)請(qǐng)求到來(lái),那么就會(huì)被丟棄從而出現(xiàn)賬務(wù)問(wèn)題。這就是為什么在新接入了建行、農(nóng)行、微信公眾號(hào)、微信生活繳費(fèi)、支付寶生活繳費(fèi)、移動(dòng)荷包等第三方平臺(tái)之后不斷出現(xiàn)了賬務(wù)問(wèn)題的原因所在。
問(wèn)題既然找到了,那么要怎么解決呢?對(duì)于需要同一時(shí)刻處理多個(gè)請(qǐng)求的問(wèn)題,唯一的解決辦法是改串行處理方式為并行方式,如圖2所示,前置機(jī)程序同時(shí)接受多個(gè)業(yè)務(wù)請(qǐng)求并且處理。從原理來(lái)說(shuō)很簡(jiǎn)單,但是對(duì)于程序的改造來(lái)說(shuō)工程量卻是十分巨大。這就好比你要把一棟2層樓的房子改造成20層樓的高樓,唯一的辦法就是推倒重來(lái)。為此,要想把串行方式改為并行方式,就需要對(duì)原來(lái)的程序進(jìn)行幾乎推倒重來(lái)的大改進(jìn)。
經(jīng)過(guò)4個(gè)月的努力,程序的重構(gòu)終于完成,代碼80%以上被重寫(xiě),數(shù)據(jù)處理流程參見(jiàn)圖3,當(dāng)有業(yè)務(wù)請(qǐng)求到來(lái)的時(shí)候首先由接受請(qǐng)求進(jìn)程將請(qǐng)求數(shù)據(jù)緩存到相應(yīng)的業(yè)務(wù)數(shù)據(jù)緩沖區(qū)中,然后分別由具體的業(yè)務(wù)處理進(jìn)程從緩沖區(qū)中獲取到請(qǐng)求數(shù)據(jù),并作相應(yīng)處理,完成后將請(qǐng)求處理結(jié)果返回給請(qǐng)求者。
從圖3可以看出重構(gòu)后的程序中,一共采取了5個(gè)進(jìn)程,分別是“接受請(qǐng)求進(jìn)程,交費(fèi)處理進(jìn)程,沖正處理進(jìn)程和2個(gè)查詢處理進(jìn)程”這里使用2個(gè)查詢處理進(jìn)程是因?yàn)閺囊酝娜罩痉治鲋械贸霾樵儤I(yè)務(wù)量遠(yuǎn)遠(yuǎn)多于其他的業(yè)務(wù)量。并且這5個(gè)進(jìn)程是獨(dú)立運(yùn)行的,相互之間沒(méi)有直接的制約關(guān)系。同時(shí)為了避免出現(xiàn)數(shù)據(jù)丟失的情況,我還使用了3個(gè)數(shù)據(jù)緩沖區(qū),既查詢請(qǐng)求數(shù)據(jù)緩沖區(qū)、交費(fèi)請(qǐng)求數(shù)據(jù)緩沖區(qū)、沖正請(qǐng)求數(shù)據(jù)緩沖區(qū),具體的業(yè)務(wù)處理進(jìn)程通過(guò)讀取緩沖區(qū)中的數(shù)據(jù)來(lái)處理,不直接從接受請(qǐng)求進(jìn)程獲取數(shù)據(jù),并且采用先進(jìn)先出的原則,保證先到達(dá)的數(shù)據(jù)先處理。
重構(gòu)后的前置機(jī)程序經(jīng)過(guò)半年來(lái)的穩(wěn)定運(yùn)行,已經(jīng)完全做到了當(dāng)初我所設(shè)想的,通過(guò)重構(gòu)使因?yàn)榍爸脵C(jī)程序本身構(gòu)架問(wèn)題所造成的錯(cuò)誤率降為零。因?yàn)槭褂昧硕嗑€程技術(shù),從而使程序在性能上得到了質(zhì)的飛躍,更重要的是給負(fù)責(zé)第三方對(duì)帳的同事減輕了不少不必要的工作量,另外,通過(guò)這次重構(gòu)我也從中學(xué)到了不少新東西,使我的編程思想得到了刷新。(信息設(shè)備科:常健林)