豐朋
(中國銀聯(lián)股份有限公司,上海201201)
一種插件式聯(lián)機(jī)交易處理框架
豐朋
(中國銀聯(lián)股份有限公司,上海201201)
針對交易系統(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)了一個插件式、支持“熱插拔”的交易處理系統(tǒng)。不同交易所涉及的配置信息可以在數(shù)據(jù)庫表中配置、修改,并通過加載到共享內(nèi)存實(shí)時生效,最大程度地實(shí)現(xiàn)了交易處理的靈活性和實(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è)面對問題時的首選,而曾經(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)這個概念正在逐步延伸,線上一張火車票購買、一件商品的下單、一次營銷秒殺活動的參與,都可以說是一筆交易,而對應(yīng)的后臺系統(tǒng),都可以理解成聯(lián)機(jī)交易系統(tǒng)。行業(yè)的多樣性、用戶行為的多樣性、易變性,決定了對應(yīng)場景中交易的多樣性和易變性。如何在一個聯(lián)機(jī)交易系統(tǒng)中靈活處理各種交易,使得各個交易支持熱插拔式、互不影響的操作,是所有聯(lián)機(jī)交易系統(tǒng)面臨的共同問題[1-2]。
本文所提出的交易處理框架,包括數(shù)據(jù)庫、共享內(nèi)存、交易處理引擎、交易處理動態(tài)庫四個部分,系統(tǒng)結(jié)構(gòu)圖如下所示:
圖1 系統(tǒng)結(jié)構(gòu)圖
數(shù)據(jù)庫一方面承擔(dān)了配置信息落地存儲的角色,聯(lián)機(jī)交易中的相關(guān)配置信息,如傳統(tǒng)銀行交易中借貸記的科目、營銷秒殺交易中的限制規(guī)則等信息,通過管理平臺配置后,在數(shù)據(jù)庫中落地存儲,同時可以通過管理平臺進(jìn)行增刪改查等操作;另一方面,數(shù)據(jù)庫也承擔(dān)了交易數(shù)據(jù)落地存儲的角色,以便實(shí)現(xiàn)交易的界面查詢、對賬報表生成等后繼功能。根據(jù)聯(lián)機(jī)交易系統(tǒng)對交易數(shù)據(jù)完整性和實(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ù)庫中存儲的交易配置信息,包含了交易共用的配置信息及單筆交易的個性化配置信息。聯(lián)機(jī)交易處理過程中,所有配置信息均通過各個應(yīng)用主機(jī)的共享內(nèi)存獲取,避免直接讀庫引發(fā)單點(diǎn)問題及性能問題,從而實(shí)現(xiàn)交易的高效處理。通過管理平臺修改相關(guān)配置后,可實(shí)時刷新共享內(nèi)存,達(dá)到實(shí)時生效的業(yè)務(wù)效果。本文同時提出了一種兩階段刷新的機(jī)制,保證在刷新過程中不影響聯(lián)機(jī)交易,將在第3章節(jié)詳細(xì)闡述。
交易處理引擎包含了接入/接出的通訊適配、公用的報文拆包/組包服務(wù)及具體的交易處理調(diào)度邏輯。對報文拆包后,根據(jù)獲取到的交易代碼,查找共享內(nèi)存,找到對應(yīng)的交易處理動態(tài)庫,進(jìn)行實(shí)時動態(tài)調(diào)度,完成交易的具體處理。
交易處理動態(tài)庫由一系列的.so動態(tài)庫文件組成,每個動態(tài)庫文件對應(yīng)一種交易類型的處理。當(dāng)動態(tài)庫文件被交易處理引擎調(diào)度時,其將按照預(yù)設(shè)的邏輯,完成個性化的交易處理并返回處理結(jié)果[3]。
基于上述總體框架,系統(tǒng)的交易處理流程如下:
1)在數(shù)據(jù)庫中配置交易處理所需的各種配置信息。這些信息又分所有交易共用的配置(如清算日期、報文拆包/組包規(guī)則等)和針對每種交易的個性化配置(如借貸科目、營銷規(guī)則等)。通過實(shí)現(xiàn)交易屬性的可配置化,極大提高了交易處理的靈活性,當(dāng)需要對個別屬性做調(diào)整或新增相關(guān)屬性時,只要修改或新增相關(guān)數(shù)據(jù)庫記錄即可。
2)采用兩階段刷新機(jī)制,將配置信息加載到共享內(nèi)存。使用開放地址的哈希存儲算法,提高交易處理時查找相關(guān)配置的速度。當(dāng)數(shù)據(jù)庫中的配置有更新時,只要刷新共享內(nèi)存,即可實(shí)現(xiàn)同步生效。
3)交易處理引擎始終處于偵聽狀態(tài),用來接收交易,進(jìn)行所有交易都必需的共性操作,然后動態(tài)調(diào)用個性化的交易處理動態(tài)庫,具體流程如下:
圖2 交易處理引擎流程
由于采用了動態(tài)調(diào)用,動態(tài)庫不是在交易處理引擎啟動時加載的,而是在處理具體交易時,根據(jù)報文關(guān)鍵域信息動態(tài)拼接動態(tài)庫名,然后實(shí)施調(diào)用,因此不同交易間無耦合,更新單個交易處理流程不影響交易處理引擎及其他交易處理流程的正常運(yùn)行,從而實(shí)現(xiàn)了交易處理的插件式、“熱插拔”的操作[4]。
4)交易處理動態(tài)庫負(fù)責(zé)處理交易個性化的業(yè)務(wù)邏輯。每種交易對應(yīng)一個動態(tài)庫,如同交易處理引擎的插件,被調(diào)用時完成各自的功能。具體流程如下:
圖3 交易處理動態(tài)庫流程
基于本框架,可以插件式管理不同的交易處理流程,具體如下:
1)新增一種交易類型時,通過編碼、編譯,發(fā)布與之對應(yīng)的交易處理動態(tài)庫,在數(shù)據(jù)庫中增加對應(yīng)配置,然后刷新共享內(nèi)存。
2)修改一種現(xiàn)有交易處理流程時,通過修改代碼、編譯,發(fā)布新的動態(tài)庫,覆蓋原來的即可,如有必要,可更新數(shù)據(jù)庫中對應(yīng)配置,然后刷新共享內(nèi)存。
3)刪除一種現(xiàn)有交易處理流程時,只要將對應(yīng)的動態(tài)庫刪掉,將數(shù)據(jù)庫中的對應(yīng)配置刪除,然后刷新共享內(nèi)存即可。
本文提供了一種多機(jī)環(huán)境下共享內(nèi)存的同步機(jī)制,將共享內(nèi)存中的數(shù)據(jù)同步動作分為刷新和切換兩個階段,任何一個節(jié)點(diǎn)上的數(shù)據(jù)更新能夠同步的應(yīng)用到其他節(jié)點(diǎn)上,從而保持?jǐn)?shù)據(jù)的一致性。通過共享內(nèi)存主備塊的設(shè)計(jì)和同步服務(wù)調(diào)用機(jī)制,保證了數(shù)據(jù)的同步切換及各個節(jié)點(diǎn)切換動作的事務(wù)性(全部成功或全部失敗),并使得同步過程對系統(tǒng)運(yùn)行不產(chǎn)生影響[5]。
在本方案中,數(shù)據(jù)庫作為共享內(nèi)存中數(shù)據(jù)的來源和存儲點(diǎn),采用同步服務(wù)調(diào)用的方式實(shí)現(xiàn)多機(jī)間的通信。每個節(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ù)據(jù)庫,然后每個節(jié)點(diǎn)讀取數(shù)據(jù)庫中的數(shù)據(jù),加載到內(nèi)存中的主塊和備塊中,并激活主塊。此時各個節(jié)點(diǎn)上共享內(nèi)存的數(shù)據(jù)是一致的。
2)系統(tǒng)運(yùn)行過程中,任意一個節(jié)點(diǎn)可能接收到來自外部的數(shù)據(jù)輸入,這些數(shù)據(jù)的處理結(jié)果可能會要求共享內(nèi)存中的數(shù)據(jù)發(fā)生變化。此種情況下,接收外部數(shù)據(jù)的節(jié)點(diǎn)首先把要變化的共享內(nèi)存數(shù)據(jù)更新到數(shù)據(jù)庫中。也可能該節(jié)點(diǎn)本身并未對數(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。由于各個節(jié)點(diǎn)的運(yùn)行環(huán)境和性能的差別,每個節(jié)點(diǎn)的刷新動作可能消耗不同的時間。該步驟結(jié)束后,各個節(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)存,即激活備塊成為主塊,原來的主塊變成備塊。由于切換的動作只涉及修改內(nèi)存中的一個標(biāo)志位,可以認(rèn)為各個節(jié)點(diǎn)同時實(shí)現(xiàn)切換。該步驟之后,各個節(jié)點(diǎn)使用最新的共享內(nèi)存數(shù)據(jù),且與數(shù)據(jù)庫保持了一致。
本文提供的插件式聯(lián)機(jī)交易處理框架具有靈活、高效的特點(diǎn),交易間的耦合性小,易于不同的人同時開發(fā),同時交易的修改、增加、刪除操作方便、快捷,易于維護(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)境高級編程[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—),男,山東日照人,中級工程師,碩士,主要研究方向?yàn)榻鹑谟?jì)算機(jī)工程。