付霞
(上海杉達(dá)學(xué)院,信息學(xué)院, 上海 201209)
目前我國(guó)的金融系統(tǒng)領(lǐng)域電子化趨勢(shì)領(lǐng)跑全球,支付電子化已深入到我們老百姓日常生活的方方面面,可以說(shuō),我們的日常生活已經(jīng)離不開(kāi)電子化的支付方式了,因此支付領(lǐng)域的安全與高可用已經(jīng)上升到國(guó)家安全層面了,每個(gè)金融機(jī)構(gòu)在監(jiān)管的要求下,都在不遺余力的提升自己系統(tǒng)的安全性與穩(wěn)定性[1],確保系統(tǒng)的高可用。同時(shí),面對(duì)日趨激烈的市場(chǎng)競(jìng)爭(zhēng)環(huán)境,各金融機(jī)構(gòu)還需要確保自己系統(tǒng)的客戶體驗(yàn)要好,以免造成客戶的流失。因此,各機(jī)構(gòu)電子銀行渠道針對(duì)客戶開(kāi)放的渠道也是越來(lái)越多,就拿普通的城商行來(lái)說(shuō),目前至少存在以下渠道[2]:微信、支付寶、銀聯(lián)、客服、電話銀行、手機(jī)銀行、網(wǎng)上銀行、柜面、ATM、短信。同時(shí),金融機(jī)構(gòu)內(nèi)部還存在類似核心系統(tǒng)、客戶管理系統(tǒng)、審批系統(tǒng)、授信系統(tǒng)、差錯(cuò)調(diào)賬系統(tǒng)等等各類功能性系統(tǒng),這些系統(tǒng)往往都是獨(dú)立的子系統(tǒng),各系統(tǒng)需要與前端渠道進(jìn)行交互,同時(shí)各系統(tǒng)之間又存在互相調(diào)用的情況。而為了保證各系統(tǒng)核心部分功能的獨(dú)立性,往往都會(huì)建設(shè)一套獨(dú)立的前置系統(tǒng)(FES),該系統(tǒng)主要負(fù)責(zé)報(bào)文的路由控制、通訊協(xié)議轉(zhuǎn)換、報(bào)文格式轉(zhuǎn)換、事務(wù)一致性控制、分對(duì)總接入、密鑰等安全管理等[3-4]。該系統(tǒng)作為各系統(tǒng)的入口,控制著各系統(tǒng)的流量,因此該系統(tǒng)的健壯性及高可用對(duì)于金融機(jī)構(gòu)的業(yè)務(wù)開(kāi)展至關(guān)重要。
如圖1所示,渠道端對(duì)接客戶或內(nèi)部工作人員,將不同的業(yè)務(wù)轉(zhuǎn)成不同的聯(lián)機(jī)交易發(fā)送至FES的不同通信模塊,通常FES支持的通信方式有TCP長(zhǎng)連接(單雙工)、TCP短連接、HTTP(S)、MQ等[4],通信模塊將接收到的完整報(bào)文發(fā)送至路由模塊的消息隊(duì)列[5-6];路由模塊根據(jù)不同的業(yè)務(wù)類型將報(bào)文轉(zhuǎn)發(fā)至不同的業(yè)務(wù)處理模塊所對(duì)應(yīng)的消息隊(duì)列中;各業(yè)務(wù)模塊完成相應(yīng)的業(yè)務(wù)邏輯處理后,將報(bào)文發(fā)送至對(duì)應(yīng)核心系統(tǒng)的通信模塊的消息隊(duì)列中,通信模塊負(fù)責(zé)將報(bào)文送至對(duì)應(yīng)的核心業(yè)務(wù)系統(tǒng),完成請(qǐng)求報(bào)文的整個(gè)鏈路。核心業(yè)務(wù)系統(tǒng)處理完請(qǐng)求報(bào)文后,通常會(huì)有響應(yīng)報(bào)文返回,而且響應(yīng)報(bào)文一般需要按照原路進(jìn)行返回如圖2所示。
圖1 FCS常見(jiàn)架構(gòu)
其中FES各進(jìn)程之間通過(guò)消息隊(duì)列進(jìn)行信息交互,業(yè)務(wù)處理模塊需要跟數(shù)據(jù)庫(kù)進(jìn)行交互。
FES的功能主要是路由控制、通信協(xié)議轉(zhuǎn)換、報(bào)文格式轉(zhuǎn)換、事務(wù)一致性控制、分對(duì)總接入、密鑰管理。因?yàn)榛緵](méi)有業(yè)務(wù)數(shù)據(jù)需要保存,那么FES使用數(shù)據(jù)庫(kù)的主要目的是為了滿足其中的路由控制和事務(wù)一致性控制功能需要。
以其中的路由控制為例,因?yàn)橐_保交易的原路返回,所以在接收到請(qǐng)求報(bào)文時(shí)需要將請(qǐng)求的信息先記錄到數(shù)據(jù)庫(kù)中(需要進(jìn)行insert和update操作),響應(yīng)報(bào)文回來(lái)時(shí),需要通過(guò)查詢數(shù)據(jù)庫(kù)來(lái)匹配到原請(qǐng)求報(bào)文(需要select操作),進(jìn)而找到響應(yīng)報(bào)文的返回路由信息進(jìn)行原路返回,如圖2所示。
圖2 交易鏈路及數(shù)據(jù)庫(kù)交互
雪崩效應(yīng)[7]通常指的是:起初只是一個(gè)小小的擾動(dòng),但是事態(tài)發(fā)展越來(lái)越嚴(yán)重,往往成幾何級(jí)數(shù)增長(zhǎng)。而對(duì)于一個(gè)IT系統(tǒng)來(lái)說(shuō),當(dāng)一筆業(yè)務(wù)所經(jīng)過(guò)的鏈路中出現(xiàn)A資源等待時(shí),會(huì)造成該筆業(yè)務(wù)耗時(shí)過(guò)長(zhǎng),同時(shí)后續(xù)業(yè)務(wù)因此出現(xiàn)排隊(duì)等待現(xiàn)象,因后續(xù)業(yè)務(wù)也需要占用其他的系統(tǒng)資源如B、C等,進(jìn)而造成B、C資源的不足,最終導(dǎo)致整個(gè)系統(tǒng)各模塊均不可用,這就是IT系統(tǒng)的雪崩效應(yīng)。
而FES的運(yùn)行需要依賴硬件、操作系統(tǒng)平臺(tái)及數(shù)據(jù)庫(kù),一般來(lái)說(shuō),因?yàn)橛布梢愿鶕?jù)需要進(jìn)行升級(jí),操作系統(tǒng)一般不會(huì)是IT系統(tǒng)的瓶頸,所以對(duì)于FES來(lái)說(shuō),數(shù)據(jù)庫(kù)往往是瓶頸所在,也是雪崩效應(yīng)產(chǎn)生的根源(對(duì)于某些業(yè)務(wù),可能會(huì)使用到加密機(jī),加密機(jī)往往也是瓶頸所在,本文不討論對(duì)于加密機(jī)訪問(wèn)瓶頸的優(yōu)化)。
如圖3所示,當(dāng)數(shù)據(jù)庫(kù)響應(yīng)慢的時(shí)候,路由模塊還會(huì)持續(xù)不斷往消息隊(duì)列B發(fā)送報(bào)文,如果消息隊(duì)列B被堵滿的話,路由模塊則無(wú)法繼續(xù)工作;進(jìn)而導(dǎo)致消息隊(duì)列A的報(bào)文無(wú)法處理,這又會(huì)導(dǎo)致消息隊(duì)列A被堵滿;進(jìn)而導(dǎo)致通信模塊無(wú)法繼續(xù)工作,通信模塊如果是短連接的話,因?yàn)閳?bào)文沒(méi)能及時(shí)返回,進(jìn)而導(dǎo)致連接池資源很快被占滿,這個(gè)時(shí)候整個(gè)FES將無(wú)法對(duì)外提供服務(wù),產(chǎn)生雪崩效應(yīng)。
圖3 FES雪崩效應(yīng)圖
通過(guò)上面的說(shuō)明可以看出,F(xiàn)ES系統(tǒng)之所以會(huì)產(chǎn)生瓶頸及雪崩效應(yīng),主要在于鏈路上存在資源依賴,尤其是數(shù)據(jù)庫(kù)資源,而一旦數(shù)據(jù)庫(kù)資源得不到滿足,整個(gè)鏈路都被迫處于等待。這時(shí)我們把數(shù)據(jù)庫(kù)與應(yīng)用之間的交互機(jī)制稱為同步機(jī)制。
同步就相當(dāng)于是當(dāng)客戶端發(fā)送請(qǐng)求給服務(wù)端,在等待服務(wù)端響應(yīng)的請(qǐng)求時(shí),客戶端不做其他的事情。異步就是當(dāng)客戶端發(fā)送給服務(wù)端請(qǐng)求時(shí),在等待服務(wù)端響應(yīng)的時(shí)候,客戶端可以做其他的事情。
如果FES的數(shù)據(jù)庫(kù)訪問(wèn)能夠?qū)⑼綑C(jī)制轉(zhuǎn)換為異步機(jī)制[8],那么就可以解決FES目前碰到的問(wèn)題了。
要解決FES的同步轉(zhuǎn)異步的問(wèn)題,需要解決以下2個(gè)問(wèn)題。
(1) 業(yè)務(wù)數(shù)據(jù)的低敏
同步轉(zhuǎn)異步以后,那么也就意味著原業(yè)務(wù)在數(shù)據(jù)庫(kù)操作可能失敗的情況下會(huì)繼續(xù)進(jìn)行,也就是要保證這些業(yè)務(wù)數(shù)據(jù)丟失也不會(huì)對(duì)業(yè)務(wù)造成賬務(wù)上的影響。而FES系統(tǒng)因?yàn)槭寝D(zhuǎn)接系統(tǒng),不直接保留業(yè)務(wù)數(shù)據(jù),所以,即使是insert或commit失敗,也僅僅是應(yīng)答報(bào)文回來(lái)后,select不到原交易而無(wú)法正常返回,丟失一筆交易。而金融IT系統(tǒng)對(duì)此類異常情況都會(huì)有對(duì)賬與調(diào)賬機(jī)制相配套,因此FES對(duì)于業(yè)務(wù)數(shù)據(jù)來(lái)說(shuō)是屬于低敏的。
(2) 緩存機(jī)制
同步要轉(zhuǎn)異步,那么必須要有緩存機(jī)制,在數(shù)據(jù)庫(kù)響應(yīng)慢時(shí)將所有的數(shù)據(jù)庫(kù)操作先緩存起來(lái)。比較簡(jiǎn)單輕量化的緩存機(jī)制可以采用Linux操作系統(tǒng)提供的消息隊(duì)列。
雖然通過(guò)緩存機(jī)制解決了偶爾數(shù)據(jù)庫(kù)響應(yīng)慢的情況,但是還存在更極端的情況如數(shù)據(jù)庫(kù)長(zhǎng)時(shí)間響應(yīng)慢或者不可用的話,這時(shí)也會(huì)導(dǎo)致應(yīng)用與數(shù)據(jù)庫(kù)之間設(shè)立的緩存空間被占滿,進(jìn)而導(dǎo)致系統(tǒng)完全不可用狀態(tài),所以,如果能夠使用雙數(shù)據(jù)庫(kù)來(lái)進(jìn)行熱備的話,則可進(jìn)一步提高系統(tǒng)的健壯性和高可用性。
原FES業(yè)務(wù)處理模塊與數(shù)據(jù)庫(kù)之間交互是通過(guò)數(shù)據(jù)庫(kù)本身提供的API進(jìn)行交互。新的架構(gòu)里面,F(xiàn)ES業(yè)務(wù)處理模塊將根據(jù)新增的數(shù)據(jù)庫(kù)管理模塊設(shè)計(jì)提供的API進(jìn)行報(bào)文組裝,并且將組裝好的報(bào)文發(fā)送到消息隊(duì)列,不直接與數(shù)據(jù)庫(kù)管理模塊進(jìn)行通信。數(shù)據(jù)庫(kù)管理模塊通過(guò)從消息隊(duì)列獲取需要處理的報(bào)文,并優(yōu)先將數(shù)據(jù)庫(kù)請(qǐng)求發(fā)往主數(shù)據(jù)庫(kù)進(jìn)行處理。如果數(shù)據(jù)庫(kù)管理模塊判斷當(dāng)前主數(shù)據(jù)庫(kù)狀態(tài)異常,則后續(xù)將數(shù)據(jù)庫(kù)請(qǐng)求發(fā)往備數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)管理模塊根據(jù)設(shè)定的時(shí)間對(duì)狀態(tài)異常的主數(shù)據(jù)庫(kù)再次進(jìn)行判定。其中主數(shù)據(jù)庫(kù)一般使用比較大型的商用數(shù)據(jù)庫(kù)軟件,如Oracle、DB2、Informix等。備數(shù)據(jù)庫(kù)一般采用開(kāi)源免費(fèi)的內(nèi)存數(shù)據(jù)庫(kù),如SQLite[9]等。備數(shù)據(jù)庫(kù)一般是在主數(shù)據(jù)庫(kù)狀態(tài)異常時(shí)才會(huì)暫時(shí)接管數(shù)據(jù)庫(kù)請(qǐng)求。對(duì)于響應(yīng)報(bào)文回來(lái)的select操作,一般也是優(yōu)先到主數(shù)據(jù)庫(kù)中進(jìn)行查詢,如果搜索不到則到備數(shù)據(jù)庫(kù)中再次進(jìn)行查詢。
為了提高業(yè)務(wù)處理能力,數(shù)據(jù)庫(kù)管理模塊會(huì)根據(jù)業(yè)務(wù)量動(dòng)態(tài)地對(duì)直接與數(shù)據(jù)庫(kù)進(jìn)行交互的進(jìn)程DBAP的數(shù)量進(jìn)行管理(見(jiàn)圖4),每個(gè)DBAP都會(huì)采用競(jìng)爭(zhēng)模式從同一個(gè)消息隊(duì)列里面獲取報(bào)文并與數(shù)據(jù)庫(kù)進(jìn)行交互后,將獲得的數(shù)據(jù)庫(kù)返回信息按照約定的API進(jìn)行報(bào)文組裝,并發(fā)送到指定的消息隊(duì)列中。每個(gè)DBAP都具有與雙數(shù)據(jù)庫(kù)進(jìn)行通信的能力,所以將這些DBAP的組合稱為雙數(shù)據(jù)庫(kù)下的數(shù)據(jù)庫(kù)連接池。
圖4 數(shù)據(jù)庫(kù)同步轉(zhuǎn)異步的設(shè)計(jì)架構(gòu)圖
本文主要介紹了金融系統(tǒng)中非常常見(jiàn)的一種IT系統(tǒng)前置系統(tǒng)的常見(jiàn)架構(gòu)模式,基于該架構(gòu)模式下,又說(shuō)明了數(shù)據(jù)庫(kù)訪問(wèn)性能瓶頸會(huì)導(dǎo)致的整個(gè)系統(tǒng)的雪崩效應(yīng)是如何產(chǎn)生的,為了解決這種性能瓶頸與雪崩效應(yīng)現(xiàn)象,分析了原因并指出通過(guò)將數(shù)據(jù)庫(kù)的訪問(wèn)模式從同步轉(zhuǎn)成異步即可,而為了對(duì)數(shù)據(jù)庫(kù)進(jìn)行同步轉(zhuǎn)異步,又說(shuō)明了必須具備的前提條件,最后,提出了解決方案并對(duì)解決方案進(jìn)行了詳細(xì)闡述。同時(shí),本解決方案所提出的問(wèn)題解決思路在前置類系統(tǒng)中很多需要調(diào)用外部資源的場(chǎng)景下都有較好的通用性,如加密機(jī)資源瓶頸等。