現代交易所是一個複雜的系統,對延遲吞吐量穩健性有嚴格要求。在開始之前,我們先問面試官幾個問題以釐清需求。

應徵者:我們要交易哪些證券?股票、選擇權還是期貨?

面試官:為了簡化,只交易股票。

應徵者:要支援哪些訂單操作:下新訂單、取消訂單,還是替換訂單?我們需要支援限價單(limit order)、市價單(market order)或條件單嗎?

面試官:我們需要支援以下功能:下新訂單與取消訂單。訂單類型上,只需要考慮限價單。

應徵者:系統需要支援盤後交易嗎?

面試官:不需要,我們只支援正常交易時段。

應徵者:能否描述交易所的基本功能?以及交易所的規模,例如多少使用者、多少標的、多少訂單?

面試官:客戶可以下新的限價單或取消,並即時收到撮合的成交。客戶可以檢視即時訂單簿(order book,買單與賣單列表)。交易所至少需要支援數萬名使用者同時交易,且至少需要支援 100 個標的(symbol)。對於交易量,我們應該支援每天數十億筆訂單。此外,交易所是受監管的設施,所以我們需要確保它執行風險檢查。

應徵者:能否進一步說明風險檢查?

面試官:簡單的風險檢查即可。例如,使用者一天最多只能交易 100 萬股 Apple 股票。

應徵者:我注意到你沒有提到使用者錢包管理。這也是我們需要考慮的嗎?

面試官:好眼力!我們需要確保使用者下單時有足夠的資金。如果訂單在訂單簿中等待成交,該訂單所需的資金需要被凍結(withhold)以防止超支。

Non-functional requirements#

在與面試官確認功能性需求之後,我們應該決定非功能性需求。

事實上,「至少 100 個標的」與「數萬名使用者」這類需求告訴我們,面試官希望我們設計一個中小型規模的交易所。在此之上,我們應確保設計可以擴展以支援更多標的與使用者。許多面試官會把可擴展性作為後續問題的重點。

以下是非功能性需求列表:

  • 可用性:至少 99.99%。可用性對交易所至關重要,即使是數秒的當機都可能損害聲譽。
  • 容錯能力:需要容錯能力與快速恢復機制以限制生產事件的影響。
  • 延遲:往返延遲(round-trip latency)應在毫秒等級,特別關注 99 百分位數延遲(99th percentile latency)。往返延遲是從市價單進入交易所的那一刻開始,到該市價單以已成交的執行回傳為止所量測的時間。持續偏高的 99 百分位數延遲會給少數使用者帶來糟糕的體驗。
  • 安全性:交易所應該有帳戶管理系統。為了法規合規,交易所在開立新帳戶之前會執行 KYC(Know Your Client,認識你的客戶)檢查,以驗證使用者身份。對於公開資源,例如包含市場資料的網頁,我們應該防範分散式阻斷服務(DDoS)攻擊 [6]。

可用性僅 99.99% 意味著交易所每天最多只能有約 8.64 秒的當機時間,對監控與切換機制的要求極高。

Back-of-the-envelope estimation#

讓我們做一些簡單的粗略估算,理解系統的規模:

  • 100 個標的
  • 每天 10 億筆訂單
  • NYSE 股票交易所開盤時間是週一至週五上午 9:30 到下午 4:00 東部時間,總計 6.5 小時
  • QPS:10 億 / 6.5 / 3600 = ~43,000
  • 尖峰 QPS:5 * QPS = 215,000。早上開盤與下午收盤前的交易量明顯較高

尖峰 QPS 發生在開盤與收盤前後,系統必須能穩定承受這些突發流量。