交易系统解析(六)前台报盘应用设计要点
市場(chǎng)參與者每日使用的交易所應(yīng)用程序是前臺(tái)報(bào)盤程序EzOES。上交所在開發(fā)建設(shè)新交易系統(tǒng)過程中,廣泛吸收處理不同會(huì)員的反饋意見,使得EzOES可為市場(chǎng)參與者提供更高的報(bào)盤速率、更易用的操作界面、更快捷的成交回報(bào)以及更簡(jiǎn)單的備份切換流程等特征。
為使得廣大市場(chǎng)參與者能夠更好地理解和使用EzOES,這里把一些高層設(shè)計(jì)理念分享出來。如果大家還有更好的主意,也請(qǐng)反饋。
一、跨市場(chǎng)統(tǒng)一架構(gòu)以及開放性監(jiān)控接口
二、層次接入模型以及多環(huán)境概念
三、防重復(fù)登錄以及雙向心跳
四、成交回報(bào)推送以及重傳機(jī)制
五、獨(dú)立日歷以及前后臺(tái)時(shí)鐘同步機(jī)制
六、后臺(tái)防重單以及前臺(tái)斷網(wǎng)重連機(jī)制
七、滑動(dòng)窗口以及流速權(quán)控制
本文內(nèi)容為個(gè)人觀點(diǎn),不代表任何機(jī)構(gòu)或者組織意見,不保證內(nèi)容完全準(zhǔn)確。
如果對(duì)本博http://blog.sina.com.cn/drwjf內(nèi)容進(jìn)行摘錄和轉(zhuǎn)載,請(qǐng)保留本段說明。
?????????????????????????????????????????????????武劍鋒
廣大市場(chǎng)參與者可以直接接觸到新交易系統(tǒng)的部分是報(bào)盤應(yīng)用程序。該應(yīng)用程序是市場(chǎng)參與者系統(tǒng)與交易所系統(tǒng)之間的“網(wǎng)關(guān)”,負(fù)責(zé)將市場(chǎng)參與者收集到的投資者委托向交易所申報(bào),并接收交易所返回的委托確認(rèn)和成交確認(rèn)。
在2006年時(shí),上交所曾經(jīng)推出會(huì)員集成系統(tǒng)服務(wù)器MISS作為報(bào)盤應(yīng)用的載體,供市場(chǎng)參與者試用。由于其集成了行情接收、訂單輸入、成交接收、報(bào)表下載、自動(dòng)升級(jí)等功能,且支持設(shè)備間故障接管,支持單向衛(wèi)星鏈路,在支持傳統(tǒng)數(shù)據(jù)庫(kù)接口的同時(shí),也支持STEP1.0 / FIX 4.2接口,相對(duì)比較復(fù)雜,導(dǎo)致其性能和穩(wěn)定性不能滿足市場(chǎng)參與者的需求。
在2007年,上交所通過走訪會(huì)員,重新設(shè)計(jì)了報(bào)盤應(yīng)用子系統(tǒng)EzOES 和報(bào)表下載子系統(tǒng) RptGet,沿用單向衛(wèi)星接收子系統(tǒng)SatReceiver。與MISS相比,降低了報(bào)盤應(yīng)用的使用復(fù)雜性,提高了報(bào)盤性能和系統(tǒng)穩(wěn)定性。運(yùn)行該程序的計(jì)算機(jī)通稱“報(bào)盤機(jī)”。
在2008年,上交所通過邀請(qǐng)“先鋒會(huì)員”對(duì)內(nèi)部版本進(jìn)行多輪試用,并組織討論,采納大家提出的很有價(jià)值的建議,之后進(jìn)一步對(duì)用戶界面、接口方式進(jìn)行了改進(jìn)。
本章結(jié)合新交易系統(tǒng)后臺(tái)的一些設(shè)計(jì)特征,介紹前臺(tái)報(bào)盤應(yīng)用的內(nèi)在設(shè)計(jì)邏輯。
一、跨市場(chǎng)統(tǒng)一架構(gòu)以及開放性監(jiān)控接口
上交所通過這次新交易系統(tǒng)的升級(jí),集約化了后臺(tái)部分,把A股市場(chǎng)與B股市場(chǎng)統(tǒng)一到了一套系統(tǒng)內(nèi)部,A股市場(chǎng)被切分為6個(gè)產(chǎn)品集(編號(hào)從1到6),而B股由于規(guī)模小,只是整個(gè)系統(tǒng)中的另外一個(gè)產(chǎn)品集(編號(hào)為20)。這樣的設(shè)計(jì)方式即簡(jiǎn)化了后臺(tái)整體的架構(gòu)和邏輯,也保證了A股交易和B股交易對(duì)外時(shí)鐘同步功能、接口設(shè)計(jì)、系統(tǒng)管理等各個(gè)方面的一致。在這個(gè)前提下,A股與B股兩個(gè)市場(chǎng)的前、后臺(tái)擁有了共用完全相同的同一套代碼的能力。同時(shí),這樣的改進(jìn)還使得未來再有不同交易貨幣或者不同交易機(jī)制規(guī)則的產(chǎn)品推出時(shí),系統(tǒng)后臺(tái)和前臺(tái)都無需進(jìn)行大的部署調(diào)整。
但是為維持市場(chǎng)用戶習(xí)慣,A股和B股的前臺(tái)應(yīng)用程序還是強(qiáng)制性地控制需要分別啟動(dòng),EzOES的執(zhí)行文件以及配置文件中仍然區(qū)分A股還是B股。子目錄\cfgA下放置A股配置文件,\cfgB下放置B股配置文件。
EzOES提供開放的監(jiān)控接口,在運(yùn)行時(shí),實(shí)時(shí)(缺省配置為2秒)生成運(yùn)行狀態(tài)文件ASHR_status.txt。文件以類似ini文件的格式提供,便于其他定制的程序處理。該文件揭示內(nèi)容有市場(chǎng)類型、OES狀態(tài)、交易員狀態(tài)、當(dāng)前工作、PBU報(bào)單數(shù)、委托確認(rèn)數(shù)、成交數(shù)、流速權(quán)、接口表最大記錄號(hào)等。
二、層次接入模型以及多環(huán)境概念
上交所新交易系統(tǒng)核心后臺(tái)分層設(shè)計(jì),可概括為“接入層”與“核心層”。EzOES不能直接訪問到上交所后臺(tái)的“核心層”部分,它們直接連接到的是我們稱之為一組“通信服務(wù)器”(以下簡(jiǎn)稱CS)的“接入層”子系統(tǒng)。
為了支持在系統(tǒng)部署期間、演練期間和切換上線時(shí)的平穩(wěn),新交易系統(tǒng)增加了一批新的IP地址供市場(chǎng)參與者接入。新的CS設(shè)計(jì)和功能與原有的“交易前置機(jī)GW”有所不同,并且CS在IP地址、設(shè)備命名、接入負(fù)載等方面進(jìn)行了重新規(guī)劃,規(guī)范了定義和分區(qū)。
參加過系統(tǒng)切換上線準(zhǔn)備工作的市場(chǎng)參與者應(yīng)該還記得,通過查找地址映射表,從GW IP地址定位到應(yīng)該接入的CS IP地址的過程。
上交所交易系統(tǒng)核心部分部署在兩個(gè)相隔20公里只上的獨(dú)立數(shù)據(jù)中心,市場(chǎng)參與者可以通過查看CS IP地址從左起數(shù)第三位,根據(jù)其是否大于130來判斷CS位于上交所哪一個(gè)數(shù)據(jù)中心,然后評(píng)估自身系統(tǒng)接入上交所交易系統(tǒng)的“容災(zāi)”水平。理想的情況是,至少有兩個(gè)鏈路,分別接入上交所這兩個(gè)不同的數(shù)據(jù)中心。
CS作為“應(yīng)用網(wǎng)關(guān)”,將接入市場(chǎng)參與者的廣域網(wǎng)和上交所核心網(wǎng)絡(luò)隔離開來。所有EzOES的請(qǐng)求均通過CS代理后才能進(jìn)入上交所核心子系統(tǒng)。CS進(jìn)行“匯聚”和“路由”功能,負(fù)責(zé)把EzOES的請(qǐng)求,根據(jù)產(chǎn)品集進(jìn)行匯聚后,向適當(dāng)?shù)慕灰字鳈C(jī)發(fā)出,也負(fù)責(zé)把主機(jī)給出的響應(yīng)和成交確認(rèn)向適當(dāng)?shù)腅zOES發(fā)回。
CS高度冗余,EzOES可以通過不同鏈路,連接到不同CS,防止接入層面的“單點(diǎn)故障”。
EzOES和CS之間采用TCP/IP協(xié)議,以消息報(bào)文的形式傳遞信息。消息報(bào)文的傳輸按照兩種類型的模式進(jìn)行,一個(gè)是“請(qǐng)求/響應(yīng)”的模式,用來處理委托發(fā)送、委托響應(yīng);登錄、登錄響應(yīng)這一類的業(yè)務(wù)。另外一個(gè)是“訂閱/廣播”的模式,用來處理成交確認(rèn)推送這一類的業(yè)務(wù)。
CS對(duì)EzOES提供兩個(gè)端口:MD(1**05)和UD(1**06)。EzOES的每個(gè)操作員在登錄時(shí)通過和MD端口交互來進(jìn)行校驗(yàn),而每個(gè)操作員在登錄之后均與UD端口保持一個(gè)連接。
由于成本原因,市場(chǎng)參與者通常在與交易所之間的廣域網(wǎng)絡(luò)上即進(jìn)行生產(chǎn),也用于測(cè)試。為降低風(fēng)險(xiǎn),新系統(tǒng)提供了“多環(huán)境”的機(jī)制。多環(huán)境通過環(huán)境號(hào)來隔離生產(chǎn)與測(cè)試,目前規(guī)劃使用#00環(huán)境號(hào)作為生產(chǎn)用,使用#88環(huán)境號(hào)作為測(cè)試用。在EzOES啟動(dòng)時(shí),如果發(fā)現(xiàn)環(huán)境號(hào)不是#00,會(huì)彈出對(duì)話框請(qǐng)用戶確認(rèn)。在EzOES啟動(dòng)后,如果環(huán)境號(hào)不是#00,整個(gè)用戶界面的背景色都會(huì)變?yōu)榉奂t色警示。
三、防重復(fù)登錄以及雙向心跳
為了盡快發(fā)現(xiàn)可能存在的“錯(cuò)誤登錄”,市場(chǎng)慣例是當(dāng)一個(gè)操作員登錄成功后,該操作員不能再登錄。當(dāng)操作員發(fā)現(xiàn)自己不能登錄時(shí),可以通過聯(lián)系上交所主機(jī)房運(yùn)行人員檢查是否有不該發(fā)生的問題。
在歷史上,這個(gè)機(jī)制確實(shí)救過人。某一年,甲證券公司機(jī)房信息技術(shù)人員被高薪挖到了乙證券公司,繼續(xù)從事這個(gè)很有前途的職業(yè)。甲證券公司在損失一員大將后,正處在從痛苦中恢復(fù)的過程中,接替的員工還沒有來得及去修改口令。而這位老兄到了新公司,在緊張和興奮中,就在乙證券公司的機(jī)房用甲證券公司的操作員早早地登錄成功。此時(shí),幸虧“防重復(fù)登錄機(jī)制”發(fā)生作用,甲證券公司的接替員工在按時(shí)上班時(shí),發(fā)現(xiàn)自己不能登錄,迅速報(bào)告上交所主機(jī)房,避免了一場(chǎng)運(yùn)行事故。
在Web服務(wù)器和瀏覽器的基礎(chǔ)架構(gòu)設(shè)計(jì)中,有一個(gè)很常用的術(shù)語Cookie。而關(guān)于這個(gè)詞怎么引入信息技術(shù)的,即便對(duì)我這個(gè)“考據(jù)愛好者”來說,也沒有找到充分和可信的依據(jù)。不過推測(cè)應(yīng)該來自美國(guó)或者加拿大的計(jì)算機(jī)科學(xué)家,因?yàn)閏ookie是加拿大和北美專用的詞匯,同樣的“小甜點(diǎn)”在其他英語國(guó)家,用的是biscuit這個(gè)詞。
Cookie是指Web服務(wù)器在用戶的硬盤上存儲(chǔ)的信息,這些信息以名稱/值對(duì)的形式存儲(chǔ),并可在以后檢索此信息。其基本工作原理如果用戶訪問站點(diǎn)上的頁(yè)面,瀏覽器會(huì)在本地硬盤上查找與該頁(yè)面相關(guān)聯(lián)的Cookie。如果該Cookie存在,瀏覽器就將它與頁(yè)面請(qǐng)求一起發(fā)送到站點(diǎn)。如果未找到任何Cookie,則不會(huì)發(fā)送任何Cookie數(shù)據(jù)。Web服務(wù)器接收Cookie數(shù)據(jù)和頁(yè)面請(qǐng)求并可以使用它們。如果未接收到任何Cookie,Web服務(wù)器可以知道之前從未訪問過該網(wǎng)站,Web服務(wù)器可生成一個(gè)新Cookie,放置在它發(fā)送的網(wǎng)頁(yè)的標(biāo)頭中,從而發(fā)送到客戶計(jì)算機(jī)上,客戶計(jì)算機(jī)瀏覽器則可將cookie存儲(chǔ)在硬盤上。通過這樣的工作原理,Cookie能夠幫助Web站點(diǎn)保存有關(guān)訪問者的信息。更概括地說,Cookie是一種保持Web應(yīng)用程序具有狀態(tài)的方法。
因?yàn)镋zOES采用類似的機(jī)制實(shí)現(xiàn)防止操作員重復(fù)登錄的功能,所以我們也把這種技術(shù)稱為cookie,詳細(xì)過程如下:操作員登錄成功后,后臺(tái)給操作員分配的一個(gè)唯一的標(biāo)識(shí)符即cookie,cookie由一個(gè)64位的整數(shù)(8個(gè)字節(jié))組成。Cookie是當(dāng)日不變的,也是當(dāng)日才有效。
對(duì)于配置把Cookie保存到本地文件的操作員,其流程可歸結(jié)為下述幾種情況:
(1)該操作員已經(jīng)連接到CS
不帶cookie或者帶了錯(cuò)誤的cookie的登錄請(qǐng)求到達(dá)后臺(tái)后,后臺(tái)會(huì)拒絕這個(gè)登錄請(qǐng)求。表現(xiàn)出來的現(xiàn)象就是“后登錄的沒有cookie的操作員,在前一個(gè)操作員未退出時(shí),無法登錄”。
帶正確的cookie的登錄請(qǐng)求到達(dá)后臺(tái)后,后臺(tái)認(rèn)為是通過同一臺(tái)計(jì)算機(jī)登錄的同一個(gè)操作員,接受這個(gè)新的登錄請(qǐng)求。在新的登錄請(qǐng)求接受之前,原有的連接會(huì)收到特定的消息,該消息帶錯(cuò)誤代碼,此時(shí)EzOES會(huì)根據(jù)該錯(cuò)誤代碼把原登錄操作員退出并斷開連接。表現(xiàn)出來的現(xiàn)象就是“后登錄的操作員,由于擁有正確的cookie,而把前一個(gè)操作員踢出系統(tǒng)”。
(2)該操作員尚未連接到CS
如果操作員尚未連接到CS,那么登錄請(qǐng)求無論是否帶cookie都都會(huì)被接受。需要提醒的是,交易日第一次登錄的時(shí)候,可能會(huì)把前一日的cookie通過登錄請(qǐng)求傳后后臺(tái),即登錄請(qǐng)求帶錯(cuò)誤的cookie,后臺(tái)在該操作員當(dāng)日從未連接過的情況下不會(huì)校驗(yàn)該值,并且生成新的cookie返回。
考慮到特殊情況,比如登錄響應(yīng)丟失,那么相當(dāng)于后臺(tái)認(rèn)為操作員已經(jīng)登錄,前臺(tái)卻未能拿到cookie。因登錄請(qǐng)求沒有響應(yīng)而超時(shí),EzOES會(huì)重復(fù)嘗試wanRetry(用戶配置參數(shù))次,這類情形無需人工干預(yù)。
在對(duì)市場(chǎng)發(fā)布的EzOES缺省配置中,設(shè)置不把cookie保存到本地文件,cookie內(nèi)容僅存在于內(nèi)存中。之所以這樣配置不把Cookie寫入磁盤的原因是:新交易系統(tǒng)中設(shè)計(jì)了前臺(tái)和后臺(tái)之間的雙向心跳,原來經(jīng)常使用的吧Cookie寫入磁盤并復(fù)制到其他機(jī)器上,以支持在報(bào)盤機(jī)故障后,能夠自行恢復(fù)登錄的方法,已經(jīng)不是很有必要性了。EzOES保留寫入磁盤的參數(shù)配置的功能,只是為了提供“兼容性”。
在防重復(fù)登錄機(jī)制發(fā)揮作用時(shí),如果不考慮“心跳”機(jī)制,那么在某些特殊情況下,可能發(fā)生:前一次登錄處于“僵死狀態(tài)”不能正常工作,而后續(xù)登錄被拒絕的場(chǎng)景。這樣的場(chǎng)景對(duì)用戶安全運(yùn)行有很大威脅。
新交易系統(tǒng)為防范這種風(fēng)險(xiǎn),通過EzOES和CS之間的如下互動(dòng)邏輯,系統(tǒng)實(shí)現(xiàn)了雙向心跳機(jī)制:
1)EzOES的每個(gè)操作員要在連接空閑時(shí)定時(shí)(4秒鐘)向CS發(fā)送連接檢查消息。若CS長(zhǎng)時(shí)間既沒有收到EzOES的業(yè)務(wù)消息,也沒有收到連接檢查消息,CS會(huì)斷開與EzOES之間的連接,此時(shí)EzOES會(huì)根據(jù)操作員的狀態(tài)進(jìn)行不同的處理:如果操作員在正常運(yùn)行狀態(tài),系統(tǒng)會(huì)進(jìn)行重新連接,該過程同“登錄過程”;如果操作員不在正常運(yùn)行狀態(tài),如正在初始化、正在登錄或正在注銷等狀態(tài),則系統(tǒng)自動(dòng)將該操作員注銷。此處重連加上狀態(tài)條件是為了避免在CS異常情況下連上去就被斷開會(huì)造成死循環(huán)。
2)為快速檢測(cè)到鏈路故障,CS也對(duì)EzOES心跳進(jìn)行回應(yīng)。CS在10倍的心跳間隔CsRdrTimeOut(心跳間隔為4秒鐘)內(nèi)如果還沒能給出消息回應(yīng),則EzOES斷開連接并認(rèn)為連接異常進(jìn)行相應(yīng)的處理。
由于心跳機(jī)制的實(shí)現(xiàn),在處理操作員注銷操作時(shí),EzOES向后臺(tái)發(fā)送操作員注銷請(qǐng)求,但是無論響應(yīng)成功還是失敗,均退出操作員并斷開連接。且注銷的時(shí)候同時(shí)清除內(nèi)存中的操作員密碼。
四、成交回報(bào)推送以及重傳機(jī)制
為縮短市場(chǎng)參與者拿到成交回報(bào)的延時(shí),新交易系統(tǒng)實(shí)現(xiàn)“成交回報(bào)推送”的機(jī)制,也就是說訂單在后臺(tái)一旦撮合成功,即刻從后臺(tái)向前臺(tái)送出成交回報(bào)。同時(shí),由于成交回報(bào)在傳輸過程中可能的丟失,或者前臺(tái)由于各種特殊需要而需要從后臺(tái)重新拿到成交,系統(tǒng)也同時(shí)實(shí)現(xiàn)“成交回報(bào)重傳”機(jī)制。
新交易系統(tǒng)提供“可擴(kuò)展性”,其一個(gè)基本原則是對(duì)各個(gè)產(chǎn)品的交易撮合不再集中在一臺(tái)設(shè)備上進(jìn)行,而是按照若干個(gè)產(chǎn)品集SET分布在不同的交易主機(jī)上。所以下文中會(huì)反復(fù)提到產(chǎn)品集SET的概念。
與處理操作員登錄不同,新交易系統(tǒng)在處理成交數(shù)據(jù)流時(shí),是按照“交易單元”來管理的。為實(shí)現(xiàn)“成交回報(bào)推送以及重傳機(jī)制”,除了業(yè)務(wù)上標(biāo)識(shí)成交的唯一編號(hào):成交編號(hào)tradeNo之外(對(duì)于同一個(gè)成交編號(hào),同一次成交有兩條數(shù)據(jù),分別對(duì)應(yīng)買方和賣方),另外提供了廣播序號(hào)seqNo,這是交易系統(tǒng)后臺(tái)針對(duì)每個(gè)交易單元和產(chǎn)品集的同一類型私有廣播(如成交確認(rèn))進(jìn)行的編號(hào),對(duì)于一個(gè)交易單元一個(gè)產(chǎn)品集該序號(hào)從1開始,連續(xù)遞增。前臺(tái)需要“成交回報(bào)重傳”時(shí),也需要根據(jù)該廣播序號(hào)向后臺(tái)發(fā)出請(qǐng)求。
在原有市場(chǎng)參與者接口表3中有兩個(gè)字段:gdxm和bcye。在2002年中國(guó)結(jié)算公司成立之后,由于交易業(yè)務(wù)中g(shù)dxm不是必要字段,從而中國(guó)結(jié)算不再向交易系統(tǒng)提供股東姓名的更新數(shù)據(jù),故交易系統(tǒng)中的gdxm字段不再更新;而bcye字段存放本次成交后賬戶余額。為避免接口表在系統(tǒng)上線時(shí)的大調(diào)整,EzOES把產(chǎn)品集SET號(hào)和變換后的廣播序號(hào)seqNo,分別寫入gdxm和bcye字段,其中bcye字段中寫入的值是原廣播序號(hào)的10倍(這樣就能在ETF等需要映射成多條記錄時(shí)通過加上個(gè)位數(shù)來防止重復(fù))。
成交確認(rèn)只有一種恢復(fù)方式,即恢復(fù)表3尾部丟失的成交回報(bào)。對(duì)從表3中間刪除若干成交回報(bào)的情形,EzOES不予恢復(fù)。對(duì)于表3全部清除的情形,EzOES直接向后臺(tái)請(qǐng)求重發(fā)所有SET上的所有成交。表3非全部清除情況下考慮到成交回報(bào)的廣播序號(hào)(seqNo)只在SET內(nèi)部連續(xù),恢復(fù)成交回報(bào)必須通過查詢數(shù)據(jù)庫(kù)獲得成交確認(rèn)表中記錄的每個(gè)set的最大廣播序號(hào)。如果某個(gè)或某些SET在數(shù)據(jù)庫(kù)中沒有成交,則EzOES會(huì)從seqNo=1開始恢復(fù)。
為降低對(duì)數(shù)據(jù)庫(kù)訪問的壓力,在處理成交回報(bào)時(shí),采用緩沖機(jī)制。EzOES對(duì)每個(gè)SET都設(shè)置相應(yīng)的“缺口填補(bǔ)隊(duì)列”,該隊(duì)列保存已經(jīng)收到(包括重傳)的序號(hào)不連續(xù)的成交確認(rèn)數(shù)據(jù),隊(duì)列最大長(zhǎng)度為10000。若“缺口填補(bǔ)隊(duì)列”中序號(hào)連續(xù)且沒有缺口,則寫入數(shù)據(jù)庫(kù)接口表。若EzOES發(fā)現(xiàn)有缺口(序號(hào)不連續(xù))并且進(jìn)行“消息檢查”時(shí)發(fā)現(xiàn)當(dāng)前消息的序號(hào)大于當(dāng)前隊(duì)列所能夠存放的序號(hào),則丟棄該數(shù)據(jù),該數(shù)據(jù)將在后續(xù)的成交確認(rèn)恢復(fù)過程中進(jìn)行恢復(fù)。
此外,為避免大規(guī)模重傳給后臺(tái)帶來的壓力,重傳請(qǐng)求的范圍會(huì)被分割,其分割單位(BATCH_SIZE)為可配置(缺省值為45,因?yàn)槊總€(gè)數(shù)據(jù)包(最大為4K)所能傳輸?shù)某山粩?shù)量為最多為45條,EzOES要求該值不能大于360,否則取最大值360),即如果需要重傳10000條成交回報(bào),EzOES會(huì)依次發(fā)出10000/BATCH_SIZE +1條異步的成交回報(bào)重傳請(qǐng)求。為避免“并發(fā)”的重傳請(qǐng)求太多,必須等上一個(gè)重傳請(qǐng)求的成交全部收到后才會(huì)發(fā)送下一個(gè)重傳請(qǐng)求。
此外,因成交的重傳是靠發(fā)現(xiàn)缺口來驅(qū)動(dòng),如果每個(gè)SET最后若干條成交回報(bào)丟失則無法發(fā)現(xiàn)。對(duì)此系統(tǒng)設(shè)計(jì)了兩個(gè)機(jī)制:一是后臺(tái)系統(tǒng)在閉市后,為每個(gè)SET發(fā)送一個(gè)流結(jié)束EOS消息,EzOES在收到所有SET的流結(jié)術(shù)消息后,確認(rèn)無缺口,并提示成交回報(bào)接收完畢。二是當(dāng)連續(xù)2分鐘沒有收到成交,則去比較本地已經(jīng)收到的最大成交序號(hào)和后臺(tái)最新成交序號(hào),若有g(shù)ap則進(jìn)行重傳。直到所有EOS收到為止。
如果登錄時(shí)候發(fā)現(xiàn)需要恢復(fù)的成交數(shù)量較大(超過10000條,此值可配置)則彈出提示框,提示選擇是繼續(xù)收新來的成交還是開始恢復(fù)丟失的成交。
需要特別說明的是,采用“成交回報(bào)推送”機(jī)制后,可以想象,相對(duì)后臺(tái)系統(tǒng)的強(qiáng)勁處理能力,前臺(tái)報(bào)盤機(jī)的處理能力太弱了,如果在后臺(tái)發(fā)生大量成交瞬時(shí)生成,成交回報(bào)瞬時(shí)推送到前臺(tái),很有可能頃刻間打垮前臺(tái)接口數(shù)據(jù)庫(kù)等。為此,EzOES在插入寫數(shù)據(jù)庫(kù)的隊(duì)列時(shí),檢查該寫隊(duì)列的大小,當(dāng)該隊(duì)列大于閥值,控制讀數(shù)據(jù)庫(kù)的功能和從后臺(tái)取成交回報(bào)的功能暫停。這樣控制的目的是,保證系統(tǒng)不在壓力過大的前提下崩潰,而是通過暫停產(chǎn)生新壓力的原則,使得壓力逐漸被“消化”。
五、獨(dú)立日歷以及前后臺(tái)時(shí)鐘同步機(jī)制
在市場(chǎng)創(chuàng)新業(yè)務(wù)推出前,經(jīng)常需要組織測(cè)試,而完成一個(gè)完整的業(yè)務(wù),常常需要在一個(gè)日歷日內(nèi)安排多個(gè)交易日的仿真。在過去,這樣的測(cè)試需要通過修改計(jì)算機(jī)設(shè)備的系統(tǒng)時(shí)鐘來進(jìn)行,而這樣的調(diào)整往往蘊(yùn)含著比較大的操作風(fēng)險(xiǎn)。因此,為降低測(cè)試帶來的風(fēng)險(xiǎn),新交易系統(tǒng)實(shí)現(xiàn)了一種稱為“獨(dú)立日歷”的機(jī)制,即應(yīng)用本身的“日歷”可以和系統(tǒng)設(shè)備的“日歷”獨(dú)立。應(yīng)用在獲取時(shí)間的時(shí)候,是通過把自身的維護(hù)的一個(gè)日期數(shù)據(jù)與通過系統(tǒng)調(diào)用返回的時(shí)間數(shù)據(jù),組合之后作為應(yīng)用采用的時(shí)間來使用。這樣的設(shè)計(jì),使得機(jī)器設(shè)備的日期和業(yè)務(wù)應(yīng)用的日期相互獨(dú)立,提供了必要的靈活性。
在新交易系統(tǒng)數(shù)據(jù)中心內(nèi)部,通過高等級(jí)的原子種和標(biāo)準(zhǔn)的NTP服務(wù),保證所有交易主機(jī)、CS等設(shè)備的系統(tǒng)時(shí)鐘均同步到一個(gè)標(biāo)準(zhǔn)時(shí)間上。而與此同時(shí),市場(chǎng)參與者的柜臺(tái)系統(tǒng)普遍需要和上交所后臺(tái)系統(tǒng)進(jìn)行對(duì)時(shí)。
新交易系統(tǒng)提供兩種方式來支持市場(chǎng)需求,一是在CS上對(duì)外開放NTP服務(wù),市場(chǎng)參與者可以在報(bào)盤機(jī)上配置NTP客戶端,或者使用上交所提供的EzNTP程序,控制對(duì)報(bào)盤機(jī)的系統(tǒng)時(shí)鐘進(jìn)行與后臺(tái)的同步。二是EzOES程序自行維護(hù)報(bào)盤機(jī)時(shí)鐘與后臺(tái)時(shí)鐘的差異,應(yīng)用程序使用后臺(tái)時(shí)鐘,而不是前臺(tái)時(shí)鐘。通過這樣兩種支持方式,市場(chǎng)參與者可以選擇EzOES在日常運(yùn)行的時(shí)候,不使用Administrator或者root這樣的超級(jí)用戶,極大地降低安全方面的風(fēng)險(xiǎn)。
下文介紹EzOES維護(hù)時(shí)鐘的原理。這個(gè)原理實(shí)際上和NTP原理相類似,都是基于一個(gè)網(wǎng)絡(luò)中,兩個(gè)節(jié)點(diǎn)之間的消息傳輸,在往來鏈路上所耗費(fèi)的時(shí)間基本相等的假設(shè),通過采取時(shí)間差的方式獲得前后臺(tái)的時(shí)間誤差。為準(zhǔn)確描述,采用如下形式化語言來說明:
第一步,EzOES發(fā)請(qǐng)求,其中記錄前臺(tái)當(dāng)前時(shí)間t1????
第二步,后臺(tái)收到前臺(tái)請(qǐng)求,立刻記錄CS當(dāng)前時(shí)間t2
第三步,后臺(tái)在響應(yīng)中復(fù)制t1和t2,在CS發(fā)出該響應(yīng)消息的時(shí)候記錄CS當(dāng)前時(shí)間t3
第四步,EzOES收到響應(yīng),記錄前臺(tái)當(dāng)前時(shí)間t4
EzOES循環(huán)進(jìn)行以上4步動(dòng)作,每次之間的間隔是2分鐘,所以如果絕對(duì)值t4-t1>2分鐘或者t4-t1<0,表示本次和后臺(tái)的交互耗費(fèi)時(shí)間太長(zhǎng)或者在交互過程中本地時(shí)間被調(diào)整過,則認(rèn)為該次軟時(shí)鐘維護(hù)無效。
消息在上下行鏈路上所花費(fèi)的時(shí)間為 ((t4-t1)-(t3-t2))/2
timegap是前臺(tái)時(shí)間和后臺(tái)時(shí)間的差額,計(jì)算方法為
timegap = t2 - (t1+((t4-t1)-(t3-t2))/2) = (t2+t3-t1-t4)/2
如果timegap<0,說明報(bào)盤機(jī)時(shí)鐘比后臺(tái)時(shí)鐘快
如果timegap>0,說明報(bào)盤機(jī)時(shí)鐘比后臺(tái)時(shí)鐘慢
如果timegap=0,說明報(bào)盤機(jī)時(shí)鐘比后臺(tái)時(shí)鐘同步
該timegap一直保存在內(nèi)存中。后臺(tái)時(shí)間即本地時(shí)間+timegap。
如果在發(fā)送時(shí)間同步請(qǐng)求卻尚未收到響應(yīng)的時(shí)刻修改本地時(shí)間,則會(huì)造成錯(cuò)誤的計(jì)算結(jié)果,該時(shí)間錯(cuò)亂在2分鐘后的下一輪時(shí)間同步會(huì)予以修正。故市場(chǎng)參與者在正常運(yùn)行過程中,不要調(diào)整系統(tǒng)本地時(shí)間。
同時(shí),EzOES也順便利用時(shí)間同步邏輯,完成“短消息”的功能。短消息的最大程度為200字節(jié),如果消息內(nèi)容不為空,EzOES會(huì)將其顯示在報(bào)盤機(jī)界面和狀態(tài)文件。該消息EzOES不做歷史存儲(chǔ),只是直接顯示當(dāng)次時(shí)間同步中獲得的短消息內(nèi)容。
六、后臺(tái)防重單以及前臺(tái)斷網(wǎng)重連機(jī)制
新交易系統(tǒng)后臺(tái)作了重大改進(jìn),系統(tǒng)確保同一個(gè)訂單不會(huì)被重復(fù)處理。基本原理就是后臺(tái)把一個(gè)產(chǎn)品集內(nèi)“業(yè)務(wù)單元+券商訂單號(hào)”作為定位訂單唯一的關(guān)鍵字,當(dāng)后臺(tái)再次收到以前曾經(jīng)收到過的相同一個(gè)關(guān)鍵字的訂單時(shí),不會(huì)將其進(jìn)當(dāng)作一個(gè)新訂單來處理,而是將以前的處理結(jié)果返回給前臺(tái)。這種后臺(tái)防重單機(jī)制的實(shí)現(xiàn),大大簡(jiǎn)化了前臺(tái)的邏輯。前臺(tái)子系統(tǒng)內(nèi)部處理各種異常簡(jiǎn)化為一種方法:“重發(fā)”。
在新交易系統(tǒng)繼承和兼容原有的SQL數(shù)據(jù)庫(kù)接口中,券商訂單號(hào)的取值是采用記錄順序號(hào)rec_num。在切換后推出的STEP協(xié)議接口中,將不再保留記錄順序順序號(hào)rec_num,統(tǒng)一采用唯一的券商訂單號(hào)(也被稱為Reff),以簡(jiǎn)化市場(chǎng)參與者柜臺(tái)系統(tǒng)的設(shè)計(jì)。
由于EzOES部署在市場(chǎng)參與者的數(shù)據(jù)中心,通過廣域網(wǎng)與交易所數(shù)據(jù)中心連通,而廣域網(wǎng)發(fā)生中斷的概率較高。為提高系統(tǒng)的易用性和自動(dòng)化程度,當(dāng)EzOES檢測(cè)到廣域網(wǎng)中斷后,會(huì)自動(dòng)通過備用鏈路重連。
重連的核心原理是:EzOES在預(yù)先配置的備用鏈路組合(CS IP,LocalIP)上重新執(zhí)行登錄過程。該過程和正常情況下的登錄是大體是相同的,唯一的區(qū)別在于重連之后會(huì)把內(nèi)存中的未收到響應(yīng)的訂單重發(fā),而手工登錄則會(huì)清除內(nèi)存中的未收到響應(yīng)的訂單數(shù)據(jù)。
七、滑動(dòng)窗口以及流速權(quán)控制
EzOES使用了一種在網(wǎng)絡(luò)底層協(xié)議中廣泛使用“滑動(dòng)窗口”流控技術(shù)。EzOES控制當(dāng)未確認(rèn)的訂單數(shù)目達(dá)到窗口上限時(shí)暫停發(fā)送。示例如下,假設(shè)窗口大小為5,需要發(fā)送編號(hào)從1到20的訂單,首先EzOES發(fā)送1到5,達(dá)到窗口上限,暫停發(fā)送;當(dāng)后臺(tái)返回x個(gè)確認(rèn),則EzOES馬上再發(fā)送編號(hào)為6,...,6+x訂單,使得再次到達(dá)窗口上限,等待進(jìn)一步的確認(rèn)返回。總之,是一種“異步”的方式在處理。
但是對(duì)于一些特殊的場(chǎng)景,出于控制SQL接口表中相鄰訂單順序申報(bào)的理由,滑動(dòng)窗口的大小需要控制為1,使得前臺(tái)在一筆訂單向后臺(tái)發(fā)送之后,只有等待后臺(tái)對(duì)該筆訂單的響應(yīng)回來之后,才向后臺(tái)發(fā)送下一筆訂單。目前,采用這種同步發(fā)單的場(chǎng)景有:后臺(tái)返回響應(yīng)說明交易時(shí)間表還未到、處于交易時(shí)段轉(zhuǎn)換期、后臺(tái)遇到Failover等純技術(shù)因素拒單時(shí)。
經(jīng)常有市場(chǎng)參與者咨詢?nèi)绾巍皳尩郊细?jìng)價(jià)階段的第一筆訂單?”,那么集合競(jìng)價(jià)開始之前EzOES究竟采用何種方式向后臺(tái)申報(bào)委托呢?下文概述之:
1)EzOES在登錄成功后,會(huì)從后臺(tái)獲取到當(dāng)日交易時(shí)間表,確定何時(shí)進(jìn)行交易時(shí)段的轉(zhuǎn)換,比如從開市前時(shí)段轉(zhuǎn)換到集合競(jìng)價(jià)時(shí)段。
2)在交易時(shí)段轉(zhuǎn)換之前,EzOES采用同步方式報(bào)單,即向后臺(tái)發(fā)出一單之后,需要等待這一個(gè)訂單確認(rèn)返回后,才進(jìn)行后續(xù)處理。這也被我們稱為“敲門機(jī)制”。過程是當(dāng)訂單從EzOES發(fā)出,經(jīng)過廣域網(wǎng)傳輸?shù)竭_(dá)后臺(tái)后,如果后臺(tái)還未開市,則訂單被拒絕,且其錯(cuò)誤代碼標(biāo)明后臺(tái)尚未開市。EzOES根據(jù)這個(gè)錯(cuò)誤代碼,睡眠50毫秒后重新發(fā)送該訂單,直到該訂單被后臺(tái)接收。
3)當(dāng)訂單被后臺(tái)接收后,EzOES則轉(zhuǎn)換入異步的滑動(dòng)窗口方式報(bào)單。
從這個(gè)過程可以看出,“去得早不如去得巧”,如果訂單發(fā)出得早,而后臺(tái)尚未開市,則需要下一個(gè)周期才能再次嘗試;而很可能另外一個(gè)報(bào)盤機(jī),訂單發(fā)出的稍晚幾個(gè)毫秒,但是恰好后臺(tái)剛剛開市,即刻就進(jìn)入后臺(tái)。但是,這個(gè)也是公平的,由于屬于“隨機(jī)”分布的,每個(gè)報(bào)盤機(jī)都有相同的概率,從長(zhǎng)期運(yùn)行的情況來看,獲得排名第一筆訂單的次數(shù)是基本一致的。
EzOES對(duì)流速的控制通過限定滑動(dòng)窗口的大小來實(shí)現(xiàn)。限速值在后臺(tái)設(shè)置,該值的計(jì)算公式為:限速值(QSize)= PBU流速權(quán)×發(fā)單系數(shù)×鏈路系數(shù)。其中“發(fā)單系數(shù)”是一個(gè)常量,與用戶和鏈路無關(guān)。“發(fā)單系數(shù)”目前取值為20。鏈路系數(shù)顧名思義是根據(jù)鏈路類型的不同而取值不同。由于不同鏈路上的訂單平均響應(yīng)時(shí)間不同,鏈路系數(shù)的設(shè)置是為了保證相同的流速權(quán)的用戶在不同鏈路上有相同的報(bào)單速度。也就是說對(duì)于響應(yīng)時(shí)間比較長(zhǎng)的鏈路,交易所后臺(tái)會(huì)給出更大的QSize。目前后臺(tái)對(duì)衛(wèi)星鏈路配置為5,對(duì)地面鏈路配置為1。
PBU的流速權(quán)值會(huì)在報(bào)盤程序界面上顯示。通常情況下流速權(quán)的配置值為1-10。EzOES報(bào)單速度的近似計(jì)算公式如下:報(bào)單速度 = QSize/訂單平均響應(yīng)時(shí)間。如果訂單平均響應(yīng)時(shí)間為0.2秒,最大在途訂單量QSize為20,則1個(gè)流速權(quán)報(bào)單速度約為100筆/秒。
轉(zhuǎn)載于:https://www.cnblogs.com/timlong/p/6933616.html
總結(jié)
以上是生活随笔為你收集整理的交易系统解析(六)前台报盘应用设计要点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UnityHDRP贴图clipping方
- 下一篇: STM32F4 FPU浮点运算单元