在發(fā)布投研投顧一體化產(chǎn)品及整體解決方案后,數(shù)字動(dòng)能在量化金融領(lǐng)域的技術(shù)積累基礎(chǔ)上,發(fā)布其完全自主研發(fā),可實(shí)現(xiàn)多業(yè)務(wù)模塊間高速穩(wěn)定通訊
在發(fā)布“投研投顧一體化”產(chǎn)品及整體解決方案后,數(shù)字動(dòng)能在量化金融領(lǐng)域的技術(shù)積累基礎(chǔ)上,發(fā)布其完全自主研發(fā),可實(shí)現(xiàn)多業(yè)務(wù)模塊間高速穩(wěn)定通訊的C++RPC分布式通訊框架 –xRPC。xRPC是國(guó)內(nèi)首個(gè)面向量化金融領(lǐng)域,基于C++的RPC通訊框架,可廣泛應(yīng)用于金融領(lǐng)域有高算力、大數(shù)據(jù)傳輸需求的多業(yè)務(wù)間通訊場(chǎng)景,是金融行業(yè)實(shí)現(xiàn)集中式業(yè)務(wù)中臺(tái),解決業(yè)務(wù)間互聯(lián)互通的核心通訊技術(shù)。
一、投研投顧一體化的多業(yè)務(wù)場(chǎng)景需要分布式通訊框架支持
數(shù)字動(dòng)能自成立以來(lái)專注于量化技術(shù)在資產(chǎn)管理業(yè)務(wù)中的探索和實(shí)踐,利用金融工程+軟件工程為特點(diǎn)的量化技術(shù),數(shù)字動(dòng)能先后陸續(xù)落地了量化策略交易終端AT、策略集中業(yè)務(wù)中臺(tái)iMOM和SMD指數(shù)分析系統(tǒng)等量化投研產(chǎn)品。業(yè)務(wù)涵蓋了量化投研生產(chǎn),研究治理,再到智能投顧手機(jī)端的整個(gè)投研投顧產(chǎn)品線,產(chǎn)品間既互相聯(lián)系,又互相獨(dú)立。結(jié)合自身經(jīng)驗(yàn)積累,2017年,數(shù)字動(dòng)能面向大資管業(yè)務(wù)提出“投研投顧一體化”整體解決方案,目前在券商、期貨和公募基金公司已經(jīng)陸續(xù)獲得應(yīng)用案例。
數(shù)字動(dòng)能基于量化科技的創(chuàng)新步伐并未停止,在實(shí)踐中,“投研投顧一體化”解決方案以產(chǎn)品為中心的設(shè)計(jì)模式將迎來(lái)更大的變革。針對(duì)投研投顧中的大量定制化、業(yè)務(wù)多樣、功能場(chǎng)景復(fù)雜的特點(diǎn),解決方案產(chǎn)品間需要解決跨部門、跨業(yè)務(wù)、多場(chǎng)景業(yè)務(wù)整合和業(yè)務(wù)間數(shù)據(jù)通訊問(wèn)題。要構(gòu)建好投研前端、管理中臺(tái)和業(yè)務(wù)轉(zhuǎn)化的投研投顧一體化解決方案,一個(gè)可以組合更靈活、業(yè)務(wù)細(xì)粒度更高、 開放性更強(qiáng)的投研集中業(yè)務(wù)平臺(tái)成為技術(shù)實(shí)現(xiàn)的難點(diǎn)。解決這些問(wèn)題的首要關(guān)鍵技術(shù)在于,是否可以構(gòu)建出一套統(tǒng)一的通訊方式,既可以滿足業(yè)務(wù)/應(yīng)用間的通訊需要,又要兼顧金融行業(yè)高速穩(wěn)定特性的通訊框架。在定制類投研業(yè)務(wù)模塊的開發(fā)過(guò)程中,通過(guò)約定的分布式通訊協(xié)議,實(shí)現(xiàn)服務(wù)間高速通訊。業(yè)界普遍采用的RPC通訊方式成為了首選。
二、通用RPC框架介紹
Remote Prodecure Call是程序間的遠(yuǎn)程調(diào)用的簡(jiǎn)稱,業(yè)界目前普遍采用RPC實(shí)現(xiàn)程序間調(diào)用,一個(gè)標(biāo)準(zhǔn)的RPC調(diào)用過(guò)程如圖1所示:
圖1
如圖1,兩個(gè)程序之間能夠通信的前提,必須要有一個(gè)服務(wù)發(fā)現(xiàn)機(jī)制。傳統(tǒng)的做法是雙方先約定好地址,在各個(gè)服務(wù)都提前知道對(duì)方地址的前提下實(shí)現(xiàn)通訊,這種方式叫靜態(tài)路由。靜態(tài)路由的通訊方式在一般情況下可以滿足簡(jiǎn)單的程序間調(diào)用需求。但是隨著業(yè)務(wù)的發(fā)展,服務(wù)數(shù)量的增多讓靜態(tài)路由變得很難滿足需求,同時(shí)后臺(tái)服務(wù)有動(dòng)態(tài)上下線的需求,靜態(tài)路由表更新不及時(shí)將導(dǎo)致一系列問(wèn)題。為了解決靜態(tài)路由問(wèn)題,大部分RPC框架引入了服務(wù)注冊(cè)中心來(lái)實(shí)現(xiàn)動(dòng)態(tài)路由的功能。如下圖2所示:
圖2(注:此圖省略了序列化/反序列化,運(yùn)行時(shí)管理層以及傳輸層的步驟)
動(dòng)態(tài)路由改變了原來(lái)的應(yīng)用方式,被調(diào)用方服務(wù)啟動(dòng)的時(shí)候,先把自身的地址注冊(cè)到服務(wù)注冊(cè)中心。調(diào)用方發(fā)起RPC調(diào)用之前,先到服務(wù)注冊(cè)中心里面獲取被調(diào)用方的地址信息后才能發(fā)起RPC請(qǐng)求。
三、xRPC框架的提出
數(shù)字動(dòng)能在解決投研投顧一體化解決方案中,一些特殊服務(wù)(如回測(cè)、高頻數(shù)據(jù)傳輸?shù)?由于信息傳輸頻繁,數(shù)據(jù)并發(fā)量大和信息傳遞種類繁多,可能會(huì)產(chǎn)生硬件資源或網(wǎng)絡(luò)資源消耗,通訊效能降低的情況。在實(shí)踐中,我們認(rèn)為RPC框架還應(yīng)有更多的改進(jìn)空間,數(shù)字動(dòng)能架構(gòu)組著手改進(jìn)RPC通訊框架,以提升應(yīng)用間的通訊效率,提高信息交換的穩(wěn)定性。
四、xRPC的設(shè)計(jì)目的
A、強(qiáng)量化金融(算力調(diào)度、大數(shù)據(jù)量傳輸)應(yīng)用場(chǎng)景
B、需要基于網(wǎng)絡(luò)層的高速數(shù)據(jù)傳輸支持
C、帶數(shù)據(jù)可靠性校驗(yàn)的穩(wěn)定通訊支持
D、需要為服務(wù)/應(yīng)用提供更高效的純異步并發(fā)調(diào)用
E、增強(qiáng)RPC動(dòng)態(tài)路由算法
xRPC的設(shè)計(jì)目的是為了更好的滿足量化業(yè)務(wù)場(chǎng)景的高算力、高穩(wěn)定性和極速傳輸需要的服務(wù)/應(yīng)用間調(diào)用。通過(guò)對(duì)傳統(tǒng)的RPC通訊框架進(jìn)行全新設(shè)計(jì),xRPC對(duì)服務(wù)間的通訊穩(wěn)定性、可靠性和通訊性能進(jìn)行了深度優(yōu)化。xRPC分布式框架協(xié)議是面向量化金融領(lǐng)域(特別是面向投研投顧的應(yīng)用場(chǎng)景)的純異步高性能框架。
xRPC的通訊方式示意圖
五、xRPC框架的特點(diǎn)
1、xRPC自帶服務(wù)注冊(cè)中心和動(dòng)態(tài)路由方式
和其他RPC框架不同,xRPC同時(shí)本地緩存有一份路由表。在應(yīng)用服務(wù)啟動(dòng)時(shí),xPRC協(xié)議會(huì)要求應(yīng)用服務(wù)把自身的所有服務(wù)信息以及網(wǎng)絡(luò)地址注冊(cè)到服務(wù)注冊(cè)中心里。發(fā)送請(qǐng)求時(shí),如果本地路由的管理層沒有發(fā)現(xiàn)相應(yīng)的服務(wù)地址信息,xRPC會(huì)根據(jù)協(xié)議約定,先到服務(wù)注冊(cè)中心獲取相應(yīng)服務(wù)的地址信息,由本地路由管理層直接使用長(zhǎng)連接到對(duì)方的路由管理層中,后面如果再次發(fā)送到同一個(gè)服務(wù)里面的時(shí)候,不再需要從服務(wù)注冊(cè)中心獲取, 并且雙方是保持連接的, 能夠直接感知對(duì)方的狀態(tài), 不需要再通過(guò)服務(wù)注冊(cè)中心, 這種方式同時(shí)也能夠很好的降低服務(wù)注冊(cè)中心的壓力。
2、xRPC全新設(shè)計(jì)的高性能序列化方法
根據(jù)量化金融的業(yè)務(wù)使用特點(diǎn),把特定業(yè)務(wù)場(chǎng)景松耦合至多個(gè)服務(wù)間交互的直接代價(jià)就是增加了服務(wù)間通訊壓力,對(duì)服務(wù)間相互調(diào)用的性能要求變得極其苛刻。xPRC對(duì)RPC框架中的序列化方式進(jìn)行全新設(shè)計(jì)重構(gòu),設(shè)計(jì)出了一個(gè)高性能的序列化與反序列化的方法,來(lái)滿足量化金融對(duì)性能要求極其苛刻的場(chǎng)景。
xSerial:全新的高速RPC的序列化方法
A、對(duì)數(shù)據(jù)類型的改進(jìn)
xRPC的新序列化方法被稱為xSerial,xSerial目前除了支持基本類型之外, 還支持了list、set、map。xSerial在序列化之前,可以快速并且精確的計(jì)算出數(shù)據(jù)序列化后的所占用的內(nèi)存大小,提前申請(qǐng)好對(duì)應(yīng)大小的內(nèi)存,避免了在序列化中既要序列化又要?jiǎng)討B(tài)擴(kuò)張內(nèi)存的動(dòng)作所帶來(lái)的性能損失。xSerial的C++的使用方法如下:
B、對(duì)序列化解析器IDL的改進(jìn)
在使用的便捷性上, 大部分序列化與反序列化的方法,都是先編寫一個(gè)IDL文件,通過(guò)IDL再生成各種語(yǔ)言的代碼。xSerial也有自己的IDL支持,但是做出了改進(jìn), xSerial的IDL語(yǔ)言將與對(duì)應(yīng)的xRPC原生語(yǔ)言相融合。也就是說(shuō),如果xRPC是跑在C++上,xSerial將相應(yīng)提供一個(gè)C++的語(yǔ)法解析器,自動(dòng)去掃描C++的代碼,識(shí)別出要生成序列化的代碼,使用者無(wú)需再額外編寫IDL文件。目前xSerial的IDL支持原生Go,C#, JAVA,Matlab和Python。
C、支持動(dòng)態(tài)代碼序列化
xSerial除了支持靜態(tài)代碼的序列化方式之外,同時(shí)新增了動(dòng)態(tài)代碼序列化的使用支持。在xRPC框架的序列化過(guò)程中,xSerial生成器在生成靜態(tài)代碼的時(shí)候,會(huì)同時(shí)生成對(duì)應(yīng)的Json描述,這讓xRPC通訊過(guò)程中,任意第三方應(yīng)用服務(wù)可以直接調(diào)用xSerial的Json描述,來(lái)對(duì)通訊數(shù)據(jù)進(jìn)行動(dòng)態(tài)的序列化與反序列化。
3、xRPC獨(dú)特的通訊層:接口和通訊方法松耦合設(shè)計(jì)
在通訊上和其他RPC框架不一樣,一般RPC框架的通訊方式都是具體且唯一的,同時(shí)一般RPC框架默認(rèn)所有的應(yīng)用都是獨(dú)立進(jìn)程的。xRPC把通訊層抽象為接口,使得通訊變得更加靈活。在xRPC里面用戶只需定義接口,具體的通訊方式由底層自行決定。xRPC允許幾個(gè)應(yīng)用部署在同一個(gè)進(jìn)程中,并自動(dòng)判斷應(yīng)用是否同一個(gè)進(jìn)程,選擇信息的傳輸是通過(guò)內(nèi)存交互還是網(wǎng)絡(luò)(xRPC如果走網(wǎng)絡(luò)通訊,將基于TCP)。這個(gè)設(shè)計(jì)使得量化金融的一些特定應(yīng)用場(chǎng)景,如:對(duì)某幾個(gè)服務(wù)間的大量數(shù)據(jù)高速交換過(guò)程可完全避免網(wǎng)絡(luò)間的通訊消耗。
4、xRPC使用特點(diǎn):請(qǐng)求發(fā)起只能基于調(diào)用框架
xRPC的調(diào)用和其他RPC的調(diào)用方式不一樣,xRPC的調(diào)用必須基于調(diào)用框架才能發(fā)起請(qǐng)求,將徹底避免常見的Callback Hell問(wèn)題。通過(guò)一個(gè)列子,看看xRPC是如何解決這個(gè)問(wèn)題的:
A、發(fā)送單個(gè)RPC請(qǐng)求
B、發(fā)送多個(gè)順序的RPC請(qǐng)求
從上圖可以看到(注:忽略Exception和Finally),發(fā)送了SayHello之后,在其返回函數(shù)Then里面,只要調(diào)用Next方法,并且傳入調(diào)用下一個(gè)RPC的請(qǐng)求的參數(shù),即可繼續(xù)發(fā)起下一個(gè)RPC請(qǐng)求,比如這里在調(diào)用了SayHello2,又在SayHello2的返回函數(shù)里面調(diào)用了SayHello3,這種編寫的方式使得很好的解決了CallBack Hell的問(wèn)題,讓代碼的維護(hù)性更好。
C、 同時(shí)發(fā)送多個(gè)RPC請(qǐng)求
同時(shí)發(fā)送多個(gè)RPC請(qǐng)求,使用的調(diào)用框架是BPParallelRPC,這樣同時(shí)發(fā)送的三個(gè)請(qǐng)求,可以在Then函數(shù)里面,分別取出各個(gè)RPC的請(qǐng)求結(jié)果。
以上通過(guò)對(duì)xRPC使用的方法介紹,解釋了為什么必須通過(guò)調(diào)用框架來(lái)發(fā)起RPC請(qǐng)求,這樣RPC的定義只需要定義一次即可。后面使用只需要更換調(diào)用RPC的調(diào)用框架,而不需要去修改RPC的定義,同時(shí)每一個(gè)RPC請(qǐng)求都會(huì)注冊(cè)到RPC請(qǐng)求管理器當(dāng)中,由其對(duì)RPC進(jìn)行重傳、超時(shí)等管理。
xRPC是唯一面向金融行業(yè)的純C++分布式RPC框架
六、為什么需要面向量化金融的分布式通訊框架
高速穩(wěn)定的分布式通訊框架是實(shí)現(xiàn)業(yè)務(wù)中臺(tái)的關(guān)鍵技術(shù)
業(yè)務(wù)中臺(tái)化,本質(zhì)是解決多個(gè)業(yè)務(wù)可以通過(guò)一個(gè)中臺(tái)在彼此間實(shí)現(xiàn)互聯(lián)互通。因此業(yè)務(wù)中臺(tái)的設(shè)計(jì)中,其首要考慮的核心問(wèn)題是如何把多部門多場(chǎng)景的各類業(yè)務(wù)可迅速接入并實(shí)現(xiàn)相互間可進(jìn)行通訊。解決這個(gè)問(wèn)題的關(guān)鍵,是擁有一套穩(wěn)定高效的分布式通訊框架。國(guó)內(nèi)提供商用分布式框架解決方案的目前僅有國(guó)內(nèi)極少數(shù)幾家科技公司,而國(guó)內(nèi)提供面向金融行業(yè)的分布式框架更是少之又少,如螞蟻金服的SofaRPC分布式解決方案。SOFARPC 最早源于阿里內(nèi)部的 HSF,是近期螞蟻金服開源的一個(gè)高可擴(kuò)展性、高性能、生產(chǎn)級(jí)的 Java RPC 框架。它致力于簡(jiǎn)化應(yīng)用之間的 RPC 調(diào)用,為應(yīng)用提供方便透明、穩(wěn)定高效的點(diǎn)對(duì)點(diǎn)遠(yuǎn)程服務(wù)調(diào)用方案。
數(shù)字動(dòng)能發(fā)布的xRPC框架與SofaRPC相比,擁有更高效的執(zhí)行效能和更輕量更靈活的調(diào)用方法等特點(diǎn)。他根據(jù)量化金融傳輸要求進(jìn)行特定場(chǎng)景設(shè)計(jì),在動(dòng)態(tài)路由、序列化方法和通訊層協(xié)議中進(jìn)行了大量場(chǎng)景針對(duì)設(shè)計(jì),是一個(gè)穩(wěn)定高速的C++ RPC框架。憑借數(shù)字動(dòng)能在量化金融領(lǐng)域的技術(shù)積累,xRPC更適合應(yīng)用于量化金融、投研投顧領(lǐng)域的高算力和海量數(shù)據(jù)傳輸場(chǎng)景,可實(shí)現(xiàn)在不同的業(yè)務(wù),如:回測(cè)執(zhí)行、實(shí)時(shí)行情訂閱、金融數(shù)據(jù)存取、復(fù)雜金融指標(biāo)計(jì)算,因子生產(chǎn)等服務(wù)間快速信息交換的需求。隨著數(shù)字動(dòng)能自主研發(fā)的C++RPC分布式通訊框架落地,意味其“投研投顧一體化”產(chǎn)品及方案將從圍繞產(chǎn)品的方案實(shí)施,向投研投顧集中業(yè)務(wù)中臺(tái)的戰(zhàn)略轉(zhuǎn)變。擁有一個(gè)分布式通訊框架技術(shù),是衡量一個(gè)金融科技公司是否掌握業(yè)務(wù)(技術(shù))中臺(tái)核心技術(shù)的關(guān)鍵。數(shù)字動(dòng)能已擁有可讓多業(yè)務(wù)間可高速穩(wěn)定進(jìn)行通訊的業(yè)務(wù)中臺(tái)核心技術(shù)。
關(guān)鍵詞: