天天看點

撮合系統設計

随着資訊技術的日新月異和金融業務的快速發展,金融交易領域對于核心技術的求也在不斷增強,國内外金融交易模式已經從傳統的人工叫價的方式變成了由高度電子化交易系統撮合訂單的方式。傳統的金融交易主要發生在有型金融市場中,金融交易的買賣雙方通過叫價進行價格協商等方式最終達成一緻,進而形成一筆交易,同時按照交易訂單到指定的交割地點進行實物交割的交易方式。由于交易的整個過程主要依靠人來執行,傳統的金融交易缺點主要有:效率低速度慢、交易時間限制大、交易空間限制大、交易成本非常髙、容易有内幕交易、交易擴充性差、交易容易出錯、資金安全性差等一系列的缺點。

時代不斷變遷,金融交易通過與計算機技術的結合,走上了電子化交易的道路,通過将金融交易市場電子化,電子交易不僅消除了傳統金融交易的種種弊端,也促進了現代金融業的快速發展。電子金融交易的主要優點有:交易效率高速度快、交易透明度高、交易成本低、系統安全性高、不受交易時間的限制、不受交易空間的限制、可以進行多方位的擴充、大力推動現代金融業發展等。

是以現在電子交易己經成為了金融交易市場的主流交易方式。随着交易人數、筆數的不斷增加,系統承受着越來越大的壓力,如果在交易時間内系統發生故障,造成的損失往往不可估量。是以發出更可靠更高效的電子交易系統己經成為了金融交易領域的當務之急。

撮合交易在金融交易系統中扮演者非常重要的角色。了解撮合交易的本質以及業務對于設計撮合系統至關重要。江蘇大泰技術有限公司,緻力于網際網路金融平台的開發,目前已經在運作的平台有大宗交易、普洱茶交易系統,後期會釋出連續現貨和發售交易平台,接下來為大家介紹基于記憶體的撮合交易系統設計概要。

一般而言,金融交易撮合系統中包括以下幾個核心子產品:

使用者:終端使用者委托報價與數量,生成訂單發送至交易平台。

網關:負責收集使用者訂單,并将其派發給撮合引擎。

撮合引擎:交易系統中的核心部分,用于接收訂單并根據業務邏輯實作訂單   撮合同時生成交易記錄,随後給予使用者交易結果回報。

資料庫:用來存放交易過程中的訂單和交易記錄,實作資料持久化。

此外,本文根據不同類型的金融交易展品将撮合子產品劃分為若幹業務分區,每個分區獨立進行撮合,彼此不受影響。對于單個業務分區而言,撮合系統整體架構設計如圖1.2所示,本章的總體設計圍繞撮合引擎層以及撮合引擎與網關層、資料庫層的互動方式的總體設計。

如圖2.1所示,撮合引擎的核心業務子產品就是撮合交易算法撮合交易算法的任務一方面是完成對客戶所下訂單進行公平合理的排列和撮合功能,也要保證撮合算法的公平性、高效性以及擴充性等。由于不同金融交易系統的撮合業務各有不同,是以本節對通用的撮合交易算法進行概括性描述。

撮合系統設計

撮合交易的重要組成部分就是買賣訂單,通過對買賣訂單進行撮合最後形成交易記錄。是以對無法立刻完成撮合的訂單,需要有買入隊列和賣出隊列儲存訂單。隊列按照“價格優先、同價格下時間優先”的原則。買入隊列按照委托價格從低到高的順序,賣出隊列則按照委托價格從低到高的順序排列,如圖

撮合系統設計

撮合引擎接收到新的買入訂單,則會到賣出隊列的頭部查找是否存在符合價格規則的賣出訂單,如果存在賣出價格小于或等于買入價格的訂單,則從隊列中取出此訂單并撮合成一筆交易;如果賣出隊列為空或隊列頭部不滿足價格關系,則将買入訂單插入買入隊列中,由于買入隊列是按照價格與時間先後進行排序,是以新插入的訂單會經過一次排序插入到買入隊列的相應位置。

相同的,當撮合引擎接收到新的賣出訂單,則會到買入隊列的頭部査找是否存在符合價格規則的買入訂單,如果存在買入價格大于或等于賣出價格的訂單,則從訂單隊列中取出此訂單并撮合成一筆交易;如果買入隊列為空或隊列頭部不滿足價格關系,則将賣出訂單插入到賣出隊列中,由于賣出隊列也是按照價格與時間先後進行排序的是以新插入的訂單會經過一次排序插入到賣出隊列的相應位置[23]。

撮合系統設計

