李伟山:金融撮合架构
李偉山
《架構(gòu)寶典》聯(lián)合作者
讀完需要
10
分鐘速讀僅需 4 分鐘
李偉山,某司 CTO,曾負(fù)責(zé)電商平臺(tái)、活動(dòng)營銷平臺(tái)的架構(gòu)設(shè)計(jì)研發(fā)工作,開發(fā)設(shè)計(jì)了一款云同步社交平臺(tái)——號(hào)簿管家。曾參與設(shè)計(jì)開發(fā)億萬級(jí)流量的阿里虛擬業(yè)務(wù)平臺(tái)——話費(fèi)充值、網(wǎng)游聯(lián)運(yùn)平臺(tái)。在分布式系統(tǒng)架構(gòu)設(shè)計(jì)、高并發(fā)系統(tǒng)設(shè)計(jì)、 系統(tǒng)穩(wěn)定性保障等領(lǐng)域積累了豐富的實(shí)踐經(jīng)驗(yàn),對(duì)基于 HTTP 協(xié)議的 SOA 架構(gòu)有深入研究,在排查解決線上問題和故障方面有豐富的實(shí)踐經(jīng)驗(yàn),擅于利用數(shù)據(jù)分析解決實(shí)際問題。對(duì)新技術(shù)有濃厚的興趣,并樂于分享。中生代技術(shù)、技術(shù)瑣話坐館老司機(jī);
1
? ?
概述
隨著信息技術(shù)的日新月異和金融業(yè)務(wù)的快速發(fā)展,金融交易領(lǐng)域?qū)τ诤诵募夹g(shù)的需求也在不斷增強(qiáng),國內(nèi)外金融交易模式已經(jīng)從傳統(tǒng)人工叫價(jià)的方式變成了由高度電子化交易系統(tǒng)撮合訂單的方式。傳統(tǒng)的金融交易主要發(fā)生在有型金融市場(chǎng)中,金融交易的買賣雙方通過叫價(jià)進(jìn)行價(jià)格協(xié)商等方式最終達(dá)成一致,從而形成一筆交易,同時(shí)按照交易訂單到指定的交割地點(diǎn)進(jìn)行實(shí)物交割。傳統(tǒng)的金融交易的整個(gè)過程主要依靠人來執(zhí)行,其缺點(diǎn)主要有效率低、速度慢、交易時(shí)間限制大、交易空間限制大、交易成本非常髙、容易有內(nèi)幕交易、交易擴(kuò)展性差、交易容易出錯(cuò)、資金安全性差等一系列缺點(diǎn)。
通過了解熟悉電子交易市場(chǎng)中訂單的下單流程、交易所的訂單處理機(jī)制及從訂單下達(dá)到交易所形成交易價(jià)格的過程,深入了解交易所撮合訂單的方式與機(jī)制,從而總結(jié)出交易撮合系統(tǒng)的需求,對(duì)系統(tǒng)進(jìn)行分析建模并設(shè)計(jì)系統(tǒng)架構(gòu),根據(jù)真實(shí)市場(chǎng)機(jī)制采用多層分布式體系和內(nèi)存撮合的數(shù)據(jù)存儲(chǔ)模式,構(gòu)建出一個(gè)較為完善的交易撮合系統(tǒng)。
2
? ?
系統(tǒng)總體設(shè)計(jì)
2.1
? ?
系統(tǒng)核心模塊
交易撮合系統(tǒng)中包括以下幾個(gè)核心模塊。
交易層: 用戶最終可以通過終端進(jìn)行撮合委托、委托查詢、出入金等操作。
接口層: 將用戶的商品查詢、下單等請(qǐng)求派發(fā)給業(yè)務(wù)層,并把交易詳情反饋給交易層。
業(yè)務(wù)層: 交易系統(tǒng)中的核心部分,用于接收訂單,根據(jù)業(yè)務(wù)邏輯實(shí)現(xiàn)訂單撮合,同時(shí)生成交易記錄,隨后給予用戶交易結(jié)果反饋。
數(shù)據(jù)層: 用來存儲(chǔ)商品信息、交易信息、資金信息、用戶信息,并實(shí)現(xiàn)數(shù)據(jù)持久化,
同時(shí)對(duì)交易詳情按行進(jìn)行緩存,以減輕數(shù)據(jù)庫的壓力。此外,根據(jù)不同類型的金融交易產(chǎn)品將撮合模塊劃分為若干業(yè)務(wù)分區(qū),每個(gè)分區(qū)獨(dú)立進(jìn)行撮合,彼此不受影響。對(duì)于單個(gè)業(yè)務(wù)分區(qū)而言,撮合系統(tǒng)的整體架構(gòu)設(shè)計(jì)如圖 15.1 所示。本章的總體設(shè)計(jì)圍繞業(yè)務(wù)層(撮合引擎層),以及撮合引擎與接口層(網(wǎng)關(guān)層)、數(shù)據(jù)層(數(shù)據(jù)庫)的交互方式進(jìn)行。
2.2
? ?
撮合算法設(shè)計(jì)
如圖 15.2 所示,撮合引擎的核心業(yè)務(wù)模塊就是交易撮合算法,其可以對(duì)客戶訂單進(jìn)行公平合理的排列和撮合,但是我們需要保證撮合算法的公平性、高效性及高擴(kuò)展性等。由于不同金融交易系統(tǒng)的撮合業(yè)務(wù)各有不同,因此本節(jié)僅對(duì)通用的交易撮合算法進(jìn)行概括性描述。
訂單隊(duì)列
交易撮合的重要組成部分就是買賣訂單,通過對(duì)買賣訂單進(jìn)行撮合,最后形成交易記錄,所以對(duì)無法立刻完成撮合的訂單需要有買入隊(duì)列和賣出隊(duì)列來保存訂單。隊(duì)列按照“價(jià)格優(yōu)先,同價(jià)格下時(shí)間優(yōu)先”的原則排序。買入隊(duì)列按照委托價(jià)格由高到低的順序排列, 賣出隊(duì)列則按照委托價(jià)格由低到高的順序排列,如圖 15.3 所示。
交易委托有如下四種情況。
一. 新進(jìn)的訂單是買入市價(jià)委托: 如果賣出隊(duì)列中有市價(jià)委托,則對(duì)它們進(jìn)行撮合;如果將賣出隊(duì)列中的市價(jià)委托全部進(jìn)行撮合后,該買入市價(jià)委托還有可交易數(shù)量,則將買入市價(jià)委托和賣出隊(duì)列中的限價(jià)委托進(jìn)行撮合。如果賣出隊(duì)列中沒有市價(jià)委托,則直接將買入市價(jià)委托和賣出隊(duì)列中的限價(jià)委托進(jìn)行撮合。如果賣出隊(duì)列為空, 則只將該買入市價(jià)委托插入買入隊(duì)列。
二. 新進(jìn)的訂單是買入限價(jià)委托: 如果賣出隊(duì)列中有市價(jià)委托,則先對(duì)它們進(jìn)行撮合; 如果市價(jià)委托全部撮合完畢后,該買入限價(jià)委托還存在可交易數(shù)量且價(jià)格大于等于賣出隊(duì)列中限價(jià)委托的最低價(jià)格,則繼續(xù)跟限價(jià)委托撮合。如果賣出隊(duì)列中只有限價(jià)委托且該買入委托的價(jià)格大于等于賣出隊(duì)列中的最低價(jià)格,則對(duì)它們進(jìn)行撮合, 否則只能將該買入委托按照撮合原則插入買入隊(duì)列。如果賣出隊(duì)列為空,則直接將該買入限價(jià)委托按照撮合原則插入買入隊(duì)列。
三. 新進(jìn)的訂單是賣出市價(jià)委托: 如果買入隊(duì)列中有市價(jià)委托,則先對(duì)它們進(jìn)行撮合; 如果撮合后該賣出隊(duì)列還有未成交量,則和買入隊(duì)列中限價(jià)委托撮合。如果買入隊(duì)列中僅有限價(jià)委托,則和限價(jià)委托撮合。如果買入隊(duì)列為空,則將該賣出市價(jià)委托插入賣出隊(duì)列中。
四. 新進(jìn)的訂單是賣出限價(jià)委托: 如果買入隊(duì)列中有市價(jià)委托,則先對(duì)它們進(jìn)行撮合; 如果將市價(jià)委托全部撮合完畢后,該賣出限價(jià)委托還存在可交易數(shù)量且價(jià)格小于等于買入隊(duì)列中的最高價(jià)格,則繼續(xù)跟限價(jià)委托撮合。如果買入隊(duì)列中只有限價(jià)委托 且該賣出限價(jià)委托的價(jià)格小于等于買入隊(duì)列中的最高價(jià)格,則將其進(jìn)行撮合,否則只能將該賣出限價(jià)委托按照撮合原則插入賣出隊(duì)列。如果買入隊(duì)列為空,則直接將該賣出限價(jià)委托按照撮合原則插入賣出隊(duì)列。
撮合順序
撮合引擎接收到新的買入訂單,則會(huì)到賣出隊(duì)列的頭部查找是否存在符合價(jià)格規(guī)則的賣出訂單,如果存在賣出價(jià)格小于或等于買入價(jià)格的訂單,則從隊(duì)列中取出此訂單并撮合成一筆交易;如果賣出隊(duì)列為空或隊(duì)列頭部不滿足價(jià)格關(guān)系,則將買入訂單插入買入隊(duì)列中,由于買入隊(duì)列是按照價(jià)格與時(shí)間進(jìn)行排序的,所以新插入的訂單會(huì)經(jīng)過一次排序再插入買入隊(duì)列。
相同地,當(dāng)撮合引擎接收到新的賣出訂單時(shí),會(huì)到買入隊(duì)列的頭部查找是否存在符合價(jià)格規(guī)則的買入訂單,如果存在買入價(jià)格大于或等于賣出價(jià)格的訂單,則從訂單隊(duì)列中取出此訂單并撮合成一筆交易; 如果買入隊(duì)列為空或隊(duì)列頭部不滿足價(jià)格關(guān)系,則將賣出訂單插入賣出隊(duì)列中,由于賣出隊(duì)列也是按照價(jià)格與時(shí)間進(jìn)行排序的,所以新插入的訂單會(huì)經(jīng)過一次排序再插入賣出隊(duì)列。結(jié)合買賣訂單情況,撮合算法的流程如圖 15.4 所示。從圖 15.4 所示的撮合順序可知,買賣隊(duì)列的有序性是保證撮合順序的基礎(chǔ),并且撮合過程中的每筆訂單都可以撮合出當(dāng)前最優(yōu)交易。
2.3
? ?
基于內(nèi)存撮合
當(dāng)前的數(shù)據(jù)庫撮合技術(shù)性能低下的原因在于與數(shù)據(jù)庫交互過多,使得 I/O 操作很多,系統(tǒng)整體處理速度受數(shù)據(jù)庫事務(wù)邏輯約束。
這里釆用內(nèi)存撮合技術(shù),通過最大限度地去除與數(shù)據(jù)庫的交互(如圖 15.5 所示),將整個(gè)撮合邏輯放在內(nèi)存中進(jìn)行,因此比數(shù)據(jù)庫撮合技術(shù)少了許多 I/O 操作,在性能上可以大幅提升撮合速度; 內(nèi)存撮合的弊端就是在由于內(nèi)存的易失性而使服務(wù)器出現(xiàn)故障停機(jī)時(shí),所有的交易數(shù)據(jù)將會(huì)丟失,系統(tǒng)的可靠性及一致性都會(huì)相應(yīng)降低。因此,本章在提高內(nèi)存撮合技術(shù)可靠性方面采用了多機(jī)熱備份及分布式一致性技術(shù)作為補(bǔ)充,從而獲得內(nèi)存撮合技術(shù)的高性能及數(shù)據(jù)庫撮合技術(shù)的數(shù)據(jù)持久性。
2.4
? ?
災(zāi)備的多機(jī)設(shè)計(jì)
由于內(nèi)存撮合技術(shù)在撮合引擎出現(xiàn)異常時(shí)的可靠性和一致性非常差,而金融交易系統(tǒng)因?yàn)槠錁I(yè)務(wù)特性對(duì)服務(wù)中斷及數(shù)據(jù)丟失的容忍度非常低,所以為了提高容錯(cuò)性,一般多采用多機(jī)熱備份技術(shù)。采用多機(jī)熱備份技術(shù)將一組撮合引擎部署成互為備份的撮合引擎集群, 并在同一時(shí)間內(nèi)只讓一臺(tái)撮合引擎提供服務(wù),當(dāng)這臺(tái)撮合引擎出現(xiàn)故障無法繼續(xù)正常工作時(shí),撮合引擎集群便會(huì)迅速檢測(cè)到這個(gè)故障,并選舉出一個(gè)備份撮合引擎接管故障撮合引擎的任務(wù),從而保證整個(gè)撮合系統(tǒng)正常運(yùn)行。多機(jī)熱備份技術(shù)的本質(zhì)就是針對(duì)服務(wù)器臨時(shí)故障所做的一種備份技術(shù),本章采用多機(jī)熱備份技術(shù)來避免長(zhǎng)時(shí)間的撮合服務(wù)中斷,保證撮合系統(tǒng)長(zhǎng)期、可靠的服務(wù)。如圖 15.6 所示,通過用多臺(tái)撮合引擎做熱備份來保證在撮合引擎出現(xiàn)故障時(shí),在可以接受的時(shí)間內(nèi)完成主機(jī)和備份機(jī)之間的切換,由備份機(jī)提供無縫連續(xù)服務(wù)。
通過釆用多機(jī)熱備份技術(shù),盡可能地避免了單一內(nèi)存撮合引擎發(fā)生故障時(shí)導(dǎo)致的系統(tǒng)不可用問題,但仍舊無法提供 100%的可用性,因?yàn)楫?dāng)大規(guī)模服務(wù)器集群發(fā)生故障時(shí)仍舊存在服務(wù)不可用的可能性,但在實(shí)際生產(chǎn)環(huán)境中,3 臺(tái)互為備份的服務(wù)器可以提供較高的、用于生產(chǎn)環(huán)境的可靠性。
2.5
? ?
狀態(tài)機(jī)復(fù)制
由于內(nèi)存撮合技術(shù)在撮合引擎出現(xiàn)異常時(shí)的可靠性和一致性非常差,而金融交易系統(tǒng)因?yàn)槠錁I(yè)務(wù)特性對(duì)服務(wù)中斷及數(shù)據(jù)丟失的容忍度非常低,所以為了提高容錯(cuò)性,一般多采用多機(jī)熱備份技術(shù)。采用多機(jī)熱備份技術(shù)將一組撮合引擎部署成互為備份的撮合引擎集群, 并在同一時(shí)間內(nèi)只讓一臺(tái)撮合引擎提供服務(wù),當(dāng)這臺(tái)撮合引擎出現(xiàn)故障無法繼續(xù)正常工作時(shí),撮合引擎集群便會(huì)迅速檢測(cè)到這個(gè)故障,并選舉出一個(gè)備份撮合引擎接管故障撮合引擎的任務(wù),從而保證整個(gè)撮合系統(tǒng)正常運(yùn)行。多機(jī)熱備份技術(shù)的本質(zhì)就是針對(duì)服務(wù)器臨時(shí)故障所做的一種備份技術(shù),本章采用多機(jī)熱備份技術(shù)來避免長(zhǎng)時(shí)間的撮合服務(wù)中斷,保證撮合系統(tǒng)長(zhǎng)期、可靠的服務(wù)。如圖 15.6 所示,通過用多臺(tái)撮合引擎做熱備份來保證在撮合引擎出現(xiàn)故障時(shí),在可以接受的時(shí)間內(nèi)完成主機(jī)和備份機(jī)之間的切換,由備份機(jī)提供無縫連續(xù)服務(wù)。
通過釆用多機(jī)熱備份技術(shù),盡可能地避免了單一內(nèi)存撮合引擎發(fā)生故障時(shí)導(dǎo)致的系統(tǒng)不可用問題,但仍舊無法提供 100%的可用性,因?yàn)楫?dāng)大規(guī)模服務(wù)器集群發(fā)生故障時(shí)仍舊存在服務(wù)不可用的可能性,但在實(shí)際生產(chǎn)環(huán)境中,3 臺(tái)互為備份的服務(wù)器可以提供較高的、 用于生產(chǎn)環(huán)境的可靠性。
2.6
? ?
狀態(tài)機(jī)復(fù)制
由于多機(jī)熱備份技術(shù)引入了多臺(tái)互為熱備份的撮合引擎,因此根據(jù)撮合系統(tǒng)設(shè)計(jì)及撮合邏輯要求,需要保證服務(wù)器之間的數(shù)據(jù)一致,這就需要保證多服務(wù)器之間的一致性,這也是該系統(tǒng)的難點(diǎn)之一。
在設(shè)計(jì)中使用一種內(nèi)存狀態(tài)機(jī)復(fù)制方案,即將撮合算法視作一個(gè)確定性狀態(tài)機(jī),將其復(fù)制多份并部署到撮合系統(tǒng)的多臺(tái)撮合引擎中。每個(gè)撮合引擎副本從相同的初始狀態(tài)開始運(yùn)行,當(dāng)撮合系統(tǒng)收到網(wǎng)關(guān)發(fā)來的訂單時(shí),系統(tǒng)中的每個(gè)撮合引擎都會(huì)撮合這個(gè)訂單,并依次產(chǎn)生交易記錄,同時(shí)更新確定性撮合算法狀態(tài)機(jī)的獨(dú)立狀態(tài)。通過這樣的方式,可以使每個(gè)撮合引擎副本在撮合系統(tǒng)正常運(yùn)轉(zhuǎn)時(shí)具有相同的結(jié)果狀態(tài),而在撮合系統(tǒng)出現(xiàn)故障或異常時(shí),撮合引擎就會(huì)出現(xiàn)狀態(tài)不一致的情況,換句話說,一旦撮合系統(tǒng)的結(jié)果或狀態(tài)出現(xiàn)了不一致的情況就可以斷定系統(tǒng)出現(xiàn)了異常。
一. 關(guān)鍵技術(shù)點(diǎn)系統(tǒng)為了實(shí)現(xiàn)基于內(nèi)存狀態(tài)機(jī)復(fù)制的撮合系統(tǒng),總結(jié)出撮合系統(tǒng)中的幾個(gè)關(guān)鍵技術(shù)點(diǎn):
將確定性撮合算法狀態(tài)機(jī)服務(wù)部署到多臺(tái)獨(dú)立撮合引擎中。
接收網(wǎng)關(guān)訂單,并將其作為確定性撮合算法狀態(tài)機(jī)的輸入。
根據(jù)撮合算法的需求,選擇一種訂單排序方式。
每臺(tái)撮合引擎對(duì)按照排序方式排序過的訂單進(jìn)行撮合。
將確定性撮合算法狀態(tài)機(jī)輸出的交易記錄作為給用戶或數(shù)據(jù)庫的響應(yīng)。
監(jiān)控撮合引擎副本的狀態(tài)或輸出的差別。
二. 具體實(shí)現(xiàn)為了實(shí)現(xiàn)基于內(nèi)存狀態(tài)機(jī)復(fù)制的撮合系統(tǒng),系統(tǒng)主要通過以下方案實(shí)現(xiàn)狀態(tài)機(jī)復(fù)制的關(guān)鍵技術(shù)點(diǎn):
采用原子多播解決撮合引擎訂單的可靠多播與全局有序性。
采用基于無鎖訂單隊(duì)列的流水線撮合技術(shù)提供快速的訂單撮合。
采用異步一致性持久化技術(shù)實(shí)現(xiàn)與數(shù)據(jù)庫的交互。
采用失效備援技術(shù)對(duì)撮合引擎集群進(jìn)行狀態(tài)監(jiān)控并保證系統(tǒng)的容錯(cuò)能力。
采用進(jìn)度追趕技術(shù)解決撮合引擎的故障以及添加新的撮合引擎。
三. 數(shù)據(jù)庫優(yōu)化撮合系統(tǒng)中對(duì)數(shù)據(jù)庫的查詢操作是很重要的一環(huán),查詢的性能對(duì)是否能夠擁有高效的撮合效率有很大影響。為此,對(duì)數(shù)據(jù)庫進(jìn)行查詢優(yōu)化必不可少。每個(gè)查詢都會(huì)有許多可供選擇的執(zhí)行策略和操作算法,查詢優(yōu)化就是選擇一個(gè)高效執(zhí)行的查詢處理策略。查詢的執(zhí)行開銷主要包括 I/O 開銷(磁盤存取塊數(shù))、CPU 開銷(處理機(jī)時(shí)間)、內(nèi)存開銷,其中 I/O 開銷是最主要的。為此,可以充分利用索引的方法來減少表掃描的 I/O 開銷,盡量避免表搜索的發(fā)生,例如可以在訂單表中對(duì) orderID 或 itemID 建立索引以提高查詢效率。利用好索引可以極大地提高數(shù)據(jù)庫的檢索性能,但是不能基于經(jīng)常修改的列建立索引,因?yàn)檫@樣只會(huì)增加系統(tǒng)搜索的開銷。而且由于撮合系統(tǒng)每秒鐘都需要處理大量的數(shù)據(jù),因此為了提高系統(tǒng)效率,可以盡量建立單索引提高查詢效率。(未完待續(xù))
本文節(jié)選自中生代技術(shù)社區(qū)叢書之《架構(gòu)寶典》
往期推薦
美團(tuán)技術(shù):百億規(guī)模API網(wǎng)關(guān)服務(wù)Shepherd的設(shè)計(jì)與實(shí)現(xiàn)
阿里巴巴為什么能抗住90秒100億?看完這篇你就明白了!
八戒科技服務(wù)技術(shù)負(fù)責(zé)人鴻鵠真人:做好技術(shù)負(fù)責(zé)人的4個(gè)關(guān)鍵特質(zhì)
彭榮新:喜馬拉雅自研網(wǎng)關(guān)架構(gòu)演進(jìn)過程
Google和Facebook為什么不用Docker?
追根溯源 - 數(shù)據(jù)中臺(tái)概念的起源
總結(jié)
以上是生活随笔為你收集整理的李伟山:金融撮合架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj-3641 Pseudoprime
- 下一篇: poj-1845 Sumdiv nyo