隨著數字貨幣價格的一路攀升,BTC三個月內漲幅近90%,其他主流數字貨幣均有較大漲幅。伴隨著整個市場的回暖,全球數字貨幣交易所也呈現高速增長,投資者也因此擁有了更多選擇。無論是選擇久經沙場的老牌交易所還是野蠻生長的新晉交易所,保障每一筆交易的安全、高效和穩定都離不開強大的技術支撐,那麼在構建數字貨幣交易所又會經歷那些技術難點呢? 一 盤點數字貨幣交易所的技術難點 1. 安全性 毫無疑問,用戶資產安全是第一位的,這是數字貨幣交易所的生命線。每天有無數的黑客在盯著交易所,經常有交易所的被盜案例爆出,包括排名前幾的交易所,近期幣安也發生了7000枚BTC被盜事件,這是幣安第三次大規模被盜,其他交易所的案例就更不勝枚舉。當然除了資產安全,用戶信息安全也是非常重要的。 2. 高可用 可用性是指一個系統處在可工作狀態的時間的比例。數字貨幣都是7*24全天候交易,一旦系統出現故障,無論是一個進程異常退出了、一台服務器宕機了或者是某根網線(光纜)斷了,都可能導致無法交易,直接導致客戶損失。尤其是高槓桿的合約交易,可能導致直接爆倉。 對於系統的維護和升級也一樣,諸多大型交易所也經常頻繁停機維護,如遇到重大行情但交易所停機維護,客戶肯定難以接受的。但市面上現有的交易所基本無法做到不停機。恰恰相反,不是經常停機維護就是系統故障又或者是overload(系統超載),包括全球幾大知名交易所。這不但對架構設計的要求非常高,支持容災容錯;又要保證流程和執行上不能出錯,敲錯一個命令可能就毀了;還要經過完備的實戰災備演練,才可能演變成安全穩定且高可用的系統。工作時間可以有人盯著,及時發現問題和解決問題,萬一節假日或者半夜發生問題呢?多久能發現和解決問題(術語叫RTO)就成為一個難題。 3. 高並發/高吞吐量 最核心的指標是每秒的下單量(TPS)。合約交易因為有槓桿的放大效應,每個客戶的交易頻率會比幣幣交易頻繁的多。通過API做量化交易的訂單又會遠大於散客,尤其是做高頻交易的。一旦並發下單數超過系統負載能力,就會導致overload無法下單,這會造成錯失交易機會或者虧損,甚至被無故爆倉。所以高並發是每個合約交易所都在比拼追趕的能力,比如BitMex就經常會overload。 4. 低延遲 延遲主要指交易中發起下單到收到訂單狀態推送,如果是市價單立即成交的話再看收到成交推送這每一步所花的時間。日內交易者尤其是高頻交易者會非常關心延遲問題,慢1毫秒甚至1微秒就可能喪失交易機會。 5. 高可靠 主要指數據的可靠性,在程序異常、服務器宕機、硬件故障、機房斷電、甚至地震等各種極端情況下都能保證用戶數據不丟失、不錯亂。一般為了在異常和災難情況下保持可靠性,程序和數據都會存儲多份。如何讓多份數據保持一致性,尤其是強一致性即任何時刻多份數據都是一致的,這是一個很有難度的問題。 二 Bybit如何解決這些難點 相比其他交易所有什麼優勢 1. 安全性 Bybit和幣圈知名的安全團隊「慢霧」建立了合作,在以下幾方面都做了詳細的審計和滲透測試,多維度的進行了安全保障. 錢包方面,Bybit採用了分層確定性冷錢包和離線簽名技術,存儲私鑰的機器永不連網,杜絕黑客的攻擊。另外內部流程上也嚴格管控,需要多個人的多重簽名才可以提幣轉賬,每一筆提幣操作通過自動審核加人工審核雙重確認。簽名服務器有獨立的門禁和攝像頭24小時監控,必須有權限才能進入。 Bybit上線至今從未發生過任何一筆資金被盜事件。 Bybit也做到了準實時的自動對賬,每分鐘對數據做快照來對賬,如遇特殊情況,我們的技術團隊也能在第一時間定位問題。 漏洞防護方面(包括服務器漏洞、網絡漏洞、軟件漏洞、賬號漏洞、業務邏輯漏洞等),Bybit技術團隊聯合「慢霧」團隊在上線前和上線後都做了大量審計和滲透測試工作,確保消除安全漏洞,保障用戶的賬戶資產和信息安全。此外,Bybit也有報告漏洞獎勵計劃,把漏洞扼殺在搖籃之中。截止目前,已有多位安全圈內的白帽子給Bybit反饋過漏洞,基本都屬於低危漏洞,沒有對用戶賬戶及交易系統造成損傷,也沒有任何黑客利用這些漏洞謀取利益,至於中高危的漏洞在Bybit還從未發生過,當然我們也一直防患於未然。 其他方面,如內部研發和運維流程、數據訪問權限、內部系統權限、辦公網絡和辦公設備安全、郵箱安全等等,Bybit內部也做了嚴格的控制,這裡就不一一詳述了。 2. 高可用 Bybit目前已經做到了99.99%的可用性,即一年的不可交易時間小於52分鐘。要做到四個9的可用性,就必須做到以下幾點。 1)在線維護&熱更新 大多數交易所在做系統維護和升級的時候都需要停機,導致無法交易,用戶體驗糟糕。 Bybit做到了所有的維護和升級都必須在線完成,做到絕不主動性停機。這對技術架構、程序開發、運維支持的要求都非常高,所有數據遷移、服務重啟、運維變更等都必須做到平滑,讓用戶無任何感知。雖然需要付出大量的成本去做,但為了不影響用戶的交易體驗,這些代價是非常值得的,我們必須把用戶的體驗和口碑放在第一位。事實上,我們每週都會進行大大小小的3-5次系統迭代升級或變更,用戶幾乎感知不到,除非是對用戶體驗做了升級或者發布了新功能。 2)災備架構、Auto Failover(自動災備切換機制)和災備演練 對於大規模的服務來說,經常會遇到程序異常退出或重啟、服務器硬件故障、網絡故障等各種錯誤和災難。要在發生這些災難的時候做到服務連續可用,所有的服務必須部署多份,或者做成集群。當發生異常和災難時,必須能夠自動實現服務切換或者災難恢復,這樣才能保證比較高的可用性。在Bybit內部有很多個服務集群,通過服務發現和leader選舉來實現自動災備切換。並且有一套高性能高可靠的消息總線,很好的實現了消息確認和回溯機制,當服務切換時,程序能夠根據消息序號完美地做到無縫切換。還有,災備演練至關重要,不做災備演練就像讓只是通過了理論考試的學員直接開車上路一樣危險。 - Bybit消息架构 - 3)灰度发布 对于一些核心模块的上线和更新,一般Bybit会采用灰度发布的方式。即先发布给少量用户体验(用户也可能无感知),一般是先给乐于向Bybit反馈问题和提建议的活跃用户体验。当体验一段时间没问题的话再逐步扩大用户范围,直到全量发布给所有用户。这样可以尽量减少新功能或新系统可能存在问题或者不太稳定的问题,可以大大降低影响范围。万一体验新功能或新系统的用户遇到问题导致某些损失,Bybit平台也会全额赔付给用户。 4)立体化监控 包括硬件、网络、服务(健康状况、性能指标、访问次数和频率、错误异常等)、客户端(错误异常、页面性能、网络状况、软硬件环境等)、业务指标(注册量、访问量、下单量等)。Bybit会监控一切有价值的指标,通过事前预警、事后快速响应,针对不同级别的问题通过邮件、短信、电话等不同告警方式给到相对应的负责人。 3. 高并发/高吞吐量 Bybit的撮合服务采用C++语言,全内存设计,采用epoll网络接入,能实现单线程每秒10万+的撮合(事实上我们去掉调试日志后压测已经到了30万+的TPS),并且可以根据未来需要调优到每秒百万级TPS。除了高性能撮合服务,Bybit近期上线了全新的内存化订单系统,可以做到单机每秒10000TPS,如果部署n台机器,总TPS=10000*n。要注意永续合约的下单逻辑要远比币币交易来的复杂,因为涉及到合并仓位的保证金计算、只减仓(reduce only)等复杂的下单策略。并且下单服务做到了可以平行扩展,通过sharding的方式提供服务,每个用户都有独立的协程处理下单,不会因为某些高频交易用户订单量特别大从而影响了其他用户下单。 4. 低延迟 撮合单线程单币种每秒10万TPS,即意味着单笔撮合20微秒完成。因为采用了几乎是全球领先的LMax交易所发明的Disruptor内存无锁队列,以及内存零拷贝等技术。撮合是交易所最核心的部分,必须追求极致性能。除了撮合以外,我们的行情系统、下单系统、推送系统也已经陆续完成了内存化的改造和升级,还有些持仓系统等也正在内存化改造当中。我们的目标是从下一个市价单开始,到撮合再到订单状态、成交推送和仓位更新推送,整个交易链路的内部处理时间控制在5毫秒以内。当然,从用户端视角来看,整个交易链路的时间还要再加上网络传输时间,这也取决于用户的网络情况。 - Disruptor/Ring Buffer原理 - 5. 高可靠 高可靠主要是指數據的高可靠性,必須在任何情況下保證用戶數據的正確性,以及不能丟失。所有的數據必須冗餘多份,並且在發生這些災難的時候能夠絲毫不差地恢復出來,即RPO要做到0,不允許任何數據丟失。在大部分情況下,我們能做到秒級的RTO,即在幾秒鐘內自動完成數據和服務的恢復。 Bybit核心的消息總線實現了數據持久化和集群化,只要進來的消息就不會丟失。消息的可回溯性能夠支持系統從任一個時刻恢復數據。比如t時刻後的所有持久化訂單數據都丟了,我們能快速找到t時刻對應的消息序號n,並從n+1開始回播所有訂單消息,實現訂單數據的恢復,並且我們的系統設計上能保證回播產生的數據和恢復前完全一致。 專業資深的架構師都知道,單單做到上面任何一點其實都沒有那麼難,但要同時做到高可用、低延遲、高可靠且高並發就很有難度。因為在這個問題上,理論計算機科學中有一個經典的CAP定理,對於一個分佈式計算系統來說,不可能同時滿足一致性、可用性、分區容錯性這三點。那麼Bybit是怎麼解決這個難題,實現最優的三角平衡呢? 第一,要做到高可用,最好是做成無狀態服務,或者做成集群服務,但無狀態和集群服務就意味著要頻繁通過網絡來同步狀態,這跟低延遲是矛盾的。要做到單次撮合20微秒甚至10微秒內完成,很難通過網絡去同步狀態。 第二,要做到低延遲,都必須是內存化的服務,但內存就意味著進程退出或機器掉電就會丟失,他是不可靠的。要同時做到低延遲和高可靠,即要在掉電的時候保證數據不丟,也是不容易的事情。 第三,要做到高可靠,數據就必須冗餘多份,一旦是多份就會有一致性問題,這時還做到高可用,就必須做到數據強一致性,才能保證一份數據出問題時,冗餘數據是實時可用的。這樣又回到了第一個問題,要做到強一致性,一般的做法是做成集群,但這樣又需要通過網絡來同步數據,犧牲了低延遲。 具體我們是怎麼做的呢?拿最核心的撮合引擎來說,撮合引擎的特點是有狀態(內存裡有orderbook等大量數據)且必須單點(單線程)按順序一個一個處理撮合,嚴格來說不能並發不能亂序,當然也不能平行擴展。要做到高可用,那肯定要有多台服務器,當一台宕機了以後另一台能立即提供服務。 難點是如何保證兩台撮合引擎的數據是強一致的。一般的做法是做成集群,通過Paxos、Raft或者Quorum等分佈式一致性算法來保證強一致,但這樣就依賴於大量的網絡通信來同步狀態,顯然每次處理的延遲會遠高於單機處理時的20微秒。並且因為撮合不能平行擴展,所以這裡一定會成為整個系統的吞吐量瓶頸所在。所以如果撮合做成集群的話,雖然滿足了高可用和強一致性,但犧牲了分區容錯性,且犧牲了低延遲和高並發。我們在設計上做了創新性的嘗試: a)通過前端的消息隊列集群來完成請求定序,且已經生成了全局唯一的訂單號,兩台撮合引擎都從這裡訂閱消息作為輸入,所以輸入是完全一致的; b)消息隊列集群C的消息都是持久化的; c)撮合引擎內部全部採用確定性算法,如生成成交ID時不能帶有時間信息或隨機數等,保證2台撮合引擎輸出到各自的消息隊列集群的結果是完全一致的; d)撮合結果的每個消息有唯一且連續的序號,後端應用(如行情服務器)可以任意切換AB兩個數據源。 - Bybit撮合容災架構 - 以上設計的創新及合理之處在於: 1)撮合的處理不依賴於網絡,是具備分區容錯的,且延遲可以做到極低; 2)因為每次撮合處理的延遲變低,所以吞吐量就變高,而這裡又是不可擴展的瓶頸,其結果是整個系統的並發能力變高; 3)實現了高可用,當任意一台撮合服務器宕機以後,後端服務可以切換到另一個消息隊列集群,從下一個消息開始處理; 4)消息隊列集群C的消息都是持久化的,可以通過回放從任一時刻開始的消息,把之後的數據完全恢復出來,實現高可靠性。 5)依靠前置的唯一訂單號和消息定序以及確定性算法,讓兩台互不通信的撮合引擎能夠輸出一樣的結果,從而實現了一致性,在這個場景下可以認為做到了強一致性。 對撮合來說,這樣的方案幾乎同時實現了C、A、P,還能做到低延遲高吞吐,是否打破了CAP定理呢?其實沒有,撮合把這個問題拋給了前置的消息隊列集群,這個集群目前不可能同時滿足CAP的,所以整個系統並不能同時做到CAP。但這樣換來的是撮合的高可用、高吞吐、低延遲、高可靠、強一致和分區容錯性。作為整個交易平台最核心且不可擴展的模塊,這樣的設計在現階段的市場中幾近完美的,因為它幾乎滿足了我們所有需求。 三 未來有哪些挑戰 以及如何提陞技術 Bybit作為上線不到一年的交易所,在以上幾方面的技術實力已經完全不亞於全球幾大知名交易所,甚至在有些地方已經遠遠領先。但要完全解決好以上幾個技術挑戰,仍然有長的路要走。很多交易所用了幾年了,也沒有解決好。 Bybit也還需要深耕細作,比如延遲方面繼續優化,達到整個交易鏈路5毫秒的目標;以及容災能力方面,提升異地災備能力;在瀏覽器體驗上性能還盡完美,在後期升級迭代中進一步優化。 Bybit深知技術保障對於交易所的重要性,始終堅持“用戶至上,技術為王”的運營理念,相信良好用戶體驗建立是基於穩定可靠的技術保障。我們肩負使命與重任,承載夢想,目標是做出在數字貨幣領域技術足夠領先甚至超前的交易所,以我們的技術核心競爭力贏得用戶的信任和選擇。 Bybit是一家全球性數字貨幣衍生品交易平台。現已推出100倍槓桿BTCUSD/ETHUSD及25倍槓桿EOSUSD/XRPUSD永續合約。了解更多请点击:www.bybit.com