結合買賣訂單情況,撮合算法流程如圖2.3所示。從圖2.3所示的撮合順序可知,買賣隊列的有序性是保證撮合順序的确定性的基礎,并且撮合過程中每筆訂單都可以撮合出目前最優交易。

目前的資料庫撮合技術的性能低下的原因在于過多與資料庫互動,使得i/o很多,系統整體處理速度同時受資料庫事務邏輯限制。

本文釆用記憶體撮合技術,通過最大程度去除與資料庫的互動過程,将整個錯和邏輯放在記憶體中進行(如圖2.4所示)。是以比資料庫撮合技術少了許多i/o交s 間,在性能上可以大幅提升撮合速度;例是記憶體撮合的弊端就是由于記憶體的易失性,.?伺服器出現故障停機時,所有的交易資料将會丢失,系統的可靠性以及一緻性都相應人幅降低。是以本文在提高記憶體撮合技術可靠性的方面采用丫多機熱備份及分布式一緻性技術作為補充,進而獲得記憶體撮合技術的高性能以及資料庫撮合技術的資料持久性。

撮合系統設計

由于記憶體撮合技術在撮合引攀出現異常時的可靠性和一緻性非常差,而金融交場系統因為其業務特性,對服務小斷以及資料丢失的容忍度非常低,>//提高容錯性,一般多采取的是多機熱條份技術。本文采用多機熱備份技術,将一組撮合引樂部署成互為備份的撮合引擎叢集,并且在同一時間内隻有一台撮合引擎提供服務。當-其中運作這的一台撮六引擎出現故障無法繼續正常工作 ,撮合引擎貓群會迅速檢測到這個故障,并選舉出一個備份撮合引擎接管故障撮合引舉的任務進而保證整個撮合系統的正常運作多機熱備份技術的本質就足針對伺服器臨時故障所做的一種備份技術,本文迎過采用多機熱備份技術,來避免長 間的撮合服務中斷,保證撮合系統長期、可靠的服務。如閣2.5所示,通過将多台撮合引擎進行熱格份,進而保證在撮合引擎出現故障時,會在可以接受的時間内完成主機和備機之間的切換,由備份機提供無縫連續服務。

撮合系統設計

通過釆用多機熱備份技術,降低了單一記憶體撮合引擎故障時系統不可用的問題,但仍舊無法提供100%的可用性,因為當出現大規模伺服器叢集故障時,仍舊存在服務不可用的可能性,但在實際生産環境中,三台互為備份的伺服器就可以提供較高的可以用于生産環境的可靠性。

由于多機熱備份技術引入了多台互為熱備份的撮合引擎,根據撮合系統設計以及撮合邏輯要求,需要保證伺服器之間的資料一緻,這就需要保證多伺服器之間一緻性,這也是本文難點之一。

本文提出一種記憶體狀态機複制方案,即将撮合算法視作一個确定性狀态機,将其複制多份并部署到撮合系統中的多台撮合引擎中。每個撮合引擎副本從相同的初始狀态開始運作,當撮合系統收到網關發來的訂單時,系統中的每個撮合引擎都會撮合這個訂單,并依次産生交易記錄,同時更新确定性撮合算法狀态機的獨立狀态。通過這樣的方式,當撮合系統正常運轉時,每個撮合引擎副本都會具有相同的結果狀态;當撮合系統出現故障或異常時,撮合引擎就會出現狀态的不一緻情況,換句話說一旦撮合系統的結果或狀态出現了不一緻的情況就可以斷定系統出現了異常。

本文為了實作這樣的記憶體狀态機複制撮合系統,将撮合系統劃分為以下組成關鍵技術點

将确定性撮合算法狀态機服務部署到多個獨立撮合引擎

接收網關訂單,并作為确定性撮合算法狀态機的輸入

根據撮合算法需求,選擇一種訂單排序方式

每個撮合引擎對按照排序方式排序過的訂單進行撮合

将确定性撮合算法狀态機輸出的交易記錄作為給使用者或資料庫的響應

監控撮合引擎副本的狀态或輸出的差别

為實作基于記憶體狀态機複制的撮合系統,本文主要通過以下方案實作狀态機複制的關鍵技術點:

采用原子多點傳播解決撮合引擎訂單的可靠多點傳播與全局有序性

采用基于無鎖訂單隊列的流水線撮合技術提供快速的訂單撮合

采用異步一緻性持久化技術實作與資料庫的互動【3】

采用失效備援技術對撮合引擎叢集進行狀态監控并保證系統的容錯能;^[24][3115)采用進度追趕技術解決将故障撮合引擎的恢複或新撮合引擎的加入

