轉(zhuǎn)載自:https://yq.aliyun.com/articles/60653
摘要:?撮合技術(shù)主要是從數(shù)據(jù)庫撮合技術(shù)向內(nèi)存撮合技術(shù)發(fā)展胡岔,這是因為數(shù)據(jù)庫撮合技術(shù)越來越無法滿足金融交易對于高可靠性搏存、高性能、強安全性抛虏、可擴展性以及易維護性的需求院领。本文來自中生代技術(shù)群的34期分享抱怔,將和大家討論基于內(nèi)存的撮合的系統(tǒng)設(shè)計窿春。
概述
隨著信息技術(shù)的日新月異和金融業(yè)務(wù)的快速發(fā)展,金融交易領(lǐng)域?qū)τ诤诵募夹g(shù)的求也在不斷增強,國內(nèi)外金融交易模式已經(jīng)從傳統(tǒng)的人工叫價的方式變成了由高度電子化交易系統(tǒng)撮合訂單的方式佣耐。傳統(tǒng)的金融交易主要發(fā)生在有型金融市場中,金融交易的買賣雙方通過叫價進行價格協(xié)商等方式最終達成一致,從而形成一筆交易,同時按照交易訂單到指定的交割地點進行實物交割的交易方式政勃。由于交易的整個過程主要依靠人來執(zhí)行,傳統(tǒng)的金融交易缺點主要有:效率低速度慢、交易時間限制大兼砖、交易空間限制大奸远、交易成本非常髙、容易有內(nèi)幕交易讽挟、交易擴展性差懒叛、交易容易出錯、資金安全性差等一系列的缺點耽梅。
時代不斷變遷,金融交易通過與計算機技術(shù)的結(jié)合,走上了電子化交易的道路,通過將金融交易市場電子化,電子交易不僅消除了傳統(tǒng)金融交易的種種弊端,也促進了現(xiàn)代金融業(yè)的快速發(fā)展薛窥。電子金融交易的主要優(yōu)點有:交易效率高速度快、交易透明度高褐墅、交易成本低拆檬、系統(tǒng)安全性高、不受交易時間的限制妥凳、不受交易空間的限制竟贯、可以進行多方位的擴展、大力推動現(xiàn)代金融業(yè)發(fā)展等逝钥。
因此現(xiàn)在電子交易己經(jīng)成為了金融交易市場的主流交易方式屑那。隨著交易人數(shù)拱镐、筆數(shù)的不斷增加,系統(tǒng)承受著越來越大的壓力,如果在交易時間內(nèi)系統(tǒng)發(fā)生故障,造成的損失往往不可估量。因此發(fā)出更可靠更高效的電子交易系統(tǒng)己經(jīng)成為了金融交易領(lǐng)域的當(dāng)務(wù)之急持际。
撮合交易在金融交易系統(tǒng)中扮演者非常重要的角色沃琅。了解撮合交易的本質(zhì)以及業(yè)務(wù)對于設(shè)計撮合系統(tǒng)至關(guān)重要。江蘇大泰技術(shù)有限公司蜘欲,致力于互聯(lián)網(wǎng)金融平臺的開發(fā)益眉,目前已經(jīng)在運行的平臺有大宗交易、普洱茶交易系統(tǒng)姥份,后期會發(fā)布連續(xù)現(xiàn)貨和發(fā)售交易平臺郭脂,接下來為大家介紹基于內(nèi)存的撮合交易系統(tǒng)設(shè)計概要。
系統(tǒng)總體設(shè)計
2.1 層次設(shè)計
一般而言,金融交易撮合系統(tǒng)中包括以下幾個核心模塊:
用戶:終端用戶委托報價與數(shù)量,生成訂單發(fā)送至交易平臺澈歉。
網(wǎng)關(guān):負(fù)責(zé)收集用戶訂單,并將其派發(fā)給撮合引擎展鸡。
撮合引擎:交易系統(tǒng)中的核心部分,用于接收訂單并根據(jù)業(yè)務(wù)邏輯實現(xiàn)訂單?? 撮合同時生成交易記錄,隨后給予用戶交易結(jié)果反饋。
數(shù)據(jù)庫:用來存放交易過程中的訂單和交易記錄,實現(xiàn)數(shù)據(jù)持久化埃难。
此外,本文根據(jù)不同類型的金融交易展品將撮合模塊劃分為若干業(yè)務(wù)分區(qū),每個分區(qū)獨立進行撮合,彼此不受影響莹弊。對于單個業(yè)務(wù)分區(qū)而言,撮合系統(tǒng)整體架構(gòu)設(shè)計如圖1.2所示,本章的總體設(shè)計圍繞撮合引擎層以及撮合引擎與網(wǎng)關(guān)層、數(shù)據(jù)庫層的交互方式的總體設(shè)計涡尘。
2.2 撮合交易算法
如圖2.1所示,撮合引擎的核心業(yè)務(wù)模塊就是撮合交易算法撮合交易算法的任務(wù)一方面是完成對客戶所下訂單進行公平合理的排列和撮合功能,也要保證撮合算法的公平性忍弛、高效性以及擴展性等。由于不同金融交易系統(tǒng)的撮合業(yè)務(wù)各有不同,因此本節(jié)對通用的撮合交易算法進行概括性描述悟衩。
2.2.1 訂單隊列
撮合交易的重要組成部分就是買賣訂單,通過對買賣訂單進行撮合最后形成交易記錄剧罩。所以對無法立刻完成撮合的訂單,需要有買入隊列和賣出隊列保存訂單。隊列按照“價格優(yōu)先座泳、同價格下時間優(yōu)先”的原則惠昔。買入隊列按照委托價格從低到高的順序,賣出隊列則按照委托價格從低到高的順序排列,如圖
2.2.2撮合順序
撮合引擎接收到新的買入訂單,則會到賣出隊列的頭部查找是否存在符合價格規(guī)則的賣出訂單,如果存在賣出價格小于或等于買入價格的訂單,則從隊列中取出此訂單并撮合成一筆交易;如果賣出隊列為空或隊列頭部不滿足價格關(guān)系,則將買入訂單插入買入隊列中,由于買入隊列是按照價格與時間先后進行排序,所以新插入的訂單會經(jīng)過一次排序插入到買入隊列的相應(yīng)位置。
相同的,當(dāng)撮合引擎接收到新的賣出訂單,則會到買入隊列的頭部査找是否存在符合價格規(guī)則的買入訂單,如果存在買入價格大于或等于賣出價格的訂單,則從訂單隊列中取出此訂單并撮合成一筆交易;如果買入隊列為空或隊列頭部不滿足價格關(guān)系,則將賣出訂單插入到賣出隊列中,由于賣出隊列也是按照價格與時間先后進行排序的所以新插入的訂單會經(jīng)過一次排序插入到賣出隊列的相應(yīng)位置[23]挑势。
結(jié)合買賣訂單情況,撮合算法流程如圖2.3所示镇防。從圖2.3所示的撮合順序可知,買賣隊列的有序性是保證撮合順序的確定性的基礎(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ù)庫的交互過程,將整個錯和邏輯放在內(nèi)存中進行(如圖2.4所示)来氧。因此比數(shù)據(jù)庫撮合技術(shù)少了許多I/O交S 間,在性能上可以大幅提升撮合速度;例是內(nèi)存撮合的弊端就是由于內(nèi)存的易失性,.?服務(wù)器出現(xiàn)故障停機時,所有的交易數(shù)據(jù)將會丟失,系統(tǒng)的可靠性以及一致性都相應(yīng)人幅降低。因此本文在提高內(nèi)存撮合技術(shù)可靠性的方面采用丫多機熱備份及分布式一致性技術(shù)作為補充,從而獲得內(nèi)存撮合技術(shù)的高性能以及數(shù)據(jù)庫撮合技術(shù)的數(shù)據(jù)持久性香拉。
2.4 多機熱備份
由于內(nèi)存撮合技術(shù)在撮合引攀出現(xiàn)異常時的可靠性和一致性非常差,而金融交場系統(tǒng)因為其業(yè)務(wù)特性,對服務(wù)小斷以及數(shù)據(jù)丟失的容忍度非常低,>//提高容錯性,一般多采取的是多機熱條份技術(shù)啦扬。本文采用多機熱備份技術(shù),將一組撮合引樂部署成互為備份的撮合引擎集群,并且在同一時間內(nèi)只有一臺撮合引擎提供服務(wù)。當(dāng)-其中運行這的一臺撮六引擎出現(xiàn)故障無法繼續(xù)正常工作 ,撮合引擎貓群會迅速檢測到這個故障,并選舉出一個備份撮合引擎接管故障撮合引舉的任務(wù)從而保證整個撮合系統(tǒng)的正常運行多機熱備份技術(shù)的本質(zhì)就足針對服務(wù)器臨時故障所做的一種備份技術(shù),本文迎過采用多機熱備份技術(shù),來避免長 間的撮合服務(wù)中斷,保證撮合系統(tǒng)長期凫碌、可靠的服務(wù)扑毡。如閣2.5所示,通過將多臺撮合引擎進行熱格份,從而保證在撮合引擎出現(xiàn)故障時,會在可以接受的時間內(nèi)完成主機和備機之間的切換,由備份機提供無縫連續(xù)服務(wù)。
通過釆用多機熱備份技術(shù),降低了單一內(nèi)存撮合引擎故障時系統(tǒng)不可用的問題,但仍舊無法提供100%的可用性,因為當(dāng)出現(xiàn)大規(guī)模服務(wù)器集群故障時,仍舊存在服務(wù)不可用的可能性,但在實際生產(chǎn)環(huán)境中,三臺互為備份的服務(wù)器就可以提供較高的可以用于生產(chǎn)環(huán)境的可靠性盛险。
2.5 內(nèi)存狀態(tài)機復(fù)制
由于多機熱備份技術(shù)引入了多臺互為熱備份的撮合引擎,根據(jù)撮合系統(tǒng)設(shè)計以及撮合邏輯要求,需要保證服務(wù)器之間的數(shù)據(jù)一致,這就需要保證多服務(wù)器之間一致性,這也是本文難點之一瞄摊。
本文提出一種內(nèi)存狀態(tài)機復(fù)制方案,即將撮合算法視作一個確定性狀態(tài)機,將其復(fù)制多份并部署到撮合系統(tǒng)中的多臺撮合引擎中勋又。每個撮合引擎副本從相同的初始狀態(tài)開始運行,當(dāng)撮合系統(tǒng)收到網(wǎng)關(guān)發(fā)來的訂單時,系統(tǒng)中的每個撮合引擎都會撮合這個訂單,并依次產(chǎn)生交易記錄,同時更新確定性撮合算法狀態(tài)機的獨立狀態(tài)。通過這樣的方式,當(dāng)撮合系統(tǒng)正常運轉(zhuǎn)時,每個撮合引擎副本都會具有相同的結(jié)果狀態(tài);當(dāng)撮合系統(tǒng)出現(xiàn)故障或異常時,撮合引擎就會出現(xiàn)狀態(tài)的不一致情況,換句話說一旦撮合系統(tǒng)的結(jié)果或狀態(tài)出現(xiàn)了不一致的情況就可以斷定系統(tǒng)出現(xiàn)了異常换帜。
2.5.1 關(guān)鍵技術(shù)點
本文為了實現(xiàn)這樣的內(nèi)存狀態(tài)機復(fù)制撮合系統(tǒng),將撮合系統(tǒng)劃分為以下組成關(guān)鍵技術(shù)點
將確定性撮合算法狀態(tài)機服務(wù)部署到多個獨立撮合引擎
接收網(wǎng)關(guān)訂單,并作為確定性撮合算法狀態(tài)機的輸入
根據(jù)撮合算法需求,選擇一種訂單排序方式
每個撮合引擎對按照排序方式排序過的訂單進行撮合
將確定性撮合算法狀態(tài)機輸出的交易記錄作為給用戶或數(shù)據(jù)庫的響應(yīng)
監(jiān)控撮合引擎副本的狀態(tài)或輸出的差別
2.5.2 實現(xiàn)方案
為實現(xiàn)基于內(nèi)存狀態(tài)機復(fù)制的撮合系統(tǒng),本文主要通過以下方案實現(xiàn)狀態(tài)機復(fù)制的關(guān)鍵技術(shù)點:
采用原子多播解決撮合引擎訂單的可靠多播與全局有序性
采用基于無鎖訂單隊列的流水線撮合技術(shù)提供快速的訂單撮合
采用異步一致性持久化技術(shù)實現(xiàn)與數(shù)據(jù)庫的交互【3】
采用失效備援技術(shù)對撮合引擎集群進行狀態(tài)監(jiān)控并保證系統(tǒng)的容錯能;^[24][3115)采用進度追趕技術(shù)解決將故障撮合引擎的恢復(fù)或新撮合引擎的加入
2.6 系統(tǒng)架構(gòu)
2.6.1 系統(tǒng)硬件體系架構(gòu)
典型的高可靠高性能撮合模型硬件架構(gòu)如圖2.6所示,系統(tǒng)由n臺客戶端楔壤、N臺網(wǎng)關(guān)、X個產(chǎn)品集群(每個集群由2至3臺撮合引擎組成,負(fù)責(zé)響應(yīng)產(chǎn)品訂單的處理)惯驼、一個交易記錄數(shù)據(jù)庫和可選的監(jiān)視系統(tǒng)組成蹲嚣。其中客戶端連接到相應(yīng)網(wǎng)關(guān),網(wǎng)關(guān)負(fù)責(zé)接收客戶端提交的訂單,并根據(jù)訂單相關(guān)的金融產(chǎn)品類別,轉(zhuǎn)發(fā)到相對應(yīng)的產(chǎn)品集群。產(chǎn)品集群中所有撮合引擎均接收網(wǎng)關(guān)發(fā)送的訂單,根據(jù)撮合業(yè)務(wù)規(guī)則,將其撮合并回饋消息給網(wǎng)關(guān)和客戶端,同時將撮合生成的交易記錄持久化到交易記錄數(shù)據(jù)庫中跳座。
通過對產(chǎn)品集群進行擴充,增加撮合引擎數(shù)量,可以增強產(chǎn)品集群的可靠性端铛。將不同金融產(chǎn)品轉(zhuǎn)發(fā)到不同的撮合產(chǎn)品集群中可以實現(xiàn)多產(chǎn)品高效并行撮合。
2.6.2 系統(tǒng)軟件體系架構(gòu)
如圖2.7所示,高可靠高性能撮合模型主要由表示層疲眷、轉(zhuǎn)發(fā)層、業(yè)務(wù)層和數(shù)據(jù)層組成您朽。其核心部分業(yè)務(wù)層主要由撮合引擎集群組成,每個撮合引擎采用原子多播將訂單定序后進行撮合處理,并結(jié)合無鎖訂單隊列實現(xiàn)高效流水線撮合,最后結(jié)果寫入本地日志狂丝。整個業(yè)務(wù)流程由消息傳遞總線將消息反饋給轉(zhuǎn)發(fā)層。轉(zhuǎn)發(fā)層則根據(jù)產(chǎn)品轉(zhuǎn)發(fā)規(guī)則將訂單轉(zhuǎn)發(fā)給相應(yīng)撮合引擎集群;而撮合引擎將本地日志中的交易記錄讀取到異步持久化代理進程中,并進而與數(shù)據(jù)層的異步持久化寫入進程通信,并最終持久化到數(shù)據(jù)庫中哗总。本地日志增強了撮合系統(tǒng)數(shù)據(jù)的可靠性,在出現(xiàn)故障后,數(shù)據(jù)仍就可以從本地日志中恢復(fù);而界步的持久化機制則提高了數(shù)據(jù)的持久化吞吐率几颜。
2.6.3 撮合引擎架構(gòu)
為了使系統(tǒng)可擴展易維護,撮合引擎由原子多播訂單定序模塊、撮合處理器模塊讯屈、交易記錄日志模塊和內(nèi)存數(shù)據(jù)組成,每個模塊根據(jù)功能業(yè)務(wù)劃分蛋哭。其中各部分主要有以下功能:交易訂單接收線程:負(fù)責(zé)從網(wǎng)關(guān)接收訂單,并完成原子多播定序流程。交易訂單發(fā)送線程:將定序完成的訂單發(fā)送給相關(guān)撮合業(yè)務(wù)線程涮母。交易信息發(fā)送線程:將訂單交易狀態(tài)反饋給網(wǎng)關(guān)谆趾。外圍業(yè)務(wù)邏輯線程:進行撮合數(shù)據(jù)的準(zhǔn)備處理,更新內(nèi)存訂單數(shù)據(jù)。撮合業(yè)務(wù)邏輯線程:根據(jù)確定性撮合算法撮合接收的訂單叛本。交易行情發(fā)布線程:處理內(nèi)存行情信息并發(fā)布給網(wǎng)關(guān)沪蓬。同步日志寫線程:將訂單撮合產(chǎn)生的交易記錄同步持久化到本地日志文件。異步持久化代理進程:異步將日志文件中的數(shù)據(jù)讀取并持久化到數(shù)據(jù)庫来候。訂單信息:存儲訂單的相關(guān)價格跷叉、數(shù)量、用戶营搅、限制云挟、類型和狀態(tài)等信息交易行情信息:撮合交易過程中的交易行情信息。
2.6.4 系統(tǒng)接口
撮合系統(tǒng)主要為使用者提供訂單的下單和查詢服務(wù)转质、交易行情的實時反饋功能以及系統(tǒng)狀態(tài)的監(jiān)控查看服務(wù)园欣。因此系統(tǒng)需要實現(xiàn)預(yù)留的接口主要包括:下單接口、訂單查詢接口峭拘、行情查詢接口俊庇、系統(tǒng)控制接口和運行狀態(tài)查詢接口等狮暑。
2.7 小節(jié)
從總體設(shè)計入手,將撮合業(yè)務(wù)處理從數(shù)據(jù)庫遷移至內(nèi)存中,同時釆用多機熱備份技術(shù)解決內(nèi)存撮合技術(shù)的易失性問題,最終提出內(nèi)存狀態(tài)機復(fù)制方案作為高可靠髙性能撮合系統(tǒng)的實現(xiàn)路線。撮合技術(shù)的具體實現(xiàn)將在下一章進行詳細(xì)論述辉饱。
Q&A
Q:熱備的機制上搬男。多個機器內(nèi)存上的狀態(tài)如何保證強一致性的?
A: 是熱備機器都是無狀態(tài)彭沼,普洱茶按照不同品種產(chǎn)生不同撮合序列缔逛,只要保證單品種有序,其他撮合機和本機沒有關(guān)系姓惑。
Q: 如果新加入一臺撮合引擎褐奴,怎么判斷所有的撮合數(shù)據(jù)都同步到了這臺新的引擎上?
A: 委托單先要寫raid文件系統(tǒng)于毙,新增撮合引擎敦冬,也可以拿到數(shù)據(jù)。
Q: 根據(jù)你的描述唯沮,一個集群中為了判斷撮合引擎是否有故障脖旱,至少應(yīng)該有3臺撮合引擎吧?
A:? zk來管理,并且有風(fēng)控進程監(jiān)控撮合進度介蛉。
Q: 內(nèi)存狀態(tài)機的復(fù)制究竟是結(jié)果還是數(shù)據(jù)萌庆?
A: 數(shù)據(jù),就是把處理到某個狀態(tài)的數(shù)據(jù)復(fù)制出來币旧。
Q: 如果只有兩臺撮合引擎践险,如果對一個買入訂單,發(fā)現(xiàn)結(jié)果不一致吹菱,如何判斷是哪一臺的故障巍虫?
A: 撮合只有一臺進行撮合,撮合結(jié)束才回寫數(shù)據(jù)庫產(chǎn)生行情和分發(fā)個個終端毁葱,用戶就可以看到自己委托單是否成交垫言。
分享者簡介:
李偉山,畢業(yè)于國防科技大學(xué)倾剿,曾就職于華為筷频、阿里巴巴,目前人江蘇大圓銀泰技術(shù)總監(jiān)前痘,對于高并發(fā)凛捏、大數(shù)據(jù)架構(gòu)設(shè)計有深刻的了解。
本文轉(zhuǎn)載自微信公眾號 中生代技術(shù) freshmanTechnology