撮合系統設計
撮合技術
摘要: 撮合技術主要是從數據庫撮合技術向內存撮合技術發展,這是因為數據庫撮合技術越來越無法滿足金融交易對于高可靠性、高性能、強安全性、可擴展性以及易維護性的需求。本文來自中生代技術群的34期分享,將和大家討論基于內存的撮合的系統設計。
概述
隨著信息技術的日新月異和金融業務的快速發展,金融交易領域對于核心技術的求也在不斷增強,國內外金融交易模式已經從傳統的人工叫價的方式變成了由高度電子化交易系統撮合訂單的方式。傳統的金融交易主要發生在有型金融市場中,金融交易的買賣雙方通過叫價進行價格協商等方式最終達成一致,從而形成一筆交易,同時按照交易訂單到指定的交割地點進行實物交割的交易方式。由于交易的整個過程主要依靠人來執行,傳統的金融交易缺點主要有:效率低速度慢、交易時間限制大、交易空間限制大、交易成本非常髙、容易有內幕交易、交易擴展性差、交易容易出錯、資金安全性差等一系列的缺點。
時代不斷變遷,金融交易通過與計算機技術的結合,走上了電子化交易的道路,通過將金融交易市場電子化,電子交易不僅消除了傳統金融交易的種種弊端,也促進了現代金融業的快速發展。電子金融交易的主要優點有:交易效率高速度快、交易透明度高、交易成本低、系統安全性高、不受交易時間的限制、不受交易空間的限制、可以進行多方位的擴展、大力推動現代金融業發展等。
因此現在電子交易己經成為了金融交易市場的主流交易方式。隨著交易人數、筆數的不斷增加,系統承受著越來越大的壓力,如果在交易時間內系統發生故障,造成的損失往往不可估量。因此發出更可靠更高效的電子交易系統己經成為了金融交易領域的當務之急。
撮合交易在金融交易系統中扮演者非常重要的角色。了解撮合交易的本質以及業務對于設計撮合系統至關重要。江蘇大泰技術有限公司,致力于互聯網金融平臺的開發,目前已經在運行的平臺有大宗交易、普洱茶交易系統,后期會發布連續現貨和發售交易平臺,接下來為大家介紹基于內存的撮合交易系統設計概要。
系統總體設計
2.1 層次設計
一般而言,金融交易撮合系統中包括以下幾個核心模塊:
用戶:終端用戶委托報價與數量,生成訂單發送至交易平臺。
網關:負責收集用戶訂單,并將其派發給撮合引擎。
撮合引擎:交易系統中的核心部分,用于接收訂單并根據業務邏輯實現訂單? 撮合同時生成交易記錄,隨后給予用戶交易結果反饋。
數據庫:用來存放交易過程中的訂單和交易記錄,實現數據持久化。
此外,本文根據不同類型的金融交易展品將撮合模塊劃分為若干業務分區,每個分區獨立進行撮合,彼此不受影響。對于單個業務分區而言,撮合系統整體架構設計如圖1.2所示,本章的總體設計圍繞撮合引擎層以及撮合引擎與網關層、數據庫層的交互方式的總體設計。
2.2 撮合交易算法
如圖2.1所示,撮合引擎的核心業務模塊就是撮合交易算法撮合交易算法的任務一方面是完成對客戶所下訂單進行公平合理的排列和撮合功能,也要保證撮合算法的公平性、高效性以及擴展性等。由于不同金融交易系統的撮合業務各有不同,因此本節對通用的撮合交易算法進行概括性描述。
b12e4e92c9cbb1d1063eb2e69ab2e96c3fd0bf0b
2.2.1 訂單隊列
撮合交易的重要組成部分就是買賣訂單,通過對買賣訂單進行撮合最后形成交易記錄。所以對無法立刻完成撮合的訂單,需要有買入隊列和賣出隊列保存訂單。隊列按照“價格優先、同價格下時間優先”的原則。買入隊列按照委托價格從低到高的順序,賣出隊列則按照委托價格從低到高的順序排列,如圖
f12b0c3aae4091991e7e251d20c89f47eafdd10b
2.2.2撮合順序
撮合引擎接收到新的買入訂單,則會到賣出隊列的頭部查找是否存在符合價格規則的賣出訂單,如果存在賣出價格小于或等于買入價格的訂單,則從隊列中取出此訂單并撮合成一筆交易;如果賣出隊列為空或隊列頭部不滿足價格關系,則將買入訂單插入買入隊列中,由于買入隊列是按照價格與時間先后進行排序,所以新插入的訂單會經過一次排序插入到買入隊列的相應位置。
相同的,當撮合引擎接收到新的賣出訂單,則會到買入隊列的頭部査找是否存在符合價格規則的買入訂單,如果存在買入價格大于或等于賣出價格的訂單,則從訂單隊列中取出此訂單并撮合成一筆交易;如果買入隊列為空或隊列頭部不滿足價格關系,則將賣出訂單插入到賣出隊列中,由于賣出隊列也是按照價格與時間先后進行排序的所以新插入的訂單會經過一次排序插入到賣出隊列的相應位置[23]。
5880aecebe788b86a16d4bdf634d025ca4a8d011
結合買賣訂單情況,撮合算法流程如圖2.3所示。從圖2.3所示的撮合順序可知,買賣隊列的有序性是保證撮合順序的確定性的基礎,并且撮合過程中每筆訂單都可以撮合出當前最優交易。
2.3 內存撮合
當前的數據庫撮合技術的性能低下的原因在于過多與數據庫交互,使得I/O很多,系統整體處理速度同時受數據庫事務邏輯約束。
本文釆用內存撮合技術,通過最大程度去除與數據庫的交互過程,將整個錯和邏輯放在內存中進行(如圖2.4所示)。因此比數據庫撮合技術少了許多I/O交S 間,在性能上可以大幅提升撮合速度;例是內存撮合的弊端就是由于內存的易失性,.?服務器出現故障停機時,所有的交易數據將會丟失,系統的可靠性以及一致性都相應人幅降低。因此本文在提高內存撮合技術可靠性的方面采用丫多機熱備份及分布式一致性技術作為補充,從而獲得內存撮合技術的高性能以及數據庫撮合技術的數據持久性。
9769d413e8d1f7acc54b21898f6ff0667bd71f54
2.4 多機熱備份
由于內存撮合技術在撮合引攀出現異常時的可靠性和一致性非常差,而金融交場系統因為其業務特性,對服務小斷以及數據丟失的容忍度非常低,>//提高容錯性,一般多采取的是多機熱條份技術。本文采用多機熱備份技術,將一組撮合引樂部署成互為備份的撮合引擎集群,并且在同一時間內只有一臺撮合引擎提供服務。當-其中運行這的一臺撮六引擎出現故障無法繼續正常工作 ,撮合引擎貓群會迅速檢測到這個故障,并選舉出一個備份撮合引擎接管故障撮合引舉的任務從而保證整個撮合系統的正常運行多機熱備份技術的本質就足針對服務器臨時故障所做的一種備份技術,本文迎過采用多機熱備份技術,來避免長 間的撮合服務中斷,保證撮合系統長期、可靠的服務。如閣2.5所示,通過將多臺撮合引擎進行熱格份,從而保證在撮合引擎出現故障時,會在可以接受的時間內完成主機和備機之間的切換,由備份機提供無縫連續服務。
a1f102e34f60972c52acd1d726df94b1c22d91fb
通過釆用多機熱備份技術,降低了單一內存撮合引擎故障時系統不可用的問題,但仍舊無法提供100%的可用性,因為當出現大規模服務器集群故障時,仍舊存在服務不可用的可能性,但在實際生產環境中,三臺互為備份的服務器就可以提供較高的可以用于生產環境的可靠性。
2.5 內存狀態機復制
由于多機熱備份技術引入了多臺互為熱備份的撮合引擎,根據撮合系統設計以及撮合邏輯要求,需要保證服務器之間的數據一致,這就需要保證多服務器之間一致性,這也是本文難點之一。
本文提出一種內存狀態機復制方案,即將撮合算法視作一個確定性狀態機,將其復制多份并部署到撮合系統中的多臺撮合引擎中。每個撮合引擎副本從相同的初始狀態開始運行,當撮合系統收到網關發來的訂單時,系統中的每個撮合引擎都會撮合這個訂單,并依次產生交易記錄,同時更新確定性撮合算法狀態機的獨立狀態。通過這樣的方式,當撮合系統正常運轉時,每個撮合引擎副本都會具有相同的結果狀態;當撮合系統出現故障或異常時,撮合引擎就會出現狀態的不一致情況,換句話說一旦撮合系統的結果或狀態出現了不一致的情況就可以斷定系統出現了異常。
2.5.1 關鍵技術點
本文為了實現這樣的內存狀態機復制撮合系統,將撮合系統劃分為以下組成關鍵技術點
將確定性撮合算法狀態機服務部署到多個獨立撮合引擎
接收網關訂單,并作為確定性撮合算法狀態機的輸入
根據撮合算法需求,選擇一種訂單排序方式
每個撮合引擎對按照排序方式排序過的訂單進行撮合
將確定性撮合算法狀態機輸出的交易記錄作為給用戶或數據庫的響應
監控撮合引擎副本的狀態或輸出的差別
2.5.2 實現方案
為實現基于內存狀態機復制的撮合系統,本文主要通過以下方案實現狀態機復制的關鍵技術點:
采用原子多播解決撮合引擎訂單的可靠多播與全局有序性
采用基于無鎖訂單隊列的流水線撮合技術提供快速的訂單撮合
采用異步一致性持久化技術實現與數據庫的交互【3】
采用失效備援技術對撮合引擎集群進行狀態監控并保證系統的容錯能;^[24][3115)采用進度追趕技術解決將故障撮合引擎的恢復或新撮合引擎的加入
2.6 系統架構
2.6.1 系統硬件體系架構
典型的高可靠高性能撮合模型硬件架構如圖2.6所示,系統由n臺客戶端、N臺網關、X個產品集群(每個集群由2至3臺撮合引擎組成,負責響應產品訂單的處理)、一個交易記錄數據庫和可選的監視系統組成。其中客戶端連接到相應網關,網關負責接收客戶端提交的訂單,并根據訂單相關的金融產品類別,轉發到相對應的產品集群。產品集群中所有撮合引擎均接收網關發送的訂單,根據撮合業務規則,將其撮合并回饋消息給網關和客戶端,同時將撮合生成的交易記錄持久化到交易記錄數據庫中。
3b2bacf558137691b3fcac814a7ffbab10bcb3f5
通過對產品集群進行擴充,增加撮合引擎數量,可以增強產品集群的可靠性。將不同金融產品轉發到不同的撮合產品集群中可以實現多產品高效并行撮合。
2.6.2 系統軟件體系架構
62fe49423bff42f5b1ad1126c8bdeedafcbdc8d1
如圖2.7所示,高可靠高性能撮合模型主要由表示層、轉發層、業務層和數據層組成。其核心部分業務層主要由撮合引擎集群組成,每個撮合引擎采用原子多播將訂單定序后進行撮合處理,并結合無鎖訂單隊列實現高效流水線撮合,最后結果寫入本地日志。整個業務流程由消息傳遞總線將消息反饋給轉發層。轉發層則根據產品轉發規則將訂單轉發給相應撮合引擎集群;而撮合引擎將本地日志中的交易記錄讀取到異步持久化代理進程中,并進而與數據層的異步持久化寫入進程通信,并最終持久化到數據庫中。本地日志增強了撮合系統數據的可靠性,在出現故障后,數據仍就可以從本地日志中恢復;而界步的持久化機制則提高了數據的持久化吞吐率。
2.6.3 撮合引擎架構
4e635a5d79dedb95d6614c5dc11585a8b9b24c8a
為了使系統可擴展易維護,撮合引擎由原子多播訂單定序模塊、撮合處理器模塊、交易記錄日志模塊和內存數據組成,每個模塊根據功能業務劃分。其中各部分主要有以下功能:交易訂單接收線程:負責從網關接收訂單,并完成原子多播定序流程。交易訂單發送線程:將定序完成的訂單發送給相關撮合業務線程。交易信息發送線程:將訂單交易狀態反饋給網關。外圍業務邏輯線程:進行撮合數據的準備處理,更新內存訂單數據。撮合業務邏輯線程:根據確定性撮合算法撮合接收的訂單。交易行情發布線程:處理內存行情信息并發布給網關。同步日志寫線程:將訂單撮合產生的交易記錄同步持久化到本地日志文件。異步持久化代理進程:異步將日志文件中的數據讀取并持久化到數據庫。訂單信息:存儲訂單的相關價格、數量、用戶、限制、類型和狀態等信息交易行情信息:撮合交易過程中的交易行情信息。
2.6.4 系統接口
撮合系統主要為使用者提供訂單的下單和查詢服務、交易行情的實時反饋功能以及系統狀態的監控查看服務。因此系統需要實現預留的接口主要包括:下單接口、訂單查詢接口、行情查詢接口、系統控制接口和運行狀態查詢接口等。
2.7 小節
從總體設計入手,將撮合業務處理從數據庫遷移至內存中,同時釆用多機熱備份技術解決內存撮合技術的易失性問題,最終提出內存狀態機復制方案作為高可靠髙性能撮合系統的實現路線。撮合技術的具體實現將在下一章進行詳細論述。
Q&A
Q:熱備的機制上。多個機器內存上的狀態如何保證強一致性的?
A: 是熱備機器都是無狀態,普洱茶按照不同品種產生不同撮合序列,只要保證單品種有序,其他撮合機和本機沒有關系。
Q: 如果新加入一臺撮合引擎,怎么判斷所有的撮合數據都同步到了這臺新的引擎上?
A: 委托單先要寫raid文件系統,新增撮合引擎,也可以拿到數據。
Q: 根據你的描述,一個集群中為了判斷撮合引擎是否有故障,至少應該有3臺撮合引擎吧?
A:? zk來管理,并且有風控進程監控撮合進度。
Q: 內存狀態機的復制究竟是結果還是數據?
A: 數據,就是把處理到某個狀態的數據復制出來。
Q: 如果只有兩臺撮合引擎,如果對一個買入訂單,發現結果不一致,如何判斷是哪一臺的故障?
A: 撮合只有一臺進行撮合,撮合結束才回寫數據庫產生行情和分發個個終端,用戶就可以看到自己委托單是否成交。