撮合系統(tǒng)設(shè)計(jì)
撮合技術(shù)
摘要: 撮合技術(shù)主要是從數(shù)據(jù)庫撮合技術(shù)向內(nèi)存撮合技術(shù)發(fā)展氮唯,這是因?yàn)閿?shù)據(jù)庫撮合技術(shù)越來越無法滿足金融交易對于高可靠性、高性能、強(qiáng)安全性拥知、可擴(kuò)展性以及易維護(hù)性的需求。本文來自中生代技術(shù)群的34期分享碎赢,將和大家討論基于內(nèi)存的撮合的系統(tǒng)設(shè)計(jì)低剔。
概述
隨著信息技術(shù)的日新月異和金融業(yè)務(wù)的快速發(fā)展,金融交易領(lǐng)域?qū)τ诤诵募夹g(shù)的求也在不斷增強(qiáng),國內(nèi)外金融交易模式已經(jīng)從傳統(tǒng)的人工叫價(jià)的方式變成了由高度電子化交易系統(tǒng)撮合訂單的方式。傳統(tǒng)的金融交易主要發(fā)生在有型金融市場中,金融交易的買賣雙方通過叫價(jià)進(jìn)行價(jià)格協(xié)商等方式最終達(dá)成一致,從而形成一筆交易,同時(shí)按照交易訂單到指定的交割地點(diǎn)進(jìn)行實(shí)物交割的交易方式肮塞。由于交易的整個(gè)過程主要依靠人來執(zhí)行,傳統(tǒng)的金融交易缺點(diǎn)主要有:效率低速度慢襟齿、交易時(shí)間限制大、交易空間限制大枕赵、交易成本非常髙猜欺、容易有內(nèi)幕交易、交易擴(kuò)展性差拷窜、交易容易出錯(cuò)开皿、資金安全性差等一系列的缺點(diǎn)。
時(shí)代不斷變遷,金融交易通過與計(jì)算機(jī)技術(shù)的結(jié)合,走上了電子化交易的道路,通過將金融交易市場電子化,電子交易不僅消除了傳統(tǒng)金融交易的種種弊端,也促進(jìn)了現(xiàn)代金融業(yè)的快速發(fā)展篮昧。電子金融交易的主要優(yōu)點(diǎn)有:交易效率高速度快赋荆、交易透明度高、交易成本低懊昨、系統(tǒng)安全性高窄潭、不受交易時(shí)間的限制、不受交易空間的限制酵颁、可以進(jìn)行多方位的擴(kuò)展嫉你、大力推動現(xiàn)代金融業(yè)發(fā)展等月帝。
因此現(xiàn)在電子交易己經(jīng)成為了金融交易市場的主流交易方式。隨著交易人數(shù)均抽、筆數(shù)的不斷增加,系統(tǒng)承受著越來越大的壓力,如果在交易時(shí)間內(nèi)系統(tǒng)發(fā)生故障,造成的損失往往不可估量嫁赏。因此發(fā)出更可靠更高效的電子交易系統(tǒng)己經(jīng)成為了金融交易領(lǐng)域的當(dāng)務(wù)之急。
撮合交易在金融交易系統(tǒng)中扮演者非常重要的角色油挥。了解撮合交易的本質(zhì)以及業(yè)務(wù)對于設(shè)計(jì)撮合系統(tǒng)至關(guān)重要潦蝇。江蘇大泰技術(shù)有限公司,致力于互聯(lián)網(wǎng)金融平臺的開發(fā)深寥,目前已經(jīng)在運(yùn)行的平臺有大宗交易攘乒、普洱茶交易系統(tǒng),后期會發(fā)布連續(xù)現(xiàn)貨和發(fā)售交易平臺惋鹅,接下來為大家介紹基于內(nèi)存的撮合交易系統(tǒng)設(shè)計(jì)概要则酝。
系統(tǒng)總體設(shè)計(jì)
2.1 層次設(shè)計(jì)
一般而言,金融交易撮合系統(tǒng)中包括以下幾個(gè)核心模塊:
用戶:終端用戶委托報(bào)價(jià)與數(shù)量,生成訂單發(fā)送至交易平臺。
網(wǎng)關(guān):負(fù)責(zé)收集用戶訂單,并將其派發(fā)給撮合引擎闰集。
撮合引擎:交易系統(tǒng)中的核心部分,用于接收訂單并根據(jù)業(yè)務(wù)邏輯實(shí)現(xiàn)訂單? 撮合同時(shí)生成交易記錄,隨后給予用戶交易結(jié)果反饋沽讹。
數(shù)據(jù)庫:用來存放交易過程中的訂單和交易記錄,實(shí)現(xiàn)數(shù)據(jù)持久化。
此外,本文根據(jù)不同類型的金融交易展品將撮合模塊劃分為若干業(yè)務(wù)分區(qū),每個(gè)分區(qū)獨(dú)立進(jìn)行撮合,彼此不受影響武鲁。對于單個(gè)業(yè)務(wù)分區(qū)而言,撮合系統(tǒng)整體架構(gòu)設(shè)計(jì)如圖1.2所示,本章的總體設(shè)計(jì)圍繞撮合引擎層以及撮合引擎與網(wǎng)關(guān)層爽雄、數(shù)據(jù)庫層的交互方式的總體設(shè)計(jì)。
2.2 撮合交易算法
如圖2.1所示,撮合引擎的核心業(yè)務(wù)模塊就是撮合交易算法撮合交易算法的任務(wù)一方面是完成對客戶所下訂單進(jìn)行公平合理的排列和撮合功能,也要保證撮合算法的公平性沐鼠、高效性以及擴(kuò)展性等挚瘟。由于不同金融交易系統(tǒng)的撮合業(yè)務(wù)各有不同,因此本節(jié)對通用的撮合交易算法進(jìn)行概括性描述。
b12e4e92c9cbb1d1063eb2e69ab2e96c3fd0bf0b
2.2.1 訂單隊(duì)列
撮合交易的重要組成部分就是買賣訂單,通過對買賣訂單進(jìn)行撮合最后形成交易記錄饲梭。所以對無法立刻完成撮合的訂單,需要有買入隊(duì)列和賣出隊(duì)列保存訂單乘盖。隊(duì)列按照“價(jià)格優(yōu)先、同價(jià)格下時(shí)間優(yōu)先”的原則憔涉。買入隊(duì)列按照委托價(jià)格從低到高的順序,賣出隊(duì)列則按照委托價(jià)格從低到高的順序排列,如圖
f12b0c3aae4091991e7e251d20c89f47eafdd10b
2.2.2撮合順序
撮合引擎接收到新的買入訂單,則會到賣出隊(duì)列的頭部查找是否存在符合價(jià)格規(guī)則的賣出訂單,如果存在賣出價(jià)格小于或等于買入價(jià)格的訂單,則從隊(duì)列中取出此訂單并撮合成一筆交易;如果賣出隊(duì)列為空或隊(duì)列頭部不滿足價(jià)格關(guān)系,則將買入訂單插入買入隊(duì)列中,由于買入隊(duì)列是按照價(jià)格與時(shí)間先后進(jìn)行排序,所以新插入的訂單會經(jīng)過一次排序插入到買入隊(duì)列的相應(yīng)位置订框。
相同的,當(dāng)撮合引擎接收到新的賣出訂單,則會到買入隊(duì)列的頭部査找是否存在符合價(jià)格規(guī)則的買入訂單,如果存在買入價(jià)格大于或等于賣出價(jià)格的訂單,則從訂單隊(duì)列中取出此訂單并撮合成一筆交易;如果買入隊(duì)列為空或隊(duì)列頭部不滿足價(jià)格關(guān)系,則將賣出訂單插入到賣出隊(duì)列中,由于賣出隊(duì)列也是按照價(jià)格與時(shí)間先后進(jìn)行排序的所以新插入的訂單會經(jīng)過一次排序插入到賣出隊(duì)列的相應(yīng)位置[23]。
5880aecebe788b86a16d4bdf634d025ca4a8d011
結(jié)合買賣訂單情況,撮合算法流程如圖2.3所示监氢。從圖2.3所示的撮合順序可知,買賣隊(duì)列的有序性是保證撮合順序的確定性的基礎(chǔ),并且撮合過程中每筆訂單都可以撮合出當(dāng)前最優(yōu)交易布蔗。
2.3 內(nèi)存撮合
當(dāng)前的數(shù)據(jù)庫撮合技術(shù)的性能低下的原因在于過多與數(shù)據(jù)庫交互,使得I/O很多,系統(tǒng)整體處理速度同時(shí)受數(shù)據(jù)庫事務(wù)邏輯約束。
本文釆用內(nèi)存撮合技術(shù),通過最大程度去除與數(shù)據(jù)庫的交互過程,將整個(gè)錯(cuò)和邏輯放在內(nèi)存中進(jìn)行(如圖2.4所示)浪腐。因此比數(shù)據(jù)庫撮合技術(shù)少了許多I/O交S 間,在性能上可以大幅提升撮合速度;例是內(nèi)存撮合的弊端就是由于內(nèi)存的易失性,.?服務(wù)器出現(xiàn)故障停機(jī)時(shí),所有的交易數(shù)據(jù)將會丟失,系統(tǒng)的可靠性以及一致性都相應(yīng)人幅降低纵揍。因此本文在提高內(nèi)存撮合技術(shù)可靠性的方面采用丫多機(jī)熱備份及分布式一致性技術(shù)作為補(bǔ)充,從而獲得內(nèi)存撮合技術(shù)的高性能以及數(shù)據(jù)庫撮合技術(shù)的數(shù)據(jù)持久性。
9769d413e8d1f7acc54b21898f6ff0667bd71f54
2.4 多機(jī)熱備份
由于內(nèi)存撮合技術(shù)在撮合引攀出現(xiàn)異常時(shí)的可靠性和一致性非常差,而金融交場系統(tǒng)因?yàn)槠錁I(yè)務(wù)特性,對服務(wù)小斷以及數(shù)據(jù)丟失的容忍度非常低,>//提高容錯(cuò)性,一般多采取的是多機(jī)熱條份技術(shù)议街。本文采用多機(jī)熱備份技術(shù),將一組撮合引樂部署成互為備份的撮合引擎集群,并且在同一時(shí)間內(nèi)只有一臺撮合引擎提供服務(wù)泽谨。當(dāng)-其中運(yùn)行這的一臺撮六引擎出現(xiàn)故障無法繼續(xù)正常工作 ,撮合引擎貓群會迅速檢測到這個(gè)故障,并選舉出一個(gè)備份撮合引擎接管故障撮合引舉的任務(wù)從而保證整個(gè)撮合系統(tǒng)的正常運(yùn)行多機(jī)熱備份技術(shù)的本質(zhì)就足針對服務(wù)器臨時(shí)故障所做的一種備份技術(shù),本文迎過采用多機(jī)熱備份技術(shù),來避免長 間的撮合服務(wù)中斷,保證撮合系統(tǒng)長期、可靠的服務(wù)。如閣2.5所示,通過將多臺撮合引擎進(jìn)行熱格份,從而保證在撮合引擎出現(xiàn)故障時(shí),會在可以接受的時(shí)間內(nèi)完成主機(jī)和備機(jī)之間的切換,由備份機(jī)提供無縫連續(xù)服務(wù)吧雹。
a1f102e34f60972c52acd1d726df94b1c22d91fb
通過釆用多機(jī)熱備份技術(shù),降低了單一內(nèi)存撮合引擎故障時(shí)系統(tǒng)不可用的問題,但仍舊無法提供100%的可用性,因?yàn)楫?dāng)出現(xiàn)大規(guī)模服務(wù)器集群故障時(shí),仍舊存在服務(wù)不可用的可能性,但在實(shí)際生產(chǎn)環(huán)境中,三臺互為備份的服務(wù)器就可以提供較高的可以用于生產(chǎn)環(huán)境的可靠性骨杂。
2.5 內(nèi)存狀態(tài)機(jī)復(fù)制
由于多機(jī)熱備份技術(shù)引入了多臺互為熱備份的撮合引擎,根據(jù)撮合系統(tǒng)設(shè)計(jì)以及撮合邏輯要求,需要保證服務(wù)器之間的數(shù)據(jù)一致,這就需要保證多服務(wù)器之間一致性,這也是本文難點(diǎn)之一。
本文提出一種內(nèi)存狀態(tài)機(jī)復(fù)制方案,即將撮合算法視作一個(gè)確定性狀態(tài)機(jī),將其復(fù)制多份并部署到撮合系統(tǒng)中的多臺撮合引擎中雄卷。每個(gè)撮合引擎副本從相同的初始狀態(tài)開始運(yùn)行,當(dāng)撮合系統(tǒng)收到網(wǎng)關(guān)發(fā)來的訂單時(shí),系統(tǒng)中的每個(gè)撮合引擎都會撮合這個(gè)訂單,并依次產(chǎn)生交易記錄,同時(shí)更新確定性撮合算法狀態(tài)機(jī)的獨(dú)立狀態(tài)搓蚪。通過這樣的方式,當(dāng)撮合系統(tǒng)正常運(yùn)轉(zhuǎn)時(shí),每個(gè)撮合引擎副本都會具有相同的結(jié)果狀態(tài);當(dāng)撮合系統(tǒng)出現(xiàn)故障或異常時(shí),撮合引擎就會出現(xiàn)狀態(tài)的不一致情況,換句話說一旦撮合系統(tǒng)的結(jié)果或狀態(tài)出現(xiàn)了不一致的情況就可以斷定系統(tǒng)出現(xiàn)了異常。
2.5.1 關(guān)鍵技術(shù)點(diǎn)
本文為了實(shí)現(xiàn)這樣的內(nèi)存狀態(tài)機(jī)復(fù)制撮合系統(tǒng),將撮合系統(tǒng)劃分為以下組成關(guān)鍵技術(shù)點(diǎn)
將確定性撮合算法狀態(tài)機(jī)服務(wù)部署到多個(gè)獨(dú)立撮合引擎
接收網(wǎng)關(guān)訂單,并作為確定性撮合算法狀態(tài)機(jī)的輸入
根據(jù)撮合算法需求,選擇一種訂單排序方式
每個(gè)撮合引擎對按照排序方式排序過的訂單進(jìn)行撮合
將確定性撮合算法狀態(tài)機(jī)輸出的交易記錄作為給用戶或數(shù)據(jù)庫的響應(yīng)
監(jiān)控撮合引擎副本的狀態(tài)或輸出的差別
2.5.2 實(shí)現(xiàn)方案
為實(shí)現(xiàn)基于內(nèi)存狀態(tài)機(jī)復(fù)制的撮合系統(tǒng),本文主要通過以下方案實(shí)現(xiàn)狀態(tài)機(jī)復(fù)制的關(guān)鍵技術(shù)點(diǎn):
采用原子多播解決撮合引擎訂單的可靠多播與全局有序性
采用基于無鎖訂單隊(duì)列的流水線撮合技術(shù)提供快速的訂單撮合
采用異步一致性持久化技術(shù)實(shí)現(xiàn)與數(shù)據(jù)庫的交互【3】
采用失效備援技術(shù)對撮合引擎集群進(jìn)行狀態(tài)監(jiān)控并保證系統(tǒng)的容錯(cuò)能;^[24][3115)采用進(jìn)度追趕技術(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個(gè)產(chǎn)品集群(每個(gè)集群由2至3臺撮合引擎組成,負(fù)責(zé)響應(yīng)產(chǎn)品訂單的處理)、一個(gè)交易記錄數(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í)將撮合生成的交易記錄持久化到交易記錄數(shù)據(jù)庫中。
3b2bacf558137691b3fcac814a7ffbab10bcb3f5
通過對產(chǎn)品集群進(jìn)行擴(kuò)充,增加撮合引擎數(shù)量,可以增強(qiáng)產(chǎn)品集群的可靠性冯凹。將不同金融產(chǎn)品轉(zhuǎn)發(fā)到不同的撮合產(chǎn)品集群中可以實(shí)現(xiàn)多產(chǎn)品高效并行撮合谎亩。
2.6.2 系統(tǒng)軟件體系架構(gòu)
62fe49423bff42f5b1ad1126c8bdeedafcbdc8d1
如圖2.7所示,高可靠高性能撮合模型主要由表示層、轉(zhuǎn)發(fā)層宇姚、業(yè)務(wù)層和數(shù)據(jù)層組成匈庭。其核心部分業(yè)務(wù)層主要由撮合引擎集群組成,每個(gè)撮合引擎采用原子多播將訂單定序后進(jìn)行撮合處理,并結(jié)合無鎖訂單隊(duì)列實(shí)現(xiàn)高效流水線撮合,最后結(jié)果寫入本地日志。整個(gè)業(yè)務(wù)流程由消息傳遞總線將消息反饋給轉(zhuǎn)發(fā)層浑劳。轉(zhuǎn)發(fā)層則根據(jù)產(chǎn)品轉(zhuǎn)發(fā)規(guī)則將訂單轉(zhuǎn)發(fā)給相應(yīng)撮合引擎集群;而撮合引擎將本地日志中的交易記錄讀取到異步持久化代理進(jìn)程中,并進(jìn)而與數(shù)據(jù)層的異步持久化寫入進(jìn)程通信,并最終持久化到數(shù)據(jù)庫中嚎花。本地日志增強(qiáng)了撮合系統(tǒng)數(shù)據(jù)的可靠性,在出現(xiàn)故障后,數(shù)據(jù)仍就可以從本地日志中恢復(fù);而界步的持久化機(jī)制則提高了數(shù)據(jù)的持久化吞吐率。
2.6.3 撮合引擎架構(gòu)
4e635a5d79dedb95d6614c5dc11585a8b9b24c8a
為了使系統(tǒng)可擴(kuò)展易維護(hù),撮合引擎由原子多播訂單定序模塊呀洲、撮合處理器模塊、交易記錄日志模塊和內(nèi)存數(shù)據(jù)組成,每個(gè)模塊根據(jù)功能業(yè)務(wù)劃分啼止。其中各部分主要有以下功能:交易訂單接收線程:負(fù)責(zé)從網(wǎng)關(guān)接收訂單,并完成原子多播定序流程道逗。交易訂單發(fā)送線程:將定序完成的訂單發(fā)送給相關(guān)撮合業(yè)務(wù)線程。交易信息發(fā)送線程:將訂單交易狀態(tài)反饋給網(wǎng)關(guān)献烦。外圍業(yè)務(wù)邏輯線程:進(jìn)行撮合數(shù)據(jù)的準(zhǔn)備處理,更新內(nèi)存訂單數(shù)據(jù)滓窍。撮合業(yè)務(wù)邏輯線程:根據(jù)確定性撮合算法撮合接收的訂單。交易行情發(fā)布線程:處理內(nèi)存行情信息并發(fā)布給網(wǎng)關(guān)巩那。同步日志寫線程:將訂單撮合產(chǎn)生的交易記錄同步持久化到本地日志文件吏夯。異步持久化代理進(jìn)程:異步將日志文件中的數(shù)據(jù)讀取并持久化到數(shù)據(jù)庫。訂單信息:存儲訂單的相關(guān)價(jià)格即横、數(shù)量噪生、用戶、限制东囚、類型和狀態(tài)等信息交易行情信息:撮合交易過程中的交易行情信息跺嗽。
2.6.4 系統(tǒng)接口
撮合系統(tǒng)主要為使用者提供訂單的下單和查詢服務(wù)、交易行情的實(shí)時(shí)反饋功能以及系統(tǒng)狀態(tài)的監(jiān)控查看服務(wù)。因此系統(tǒng)需要實(shí)現(xiàn)預(yù)留的接口主要包括:下單接口桨嫁、訂單查詢接口植兰、行情查詢接口、系統(tǒng)控制接口和運(yùn)行狀態(tài)查詢接口等璃吧。
2.7 小節(jié)
從總體設(shè)計(jì)入手,將撮合業(yè)務(wù)處理從數(shù)據(jù)庫遷移至內(nèi)存中,同時(shí)釆用多機(jī)熱備份技術(shù)解決內(nèi)存撮合技術(shù)的易失性問題,最終提出內(nèi)存狀態(tài)機(jī)復(fù)制方案作為高可靠髙性能撮合系統(tǒng)的實(shí)現(xiàn)路線楣导。撮合技術(shù)的具體實(shí)現(xiàn)將在下一章進(jìn)行詳細(xì)論述。
Q&A
Q:熱備的機(jī)制上畜挨。多個(gè)機(jī)器內(nèi)存上的狀態(tài)如何保證強(qiáng)一致性的筒繁?
A: 是熱備機(jī)器都是無狀態(tài),普洱茶按照不同品種產(chǎn)生不同撮合序列朦促,只要保證單品種有序膝晾,其他撮合機(jī)和本機(jī)沒有關(guān)系。
Q: 如果新加入一臺撮合引擎务冕,怎么判斷所有的撮合數(shù)據(jù)都同步到了這臺新的引擎上血当?
A: 委托單先要寫raid文件系統(tǒng),新增撮合引擎禀忆,也可以拿到數(shù)據(jù)臊旭。
Q: 根據(jù)你的描述,一個(gè)集群中為了判斷撮合引擎是否有故障箩退,至少應(yīng)該有3臺撮合引擎吧?
A:? zk來管理离熏,并且有風(fēng)控進(jìn)程監(jiān)控撮合進(jìn)度。
Q: 內(nèi)存狀態(tài)機(jī)的復(fù)制究竟是結(jié)果還是數(shù)據(jù)戴涝?
A: 數(shù)據(jù)滋戳,就是把處理到某個(gè)狀態(tài)的數(shù)據(jù)復(fù)制出來。
Q: 如果只有兩臺撮合引擎啥刻,如果對一個(gè)買入訂單奸鸯,發(fā)現(xiàn)結(jié)果不一致,如何判斷是哪一臺的故障可帽?
A: 撮合只有一臺進(jìn)行撮合娄涩,撮合結(jié)束才回寫數(shù)據(jù)庫產(chǎn)生行情和分發(fā)個(gè)個(gè)終端,用戶就可以看到自己委托單是否成交映跟。