潘舟
分布式的產(chǎn)生背景
一直以來(lái),金融IT采用傳統(tǒng)的集中式系統(tǒng),比如銀行核心系統(tǒng)往往使用較高配置的大型機(jī),通過(guò)軟硬件的不斷優(yōu)化,在應(yīng)對(duì)傳統(tǒng)業(yè)務(wù)時(shí)一般還是游刃有余的。但是隨著業(yè)務(wù)發(fā)展特別是電子商務(wù)浪潮的襲來(lái),集中式系統(tǒng)的性能遇到真正的考驗(yàn),如天弘基金跟阿里合作剛開(kāi)始只是把系統(tǒng)跟余額寶的渠道對(duì)接,交易量得到明顯的提升,但隨之而來(lái)的就是原有的系統(tǒng)無(wú)法支撐這么大的業(yè)務(wù)量,后續(xù)只能應(yīng)用分布式技術(shù)進(jìn)行重構(gòu)。互聯(lián)網(wǎng)競(jìng)爭(zhēng)激烈并且發(fā)展迅速,與傳統(tǒng)銀行不同的業(yè)務(wù)差異、成本控制等因素要求其積極實(shí)施分布式IT架構(gòu)轉(zhuǎn)型;當(dāng)前銀行競(jìng)爭(zhēng)也在不斷加劇,傳統(tǒng)銀行的業(yè)務(wù)和技術(shù)已經(jīng)不局限在金融領(lǐng)域,我們銀行IT人員也要向互聯(lián)網(wǎng)企業(yè)進(jìn)行深入學(xué)習(xí)。
為什么要學(xué)習(xí)分布式呢?通過(guò)技術(shù)角度來(lái)說(shuō)明,以數(shù)據(jù)庫(kù)為例,如果一張Oracle數(shù)據(jù)庫(kù)中的表,數(shù)據(jù)量超過(guò)5000萬(wàn)甚至上億,一個(gè)SQL的執(zhí)行時(shí)間就有可能花費(fèi)幾分鐘,如果并發(fā)量再大的話,系統(tǒng)基本就癱瘓;另外,這種量級(jí)的流水要日終處理,如果是一臺(tái)機(jī)器的話,即使其滿(mǎn)負(fù)荷運(yùn)行,到第二天開(kāi)門(mén)也可能處理不完。這種數(shù)據(jù)量在我們傳統(tǒng)的業(yè)務(wù)模式下基本上是不會(huì)遇到的,但在互聯(lián)網(wǎng)的模式下卻是必須要面對(duì)的。Oracle數(shù)據(jù)庫(kù)應(yīng)對(duì)數(shù)據(jù)量在2000萬(wàn)以下的表還是沒(méi)有問(wèn)題的,如果超過(guò)這個(gè)量就會(huì)面對(duì)比較大的挑戰(zhàn),即使升級(jí)硬件資源也很難根本解決。
銀行為什么要用分布式
1. 業(yè)務(wù)場(chǎng)景的需要
當(dāng)前大家常用的互聯(lián)網(wǎng)產(chǎn)品有個(gè)顯著的特點(diǎn):大并發(fā)、大數(shù)據(jù)量。這種現(xiàn)象早期也是很大的問(wèn)題,要解決這個(gè)問(wèn)題能想出最好的方案就是將大的拆成小的,然后再并行處理。其實(shí)就像這樣一個(gè)例子:一個(gè)大型的任務(wù)要在規(guī)定的時(shí)間內(nèi)完成,是找一個(gè)很牛的人來(lái)干,還是找一堆普通的人一起來(lái)干的道理是一樣的。這個(gè)機(jī)制其實(shí)就是分布式的理念,所以說(shuō)分布式給互聯(lián)網(wǎng)業(yè)務(wù)場(chǎng)景提供了一個(gè)非常好的技術(shù)手段。
2. 性能及高可用的需要
在分布式的機(jī)制下,如果任務(wù)量大了,只需要增加執(zhí)行節(jié)點(diǎn)就可以解決問(wèn)題,執(zhí)行節(jié)點(diǎn)多了,整體的處理能力和性能都會(huì)提升;還有一點(diǎn)很關(guān)鍵,分布式是多個(gè)節(jié)點(diǎn)一起工作的,如果其中的一個(gè)節(jié)點(diǎn)出現(xiàn)問(wèn)題,其只影響很小的一部分(況且容錯(cuò)機(jī)制還會(huì)把這個(gè)節(jié)點(diǎn)的工作分解到其他節(jié)點(diǎn)上執(zhí)行),但如果是集中式系統(tǒng),其如果出問(wèn)題將是全局性的,這其實(shí)體現(xiàn)的是系統(tǒng)的整體可用性上的差別。
3. 成本的需要
集中式系統(tǒng)對(duì)單體資源的要求比較高,就好比要找一個(gè)牛人,如果任務(wù)很重,就必須換成更牛的人,但高端資源的成本將是成指數(shù)型上升,況且在一定情況下,即使付出很高的成本也未必可以找的到。如果用分布式的機(jī)制來(lái)處理,其需要的是普通的資源,只是數(shù)量的多少問(wèn)題,一般情況下一個(gè)高端資源的成本要遠(yuǎn)遠(yuǎn)大于多個(gè)普通資源的成本之和。所以,在互聯(lián)網(wǎng)模式下采用分布式的成本投入是要小于集中式的。
4. 安全自主可控的需要
銀監(jiān)會(huì)對(duì)銀行信息化建設(shè)提出了“安全自主可控”的要求,由于集中式架構(gòu)對(duì)硬件及數(shù)據(jù)庫(kù)的依賴(lài)非常高,并且有一定的安全隱患,所以要達(dá)到銀監(jiān)會(huì)的要求,就必須對(duì)系統(tǒng)進(jìn)行架構(gòu)層面的調(diào)整。分布式通過(guò)用多個(gè)普通的硬件一起工作來(lái)替代一個(gè)集中式的高端資源,是解決這個(gè)問(wèn)題的一個(gè)非常好的手段。
銀行分布式的應(yīng)用領(lǐng)域
1. 服務(wù)層的分布式
應(yīng)用的邏輯處理節(jié)點(diǎn)能力不足,比如銀行的業(yè)務(wù)受理節(jié)點(diǎn)、賬務(wù)處理節(jié)點(diǎn)等,因?yàn)槎嗲蓝嘞到y(tǒng)需要調(diào)用該服務(wù),瓶頸有壓力時(shí)就可以考慮對(duì)服務(wù)層的能力進(jìn)行拓展,增加對(duì)外系統(tǒng)的支撐能力。
具體做法上,保證應(yīng)用可以按需增加實(shí)例節(jié)點(diǎn),應(yīng)對(duì)應(yīng)用層的高并發(fā)壓力;同時(shí)支持微服務(wù)的運(yùn)行機(jī)制。
2. 數(shù)據(jù)層的分布式
大業(yè)務(wù)量是如今系統(tǒng)的必然趨勢(shì),大業(yè)務(wù)量對(duì)于銀行系統(tǒng)來(lái)說(shuō)代表著大數(shù)據(jù)量,如何高效地保存和讀取數(shù)據(jù)也是分布式的一個(gè)重要課題。文章最開(kāi)始的例子已經(jīng)做了簡(jiǎn)單介紹,應(yīng)對(duì)億級(jí)數(shù)據(jù)的挑戰(zhàn),銀行需要采用分庫(kù)的機(jī)制,不僅降低了每個(gè)庫(kù)中的數(shù)據(jù)量,而且增加了數(shù)據(jù)存入與讀取的使用效率。
3. 緩存層的分布式
我們一方面考慮并使用分庫(kù)來(lái)持久保存數(shù)據(jù),另一方面也要針對(duì)臨時(shí)數(shù)據(jù)進(jìn)行緩存機(jī)制的優(yōu)化。針對(duì)應(yīng)用處理中需要使用到更多的非落地?cái)?shù)據(jù),引入分布式緩存的機(jī)制,將公共數(shù)據(jù)臨時(shí)數(shù)據(jù)緩存化,可以大大縮短交易的單筆響應(yīng)時(shí)間。
4. 日終計(jì)算層面的分布式
傳統(tǒng)銀行在日終需要進(jìn)行核心跑批,往往都要幾個(gè)小時(shí),在關(guān)鍵日期如年終結(jié)算時(shí)由于計(jì)算數(shù)據(jù)量更大耗時(shí)更久,對(duì)銀行系統(tǒng)壓力較大。采用分布式的機(jī)制進(jìn)行日終的計(jì)算密集型處理(結(jié)息、計(jì)提等),多臺(tái)機(jī)器、多臺(tái)數(shù)據(jù)庫(kù)全部參與運(yùn)行,保證日終的執(zhí)行時(shí)間控制在一個(gè)合理的范圍內(nèi)。
以上4層的分布式,都可以根據(jù)實(shí)際情況通過(guò)擴(kuò)展物理節(jié)點(diǎn)來(lái)提升其對(duì)應(yīng)的處理能力。當(dāng)然,初期可以將物理節(jié)點(diǎn)控制在一個(gè)相對(duì)較小的范圍,到時(shí)機(jī)成熟的時(shí)候再進(jìn)行擴(kuò)展。也就是在這個(gè)體系下,即保證了系統(tǒng)的先進(jìn)性,又可以合理的控制風(fēng)險(xiǎn),還可以保證系統(tǒng)的長(zhǎng)期可持續(xù)發(fā)展。
總結(jié)與展望
當(dāng)前背景下的主要挑戰(zhàn)是高并發(fā)、大數(shù)據(jù)量,也就是主要矛盾。我們用分布式解決這個(gè)主要矛盾的時(shí)候,由于系統(tǒng)在設(shè)計(jì)、開(kāi)發(fā)和運(yùn)維層面比以前復(fù)雜,可能帶來(lái)一些其他問(wèn)題。但是,不能因?yàn)檫@些影響就放棄使用分布式,否則主要矛盾就解決不了。針對(duì)不完善的地方,我們將更加積極的投入分布的研究,哪里需要提供橫向伸縮的機(jī)制,哪里就可以考慮使用分布式。