豐朋
(中國(guó)銀聯(lián)股份有限公司,上海201201)
一種插件式聯(lián)機(jī)交易處理框架
豐朋
(中國(guó)銀聯(lián)股份有限公司,上海201201)
針對(duì)交易系統(tǒng)中交易類型多、交易間耦合性大,不便于應(yīng)用開發(fā)和系統(tǒng)運(yùn)維的問題,提供了一種插件式的聯(lián)機(jī)交易處理框架,能夠靈活處理各種聯(lián)機(jī)交易,在不停應(yīng)用的情況下,可以實(shí)現(xiàn)聯(lián)機(jī)交易的新增、修改、刪除操作,不同交易互不影響,從而實(shí)現(xiàn)了一個(gè)插件式、支持“熱插拔”的交易處理系統(tǒng)。不同交易所涉及的配置信息可以在數(shù)據(jù)庫表中配置、修改,并通過加載到共享內(nèi)存實(shí)時(shí)生效,最大程度地實(shí)現(xiàn)了交易處理的靈活性和實(shí)時(shí)性。
聯(lián)機(jī)交易;熱插拔;共享內(nèi)存
伴隨著“互聯(lián)網(wǎng)+”的浪潮,越來越多的行業(yè)開始采用互聯(lián)網(wǎng)化的思維來審視自己的工作內(nèi)容和發(fā)展戰(zhàn)略,基于互聯(lián)網(wǎng)的解決方案也逐漸成為各行各業(yè)面對(duì)問題時(shí)的首選,而曾經(jīng)作為某些行業(yè)特有的一些做法或行為方式,借助互聯(lián)網(wǎng),也逐步被更多的行業(yè)接納、采用,在新的領(lǐng)域發(fā)揮出獨(dú)特的作用。聯(lián)機(jī)交易系統(tǒng),在多數(shù)人的理解中,曾經(jīng)是專指銀行的交易處理系統(tǒng),我們?nèi)粘5乃⒖ㄏM(fèi)、還款、轉(zhuǎn)賬,都與此系統(tǒng)息息相關(guān);而現(xiàn)在,聯(lián)機(jī)交易系統(tǒng)這個(gè)概念正在逐步延伸,線上一張火車票購買、一件商品的下單、一次營(yíng)銷秒殺活動(dòng)的參與,都可以說是一筆交易,而對(duì)應(yīng)的后臺(tái)系統(tǒng),都可以理解成聯(lián)機(jī)交易系統(tǒng)。行業(yè)的多樣性、用戶行為的多樣性、易變性,決定了對(duì)應(yīng)場(chǎng)景中交易的多樣性和易變性。如何在一個(gè)聯(lián)機(jī)交易系統(tǒng)中靈活處理各種交易,使得各個(gè)交易支持熱插拔式、互不影響的操作,是所有聯(lián)機(jī)交易系統(tǒng)面臨的共同問題[1-2]。
本文所提出的交易處理框架,包括數(shù)據(jù)庫、共享內(nèi)存、交易處理引擎、交易處理動(dòng)態(tài)庫四個(gè)部分,系統(tǒng)結(jié)構(gòu)圖如下所示:
圖1 系統(tǒng)結(jié)構(gòu)圖
數(shù)據(jù)庫一方面承擔(dān)了配置信息落地存儲(chǔ)的角色,聯(lián)機(jī)交易中的相關(guān)配置信息,如傳統(tǒng)銀行交易中借貸記的科目、營(yíng)銷秒殺交易中的限制規(guī)則等信息,通過管理平臺(tái)配置后,在數(shù)據(jù)庫中落地存儲(chǔ),同時(shí)可以通過管理平臺(tái)進(jìn)行增刪改查等操作;另一方面,數(shù)據(jù)庫也承擔(dān)了交易數(shù)據(jù)落地存儲(chǔ)的角色,以便實(shí)現(xiàn)交易的界面查詢、對(duì)賬報(bào)表生成等后繼功能。根據(jù)聯(lián)機(jī)交易系統(tǒng)對(duì)交易數(shù)據(jù)完整性和實(shí)時(shí)性的要求,交易數(shù)據(jù)的記錄環(huán)節(jié)可以同步記錄,也可以通過kafka等消息中間件實(shí)現(xiàn)異步記錄:交易處理服務(wù)產(chǎn)生交易記錄,作為生產(chǎn)者將交易記錄作為消息推送至消息中間件,然后有單獨(dú)的消費(fèi)者進(jìn)行將交易記錄從消息中間件上取出,存入數(shù)據(jù)庫。
共享內(nèi)存加載數(shù)據(jù)庫中存儲(chǔ)的交易配置信息,包含了交易共用的配置信息及單筆交易的個(gè)性化配置信息。聯(lián)機(jī)交易處理過程中,所有配置信息均通過各個(gè)應(yīng)用主機(jī)的共享內(nèi)存獲取,避免直接讀庫引發(fā)單點(diǎn)問題及性能問題,從而實(shí)現(xiàn)交易的高效處理。通過管理平臺(tái)修改相關(guān)配置后,可實(shí)時(shí)刷新共享內(nèi)存,達(dá)到實(shí)時(shí)生效的業(yè)務(wù)效果。本文同時(shí)提出了一種兩階段刷新的機(jī)制,保證在刷新過程中不影響聯(lián)機(jī)交易,將在第3章節(jié)詳細(xì)闡述。
交易處理引擎包含了接入/接出的通訊適配、公用的報(bào)文拆包/組包服務(wù)及具體的交易處理調(diào)度邏輯。對(duì)報(bào)文拆包后,根據(jù)獲取到的交易代碼,查找共享內(nèi)存,找到對(duì)應(yīng)的交易處理動(dòng)態(tài)庫,進(jìn)行實(shí)時(shí)動(dòng)態(tài)調(diào)度,完成交易的具體處理。
交易處理動(dòng)態(tài)庫由一系列的.so動(dòng)態(tài)庫文件組成,每個(gè)動(dòng)態(tài)庫文件對(duì)應(yīng)一種交易類型的處理。當(dāng)動(dòng)態(tài)庫文件被交易處理引擎調(diào)度時(shí),其將按照預(yù)設(shè)的邏輯,完成個(gè)性化的交易處理并返回處理結(jié)果[3]。
基于上述總體框架,系統(tǒng)的交易處理流程如下:
1)在數(shù)據(jù)庫中配置交易處理所需的各種配置信息。這些信息又分所有交易共用的配置(如清算日期、報(bào)文拆包/組包規(guī)則等)和針對(duì)每種交易的個(gè)性化配置(如借貸科目、營(yíng)銷規(guī)則等)。通過實(shí)現(xiàn)交易屬性的可配置化,極大提高了交易處理的靈活性,當(dāng)需要對(duì)個(gè)別屬性做調(diào)整或新增相關(guān)屬性時(shí),只要修改或新增相關(guān)數(shù)據(jù)庫記錄即可。
2)采用兩階段刷新機(jī)制,將配置信息加載到共享內(nèi)存。使用開放地址的哈希存儲(chǔ)算法,提高交易處理時(shí)查找相關(guān)配置的速度。當(dāng)數(shù)據(jù)庫中的配置有更新時(shí),只要刷新共享內(nèi)存,即可實(shí)現(xiàn)同步生效。
3)交易處理引擎始終處于偵聽狀態(tài),用來接收交易,進(jìn)行所有交易都必需的共性操作,然后動(dòng)態(tài)調(diào)用個(gè)性化的交易處理動(dòng)態(tài)庫,具體流程如下:
圖2 交易處理引擎流程
由于采用了動(dòng)態(tài)調(diào)用,動(dòng)態(tài)庫不是在交易處理引擎啟動(dòng)時(shí)加載的,而是在處理具體交易時(shí),根據(jù)報(bào)文關(guān)鍵域信息動(dòng)態(tài)拼接動(dòng)態(tài)庫名,然后實(shí)施調(diào)用,因此不同交易間無耦合,更新單個(gè)交易處理流程不影響交易處理引擎及其他交易處理流程的正常運(yùn)行,從而實(shí)現(xiàn)了交易處理的插件式、“熱插拔”的操作[4]。
4)交易處理動(dòng)態(tài)庫負(fù)責(zé)處理交易個(gè)性化的業(yè)務(wù)邏輯。每種交易對(duì)應(yīng)一個(gè)動(dòng)態(tài)庫,如同交易處理引擎的插件,被調(diào)用時(shí)完成各自的功能。具體流程如下:
圖3 交易處理動(dòng)態(tài)庫流程
基于本框架,可以插件式管理不同的交易處理流程,具體如下:
1)新增一種交易類型時(shí),通過編碼、編譯,發(fā)布與之對(duì)應(yīng)的交易處理動(dòng)態(tài)庫,在數(shù)據(jù)庫中增加對(duì)應(yīng)配置,然后刷新共享內(nèi)存。
2)修改一種現(xiàn)有交易處理流程時(shí),通過修改代碼、編譯,發(fā)布新的動(dòng)態(tài)庫,覆蓋原來的即可,如有必要,可更新數(shù)據(jù)庫中對(duì)應(yīng)配置,然后刷新共享內(nèi)存。
3)刪除一種現(xiàn)有交易處理流程時(shí),只要將對(duì)應(yīng)的動(dòng)態(tài)庫刪掉,將數(shù)據(jù)庫中的對(duì)應(yīng)配置刪除,然后刷新共享內(nèi)存即可。
本文提供了一種多機(jī)環(huán)境下共享內(nèi)存的同步機(jī)制,將共享內(nèi)存中的數(shù)據(jù)同步動(dòng)作分為刷新和切換兩個(gè)階段,任何一個(gè)節(jié)點(diǎn)上的數(shù)據(jù)更新能夠同步的應(yīng)用到其他節(jié)點(diǎn)上,從而保持?jǐn)?shù)據(jù)的一致性。通過共享內(nèi)存主備塊的設(shè)計(jì)和同步服務(wù)調(diào)用機(jī)制,保證了數(shù)據(jù)的同步切換及各個(gè)節(jié)點(diǎn)切換動(dòng)作的事務(wù)性(全部成功或全部失敗),并使得同步過程對(duì)系統(tǒng)運(yùn)行不產(chǎn)生影響[5]。
在本方案中,數(shù)據(jù)庫作為共享內(nèi)存中數(shù)據(jù)的來源和存儲(chǔ)點(diǎn),采用同步服務(wù)調(diào)用的方式實(shí)現(xiàn)多機(jī)間的通信。每個(gè)節(jié)點(diǎn)上的共享內(nèi)存包含結(jié)構(gòu)完全相同的主塊和備塊,并能相互切換[6-7]。共享內(nèi)存系統(tǒng)框圖如下:
圖4 共享內(nèi)存系統(tǒng)框圖
共享內(nèi)存刷新流程如下:
1)系統(tǒng)初始化時(shí),首先配置數(shù)據(jù)庫,然后每個(gè)節(jié)點(diǎn)讀取數(shù)據(jù)庫中的數(shù)據(jù),加載到內(nèi)存中的主塊和備塊中,并激活主塊。此時(shí)各個(gè)節(jié)點(diǎn)上共享內(nèi)存的數(shù)據(jù)是一致的。
2)系統(tǒng)運(yùn)行過程中,任意一個(gè)節(jié)點(diǎn)可能接收到來自外部的數(shù)據(jù)輸入,這些數(shù)據(jù)的處理結(jié)果可能會(huì)要求共享內(nèi)存中的數(shù)據(jù)發(fā)生變化。此種情況下,接收外部數(shù)據(jù)的節(jié)點(diǎn)首先把要變化的共享內(nèi)存數(shù)據(jù)更新到數(shù)據(jù)庫中。也可能該節(jié)點(diǎn)本身并未對(duì)數(shù)據(jù)庫中的數(shù)據(jù)產(chǎn)生改變,只是收到了數(shù)據(jù)庫中數(shù)據(jù)發(fā)生變化、需要重新刷新共享內(nèi)存的通知。
3)該節(jié)點(diǎn)通過同步服務(wù)調(diào)用的方式,通知其本身和其他節(jié)點(diǎn)根據(jù)最新的數(shù)據(jù)庫數(shù)據(jù)刷新共享內(nèi)存?zhèn)鋲K。由于各個(gè)節(jié)點(diǎn)的運(yùn)行環(huán)境和性能的差別,每個(gè)節(jié)點(diǎn)的刷新動(dòng)作可能消耗不同的時(shí)間。該步驟結(jié)束后,各個(gè)節(jié)點(diǎn)上共享內(nèi)存的備塊保存了最新的、與數(shù)據(jù)庫一致的數(shù)據(jù)[8]。同步服務(wù)調(diào)用可以通過自身系統(tǒng)的編碼實(shí)現(xiàn),也可以通過中間件實(shí)現(xiàn)。
4)該節(jié)點(diǎn)再通過同步服務(wù)調(diào)用的方式,通知其本身和其他節(jié)點(diǎn)切換共享內(nèi)存,即激活備塊成為主塊,原來的主塊變成備塊。由于切換的動(dòng)作只涉及修改內(nèi)存中的一個(gè)標(biāo)志位,可以認(rèn)為各個(gè)節(jié)點(diǎn)同時(shí)實(shí)現(xiàn)切換。該步驟之后,各個(gè)節(jié)點(diǎn)使用最新的共享內(nèi)存數(shù)據(jù),且與數(shù)據(jù)庫保持了一致。
本文提供的插件式聯(lián)機(jī)交易處理框架具有靈活、高效的特點(diǎn),交易間的耦合性小,易于不同的人同時(shí)開發(fā),同時(shí)交易的修改、增加、刪除操作方便、快捷,易于維護(hù),生產(chǎn)穩(wěn)定性高。
[1]李林峰.分布式服務(wù)框架原理與實(shí)踐[M].北京:電子工業(yè)出版社,2016:1-25.
[2]柳偉衛(wèi).分布式系統(tǒng)常用技術(shù)及案例分析[M].北京:電子工業(yè)出版社,2017:52-83.
[3]StevensW R.Unix環(huán)境高級(jí)編程[M].戚正偉,張亞英,尤晉元,譯.北京:人民郵電出版社,2014:147-168.
[4]王磊.微服務(wù)架構(gòu)與實(shí)踐[M].北京:電子工業(yè)出版社,2015:41-69.
[5]Stevens W R.UNIX網(wǎng)絡(luò)編程卷2進(jìn)程間通信[M].北京:人民郵電出版社,2015:244-259.
[6]白文榮.軟件工程與設(shè)計(jì)模式[M].北京:清華大學(xué)出版社, 2017:128-156.
[7]秦小波.設(shè)計(jì)模式之禪[M].北京:機(jī)械工業(yè)出版社,2014:58-64.
[8]Erich Gamma.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].李英軍,譯.北京:機(jī)械工業(yè)出版社,2014:35-70.
TP311.52
A
1009-3044(2017)21-0001-02
2017-06-08
豐朋(1983—),男,山東日照人,中級(jí)工程師,碩士,主要研究方向?yàn)榻鹑谟?jì)算機(jī)工程。