吳義芝
摘 要:本文論述了養(yǎng)老管理信息綜合系統(tǒng)中軟件容錯(cuò)技術(shù)的應(yīng)用,主要討論了各種容錯(cuò)技術(shù)在系統(tǒng)中的應(yīng)用,最后對(duì)整個(gè)系統(tǒng)的容錯(cuò)進(jìn)行了總結(jié)。
關(guān)鍵詞:容錯(cuò),集群,主備,冗余
目前我國已經(jīng)進(jìn)入到老齡化社會(huì),老齡人口逐年增長,按照老齡辦提供的數(shù)字,現(xiàn)在中國的老年人口已經(jīng)達(dá)到 2.48 億,與之增加的養(yǎng)老消費(fèi)人均三千元左右,從整個(gè)養(yǎng)老產(chǎn)業(yè)的規(guī)模來看,估算在 2025年要增加到五萬億規(guī)模,市場前景巨大。隨著互聯(lián)網(wǎng)的迅猛發(fā)展,各行各業(yè)都在進(jìn)行著互聯(lián)網(wǎng)+的嘗試。其中,養(yǎng)老領(lǐng)域更迫切需要解決養(yǎng)老專業(yè)化程度低、信息化不足、健康照護(hù)水平滯后等一系列亟待解決的問題。
由于我們公司在醫(yī)療行業(yè)領(lǐng)域有著豐富的成功經(jīng)驗(yàn),同時(shí),近些年在養(yǎng)老領(lǐng)域也成功實(shí)施過很多成熟的案例。一期投資方出資 3600 萬,委托我司進(jìn)行這款綜合性養(yǎng)老管理平臺(tái)的開發(fā)工作。我在該項(xiàng)目中擔(dān)任系統(tǒng)架構(gòu)設(shè)計(jì)師,主要負(fù)責(zé)應(yīng)用系統(tǒng)的軟件架構(gòu)設(shè)計(jì)和中間件選型。該系統(tǒng)以養(yǎng)老為主線,其中包括養(yǎng)老檔案、照護(hù)計(jì)劃、服務(wù)審計(jì)、狀況跟蹤、費(fèi)用管理、決策支持等方面的30多個(gè)業(yè)務(wù)功能模塊組成。
經(jīng)過前期對(duì)全國幾十家養(yǎng)老機(jī)構(gòu)和相關(guān)合作的醫(yī)療單位的調(diào)研分析,結(jié)合原有的經(jīng)驗(yàn),對(duì)整個(gè)系統(tǒng)業(yè)務(wù)進(jìn)行詳細(xì)規(guī)劃和相關(guān)設(shè)備的初步選型,即我們內(nèi)部所說的“兩版三端”的方案,機(jī)構(gòu)養(yǎng)老和社區(qū)養(yǎng)老兩個(gè)子系統(tǒng),同時(shí)能夠在 PC 端,PAD 端,手機(jī)端三端進(jìn)行呈現(xiàn)和交互。提高軟件系統(tǒng)可靠性技術(shù)主要分為容錯(cuò)技術(shù)和避錯(cuò)技術(shù),容錯(cuò)技術(shù)的主要方式為冗余,冗余又分為結(jié)構(gòu)冗余、時(shí)間冗余、信息冗余,冗余附加。結(jié)構(gòu)冗余又分為靜態(tài)冗余、動(dòng)態(tài)冗余和混合冗余。軟件容錯(cuò)技術(shù)主要有 N版本程序設(shè)計(jì),恢復(fù)塊方法,和防衛(wèi)式程序設(shè)計(jì)。結(jié)合互聯(lián)網(wǎng)軟件的性質(zhì),我主要采用了集群技術(shù)、數(shù)據(jù)庫主從方式、和程序設(shè)計(jì)方面來進(jìn)行軟件的容錯(cuò)與避錯(cuò)處理。下面就從以上三方面詳細(xì)討論我所采用的容錯(cuò)技術(shù)和方法。
1、通過集群技術(shù)來容錯(cuò)
平臺(tái)中的各服務(wù)如果在運(yùn)行時(shí)部署在一臺(tái)服務(wù)器上,那么當(dāng)服務(wù)器發(fā)生故障,整個(gè)平臺(tái)將不能再提供任何服務(wù)。所以一般非常小規(guī)模的應(yīng)用才會(huì)采取這樣的部署方式,像互聯(lián)網(wǎng)應(yīng)用這樣的支付平臺(tái)來說必須采用多機(jī)同時(shí)部署的方式,防止單臺(tái)服務(wù)器宕機(jī)或者服務(wù)進(jìn)程 Crash導(dǎo)致整個(gè)平臺(tái)不能提供服務(wù)的問題。通過多機(jī)同時(shí)部署,當(dāng)一臺(tái)服務(wù)出現(xiàn)問題時(shí),可以很容易替換一臺(tái)新服務(wù)器進(jìn)行重新部署生效,通過服務(wù)客戶端的軟負(fù)載均衡功能,可動(dòng)態(tài)剔除不可用服務(wù)機(jī)器,動(dòng)態(tài)發(fā)現(xiàn)新加入集群的服務(wù)機(jī)器,使平臺(tái)在出現(xiàn)故障時(shí)可平滑過渡,達(dá)到容錯(cuò)的目的。另外平臺(tái)中各服務(wù)當(dāng)首次獲取到的不易變的靜態(tài)數(shù)據(jù)會(huì)將其存入非本地緩存中,例如采用了 rediscluster 技術(shù),可以很好的保證寫入緩存中的數(shù)據(jù)獲取的高可靠性,恰當(dāng)使用緩存不但會(huì)提升平臺(tái)性能,同時(shí)還可以起到容錯(cuò)的效果,例如當(dāng)某個(gè)服務(wù)所依賴的后端存儲(chǔ)發(fā)生了短時(shí)的故障或者網(wǎng)絡(luò)抖動(dòng),在這個(gè)時(shí)候大量的并發(fā)請(qǐng)求發(fā)現(xiàn)存儲(chǔ)獲取失敗直接從緩存中獲取將數(shù)據(jù)返回給調(diào)用方,起到了很好的容錯(cuò)效果。
2、通過數(shù)據(jù)庫主從部署方式來容錯(cuò)
對(duì)于該平臺(tái)來說,所依賴的后端數(shù)據(jù)庫存儲(chǔ)的穩(wěn)定性是非常非常重要的,所有的老人檔案、照護(hù)計(jì)劃、當(dāng)前狀態(tài)等等數(shù)據(jù)將直接存儲(chǔ)到數(shù)據(jù)庫中。如果數(shù)據(jù)庫在運(yùn)行過程中頻繁宕機(jī),那么帶來的問題將是不能容忍的,因?yàn)闀?huì)造成老人檔案,護(hù)理步驟出錯(cuò)等等問題,所以在這里就要求數(shù)據(jù)庫存儲(chǔ)要具有非常高的可靠性,同時(shí)具有很強(qiáng)的容錯(cuò)性,在這里我主要采用了數(shù)據(jù)庫的部署結(jié)構(gòu)為主從式方式,要求部署在不同服務(wù)器上,在不出問題的情況下對(duì)于一些時(shí)效性要求不是很高的場合從庫可以負(fù)責(zé)承擔(dān)一部分讀流量,當(dāng)主庫發(fā)生讀寫問題時(shí),可快速由其他的從庫升級(jí)為主庫,繼續(xù)服務(wù),達(dá)到容錯(cuò)的效果。在這里我還采用了要求數(shù)據(jù)庫宕機(jī)加報(bào)警的方式來防止宕機(jī)的主從數(shù)據(jù)庫實(shí)例過多,導(dǎo)致在并發(fā)高的情況下沒有可用的從庫升級(jí)為主庫提供服務(wù),通過這樣的方式也提高了整個(gè)平臺(tái)的高可靠性。數(shù)據(jù)庫的數(shù)據(jù)文件存儲(chǔ)這里我也要求采用了 RAID 磁盤容錯(cuò)技術(shù)來防止單塊磁盤損壞導(dǎo)致的數(shù)據(jù)文件丟失問題。
3、通過程序設(shè)計(jì)方面進(jìn)行軟件的容錯(cuò)與避錯(cuò)。
根據(jù)以往的架構(gòu)經(jīng)驗(yàn),那么系統(tǒng)的不可靠大部分是由于程序內(nèi)部的設(shè)計(jì)或者網(wǎng)絡(luò)請(qǐng)求參數(shù)的配置或者連接池參數(shù)的配置不當(dāng)所導(dǎo)致的。所以通過程序設(shè)計(jì)方面進(jìn)行軟件的容錯(cuò)是非常重要的。在程序設(shè)計(jì)方面的容錯(cuò)用的最普遍的就是防衛(wèi)式程序設(shè)計(jì),例如養(yǎng)老平臺(tái)中的結(jié)算模塊,當(dāng)在支付的過程中調(diào)用賬戶服務(wù)來進(jìn)行賬戶金額扣減的時(shí)候,勢必會(huì)調(diào)用賬戶服務(wù)傳遞請(qǐng)求對(duì)象來處理,如果說賬戶服務(wù)在被調(diào)用的這一刻網(wǎng)絡(luò)抖動(dòng)或者丟包的情況下,這個(gè)時(shí)候一鍵支付聚合服務(wù)必然會(huì)收到拋出的錯(cuò)誤信息,如果沒有通過恰當(dāng)?shù)娜蒎e(cuò)處理,那么這次一鍵支付必然會(huì)給用戶顯示支付失敗,不太友好,在這里我采用了 TRYCATCH機(jī)制加 3次重試的容錯(cuò)處理機(jī)制,就解決了該次支付因網(wǎng)絡(luò)抖動(dòng)導(dǎo)致的支付失敗問題。平臺(tái)采用的是微服務(wù)的架構(gòu)風(fēng)格,那么在服務(wù)之間的通訊過程中涉及到數(shù)據(jù)的傳遞,這里我采用了在數(shù)據(jù)傳輸協(xié)議的頭部加 CRC碼來做到對(duì)錯(cuò)誤數(shù)據(jù)處理的避錯(cuò)。
通過項(xiàng)目組全體成員的不懈努力,整個(gè)項(xiàng)目開發(fā)歷時(shí) 7 個(gè)月,系統(tǒng)已經(jīng)順利通過驗(yàn)收并如期上線。通過采用了以上容錯(cuò)技術(shù)的方法和措施后,平臺(tái)從上線運(yùn)行到目前為止,各服務(wù)運(yùn)行狀態(tài)良好,到目前運(yùn)行穩(wěn)定并得到用戶的一致好評(píng)。不足之處有兩個(gè)方面,1.各服務(wù)間調(diào)用事物一致性問題的容錯(cuò)處理。針對(duì)該問題,目前只能保證事物的最終一致性,因?yàn)楦鶕?jù) CAP 理論,要解決該問題確實(shí)存在一定的難度,后面我準(zhǔn)備研究下 TCC事物處理方式尤其適合支付平臺(tái)場景,爭取在不損失性能的前提下最大限度解決分布式事物的一致性問題。2.目前所采用的最大努力推送型事物服務(wù)依賴 MQ重復(fù)消息的問題。針對(duì)該問題我采用加了一張消息處理表的方式來解決,當(dāng)收到消息的時(shí)候,先查詢該條消息是否已經(jīng)處理,如果沒有處理直接進(jìn)行處理并將其進(jìn)行記錄,防止重復(fù)處理導(dǎo)致支付數(shù)據(jù)出錯(cuò)。我會(huì)在今后的架構(gòu)設(shè)計(jì)過程中,不斷更新自己的知識(shí),不斷完善自己的架構(gòu)設(shè)計(jì)領(lǐng)域,設(shè)計(jì)出更好的軟件架構(gòu),更好的支撐業(yè)務(wù)平臺(tái)的運(yùn)行,提高公司的競爭力,為公司為社會(huì)盡一份綿薄之力。