典型的高可靠高性能撮合模型硬體架構如圖2.6所示,系統由n台用戶端、n台網關、x個産品叢集(每個叢集由2至3台撮合引擎組成,負責響應産品訂單的處理)、一個交易記錄資料庫和可選的監視系統組成。其中用戶端連接配接到相應網關,網關負責接收用戶端送出的訂單,并根據訂單相關的金融産品類别,轉發到相對應的産品叢集。産品叢集中所有撮合引擎均接收網關發送的訂單,根據撮合業務規則,将其撮合并回饋消息給網關和用戶端,同時将撮合生成的交易記錄持久化到交易記錄資料庫中。

撮合系統設計

通過對産品叢集進行擴充,增加撮合引擎數量,可以增強産品叢集的可靠性。将不同金融産品轉發到不同的撮合産品叢集中可以實作多産品高效并行撮合。

撮合系統設計

如圖2.7所示,高可靠高性能撮合模型主要由表示層、轉發層、業務層和資料層組成。其核心部分業務層主要由撮合引擎叢集組成,每個撮合引擎采用原子多點傳播将訂單定序後進行撮合處理,并結合無鎖訂單隊列實作高效流水線撮合,最後結果寫入本地日志。整個業務流程由消息傳遞總線将消息回報給轉發層。轉發層則根據産品轉發規則将訂單轉發給相應撮合引擎叢集;而撮合引擎将本地日志中的交易記錄讀取到異步持久化代理程序中,并進而與資料層的異步持久化寫入程序通信,并最終持久化到資料庫中。本地日志增強了撮合系統資料的可靠性,在出現故障後,資料仍就可以從本地日志中恢複;而界步的持久化機制則提高了資料的持久化吞吐率。

撮合系統設計

為了使系統可擴充易維護,撮合引擎由原子多點傳播訂單定序子產品、撮合處理器子產品、交易記錄日志子產品和記憶體資料組成,每個子產品根據功能業務劃分。其中各部分主要有以下功能:交易訂單接收線程:負責從網關接收訂單,并完成原子多點傳播定序流程。交易訂單發送線程:将定序完成的訂單發送給相關撮合業務線程。交易資訊發送線程:将訂單交易狀态回報給網關。外圍業務邏輯線程:進行撮合資料的準備處理,更新記憶體訂單資料。撮合業務邏輯線程:根據确定性撮合算法撮合接收的訂單。交易行情釋出線程:處理記憶體行情資訊并釋出給網關。同步日志寫線程:将訂單撮合産生的交易記錄同步持久化到本地日志檔案。異步持久化代理程序:異步将日志檔案中的資料讀取并持久化到資料庫。訂單資訊:存儲訂單的相關價格、數量、使用者、限制、類型和狀态等資訊交易行情資訊:撮合交易過程中的交易行情資訊。

撮合系統主要為使用者提供訂單的下單和查詢服務、交易行情的實時回報功能以及系統狀态的監控檢視服務。是以系統需要實作預留的接口主要包括:下單接口、訂單查詢接口、行情查詢接口、系統控制接口和運作狀态查詢接口等。

從總體設計入手,将撮合業務處理從資料庫遷移至記憶體中,同時釆用多機熱備份技術解決記憶體撮合技術的易失性問題,最終提出記憶體狀态機複制方案作為高可靠髙性能撮合系統的實作路線。撮合技術的具體實作将在下一章進行詳細論述。

q:熱備的機制上。多個機器記憶體上的狀态如何保證強一緻性的?

a: 是熱備機器都是無狀态,普洱茶按照不同品種産生不同撮合序列,隻要保證單品種有序,其他撮合機和本機沒有關系。

q: 如果新加入一台撮合引擎,怎麼判斷所有的撮合資料都同步到了這台新的引擎上?

a: 委托單先要寫raid檔案系統,新增撮合引擎,也可以拿到資料。

q: 根據你的描述,一個叢集中為了判斷撮合引擎是否有故障,至少應該有3台撮合引擎吧?

a:  zk來管理,并且有風控程序監控撮合進度。

q: 記憶體狀态機的複制究竟是結果還是資料?

a: 資料,就是把處理到某個狀态的資料複制出來。

q: 如果隻有兩台撮合引擎,如果對一個買入訂單,發現結果不一緻,如何判斷是哪一台的故障?

a: 撮合隻有一台進行撮合,撮合結束才回寫資料庫産生行情和分發個個終端,使用者就可以看到自己委托單是否成交。

分享者簡介:

<b>李偉山</b>,畢業于國防科技大學,曾就職于華為、阿裡巴巴,目前人江蘇大圓銀泰技術總監,對于高并發、大資料架構設計有深刻的了解。

<b>本文轉載自微信公衆号 中生代技術 freshmantechnology</b>