Keyboard shortcuts

Press โ† or โ†’ to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

0x08-f Ring Buffer Pipeline Implementation

๐Ÿ‡บ๐Ÿ‡ธ English ย ย ย |ย ย ย  ๐Ÿ‡จ๐Ÿ‡ณ ไธญๆ–‡

๐Ÿ‡บ๐Ÿ‡ธ English

๐Ÿ“ฆ Code Changes: View Diff

Goal: Connect services using Ring Buffers to implement a true Pipeline architecture.


Part 1: Single-Thread Pipeline

1.1 Background

Legacy Execution (Synchronous Serial):

for order in orders:
    1. ubscore.process_order(order)     # WAL + Lock
    2. engine.process_order(order)       # Match
    3. ubscore.settle_trade(trade)       # Settle
    4. ledger.write(event)               # Persist

Problem: No pipeline parallelism, latency accumulates.

1.2 Single-Thread Pipeline Architecture

Decouple services using Ring Buffers, but polling within a single thread loop:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Single-Thread Pipeline (Round-Robin)                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚   Stage 1: Ingestion          โ†’  order_queue                            โ”‚
โ”‚   Stage 2: UBSCore Pre-Trade  โ†’  valid_order_queue                      โ”‚
โ”‚   Stage 3: Matching Engine    โ†’  trade_queue                            โ”‚
โ”‚   Stage 4: Settlement         โ†’  (Ledger)                               โ”‚
โ”‚                                                                          โ”‚
โ”‚   All Stages executed in a round-robin loop                              โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Core Data Structures:

#![allow(unused)]
fn main() {
pub struct PipelineQueues {
    pub order_queue: Arc<ArrayQueue<SequencedOrder>>,
    pub valid_order_queue: Arc<ArrayQueue<ValidOrder>>,
    pub trade_queue: Arc<ArrayQueue<TradeEvent>>,
}
}

Execution Loop:

#![allow(unused)]
fn main() {
loop {
    // UBSCore: order_queue โ†’ valid_order_queue
    if let Some(order) = queues.order_queue.pop() {
        // ...
    }
    
    // ME: valid_order_queue โ†’ trade_queue
    if let Some(valid_order) = queues.valid_order_queue.pop() {
        // ...
    }
    
    // Settlement: trade_queue โ†’ persist
    if let Some(trade) = queues.trade_queue.pop() {
        // ...
    }
}
}

Part 2: Multi-Thread Pipeline

2.1 Architecture

Full Multi-Threaded Pipeline based on 0x08-a design:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          Multi-Thread Pipeline (Full)                                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                                        โ”‚
โ”‚  Thread 1: Ingestion       Thread 2: UBSCore              Thread 3: ME                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚
โ”‚  โ”‚ Read orders     โ”‚       โ”‚  PRE-TRADE:          โ”‚       โ”‚ Match Order     โ”‚         โ”‚
โ”‚  โ”‚ Assign SeqNum   โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚  - Write WAL         โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ in OrderBook    โ”‚         โ”‚
โ”‚  โ”‚                 โ”‚   โ‘    โ”‚  - process_order()   โ”‚  โ‘ข    โ”‚                 โ”‚         โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ”‚  - lock_balance()    โ”‚       โ”‚ Generate        โ”‚         โ”‚
โ”‚                            โ”‚                      โ”‚       โ”‚ TradeEvents     โ”‚         โ”‚
โ”‚                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚
โ”‚                                       โ–ฒ                            โ”‚                  โ”‚
โ”‚                                       โ”‚                            โ”‚                  โ”‚
โ”‚                                       โ”‚ โ‘ค balance_update_queue     โ”‚ โ‘ฃ trade_queue   โ”‚
โ”‚                                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค                  โ”‚
โ”‚                                                                    โ”‚                  โ”‚
โ”‚                            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ–ผ                  โ”‚
โ”‚                            โ”‚  POST-TRADE:         โ”‚       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚
โ”‚                            โ”‚  - settle_trade()    โ”‚       โ”‚ Thread 4:       โ”‚         โ”‚
โ”‚                            โ”‚  - spend_frozen()    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ Settlement      โ”‚         โ”‚
โ”‚                            โ”‚  - deposit()         โ”‚  โ‘ฅ    โ”‚                 โ”‚         โ”‚
โ”‚                            โ”‚  - Generate Balance  โ”‚       โ”‚ Persist:        โ”‚         โ”‚
โ”‚                            โ”‚    Update Events     โ”‚       โ”‚ - Trade Events  โ”‚         โ”‚
โ”‚                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ”‚ - Balance Eventsโ”‚         โ”‚
โ”‚                                                           โ”‚ - Ledger        โ”‚         โ”‚
โ”‚                                                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚
โ”‚                                                                                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.2 Key Design Points

  1. ME Fan-out: ME sends TradeEvent in parallel to:
    • trade_queue โ†’ Settlement (Persist)
    • balance_update_queue โ†’ UBSCore (Balance Settle)
  2. UBSCore as Single Balance Entry: Handles Pre-Trade Lock, Post-Trade Settle, and Refunds.
  3. Settlement Consolidation: Consumes both Trade Events and Balance Events.

2.3 Data Types

BalanceUpdateRequest (ME โ†’ UBSCore): Contains Trade Event and optional Price Improvement data.

BalanceEvent (UBSCore โ†’ Settlement): The unified channel for ALL balance changes (Lock, Settle, Credit, Refund).

#![allow(unused)]
fn main() {
pub enum BalanceEventType {
    Lock,           // Pre-Trade
    SpendFrozen,    // Post-Trade
    Credit,         // Post-Trade
    RefundFrozen,   // Price Improvement
    // ...
}
}

2.4 Implementation Status

ComponentStatus
All Queuesโœ… Implemented
UBSCore BalanceEvent Genโœ… Implemented
Settlement Persistenceโœ… Implemented

Verification & Performance (2025-12-17)

Correctness

E2E tests pass for both pipeline modes.

Performance Comparison

1.3M Orders (with 300k Cancel):

ModeTimeThroughputTrades
UBSCore (Baseline)23.5s55k ops/s538,487
Single-Thread Pipeline22.1s59k ops/s538,487
Multi-Thread Pipeline29.1s45k ops/s489,804
  • Issue: Multi-Thread mode is currently slower (-30%) on large datasets and skips cancel orders.

100k Orders (Place only):

ModeTimeThroughputvs Baseline
UBSCore755ms132k ops/s-
Single-Thread519ms193k ops/s+46%
Multi-Thread391ms256k ops/s+93%
  • Observation: Multi-threading shines on smaller, simpler datasets (+93%).

Analysis

Multi-threaded pipeline overhead (context switching, queue contention, event generation) outweighs benefits when per-order processing time is very low (due to optimizations). Also, missing Cancel logic reduces correctness.


Key Design Decisions

  • Backpressure: Spin Wait (prioritize low latency).
  • Shutdown: Graceful drain using Atomic Signals.
  • Error Handling: Logging and metric counting; critical paths must succeed.



๐Ÿ‡จ๐Ÿ‡ณ ไธญๆ–‡

๐Ÿ“ฆ ไปฃ็ ๅ˜ๆ›ด: ๆŸฅ็œ‹ Diff

็›ฎๆ ‡๏ผšไฝฟ็”จ Ring Buffer ไธฒๆŽฅไธๅŒๆœๅŠก๏ผŒๅฎž็Žฐ็œŸๆญฃ็š„ Pipeline ๆžถๆž„


Part 1: ๅ•็บฟ็จ‹ Pipeline

1.1 ่ƒŒๆ™ฏ

ๅŽŸๅง‹ๆ‰ง่กŒๆจกๅผ (ๅŒๆญฅไธฒ่กŒ):

for order in orders:
    1. ubscore.process_order(order)     # WAL + Lock
    2. engine.process_order(order)       # Match
    3. ubscore.settle_trade(trade)       # Settle
    4. ledger.write(event)               # Persist

้—ฎ้ข˜๏ผšๆฒกๆœ‰ Pipeline ๅนถ่กŒ๏ผŒๅปถ่ฟŸ็ดฏๅŠ 

1.2 ๅ•็บฟ็จ‹ Pipeline ๆžถๆž„

ไฝฟ็”จ Ring Buffer ่งฃ่€ฆๅ„ๆœๅŠก๏ผŒไฝ†ไปๅœจๅ•็บฟ็จ‹ไธญ่ฝฎ่ฏขๆ‰ง่กŒ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Single-Thread Pipeline (Round-Robin)                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚   Stage 1: Ingestion          โ†’  order_queue                            โ”‚
โ”‚   Stage 2: UBSCore Pre-Trade  โ†’  valid_order_queue                      โ”‚
โ”‚   Stage 3: Matching Engine    โ†’  trade_queue                            โ”‚
โ”‚   Stage 4: Settlement         โ†’  (Ledger)                               โ”‚
โ”‚                                                                          โ”‚
โ”‚   ๆ‰€ๆœ‰ Stage ๅœจๅŒไธ€ไธช while ๅพช็Žฏไธญ่ฝฎ่ฏขๆ‰ง่กŒ                               โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆ ธๅฟƒๆ•ฐๆฎ็ป“ๆž„:

#![allow(unused)]
fn main() {
pub struct PipelineQueues {
    pub order_queue: Arc<ArrayQueue<SequencedOrder>>,
    pub valid_order_queue: Arc<ArrayQueue<ValidOrder>>,
    pub trade_queue: Arc<ArrayQueue<TradeEvent>>,
}
}

ๆ‰ง่กŒๆต็จ‹:

#![allow(unused)]
fn main() {
loop {
    // UBSCore: order_queue โ†’ valid_order_queue
    if let Some(order) = queues.order_queue.pop() {
        // ...
    }
    
    // ME: valid_order_queue โ†’ trade_queue
    if let Some(valid_order) = queues.valid_order_queue.pop() {
        // ...
    }
    
    // Settlement: trade_queue โ†’ persist
    if let Some(trade) = queues.trade_queue.pop() {
        // ...
    }
}
}

Part 2: ๅคš็บฟ็จ‹ Pipeline

2.1 ๆžถๆž„

ๆ นๆฎ 0x08-a ๅŽŸๅง‹่ฎพ่ฎก๏ผŒๅฎŒๆ•ด็š„ๅคš็บฟ็จ‹ Pipeline ๆ•ฐๆฎๆตๅฆ‚ไธ‹๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          Multi-Thread Pipeline (ๅฎŒๆ•ด็‰ˆ)                                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                                        โ”‚
โ”‚  Thread 1: Ingestion       Thread 2: UBSCore              Thread 3: ME                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚
โ”‚  โ”‚ Read orders     โ”‚       โ”‚  PRE-TRADE:          โ”‚       โ”‚ Match Order     โ”‚         โ”‚
โ”‚  โ”‚ Assign SeqNum   โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚  - Write WAL         โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ in OrderBook    โ”‚         โ”‚
โ”‚  โ”‚                 โ”‚   โ‘    โ”‚  - process_order()   โ”‚  โ‘ข    โ”‚                 โ”‚         โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ”‚  - lock_balance()    โ”‚       โ”‚ Generate        โ”‚         โ”‚
โ”‚                            โ”‚                      โ”‚       โ”‚ TradeEvents     โ”‚         โ”‚
โ”‚                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚
โ”‚                                       โ–ฒ                            โ”‚                  โ”‚
โ”‚                                       โ”‚                            โ”‚                  โ”‚
โ”‚                                       โ”‚ โ‘ค balance_update_queue     โ”‚ โ‘ฃ trade_queue   โ”‚
โ”‚                                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค                  โ”‚
โ”‚                                                                    โ”‚                  โ”‚
โ”‚                            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ–ผ                  โ”‚
โ”‚                            โ”‚  POST-TRADE:         โ”‚       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚
โ”‚                            โ”‚  - settle_trade()    โ”‚       โ”‚ Thread 4:       โ”‚         โ”‚
โ”‚                            โ”‚  - spend_frozen()    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ Settlement      โ”‚         โ”‚
โ”‚                            โ”‚  - deposit()         โ”‚  โ‘ฅ    โ”‚                 โ”‚         โ”‚
โ”‚                            โ”‚  - Generate Balance  โ”‚       โ”‚ Persist:        โ”‚         โ”‚
โ”‚                            โ”‚    Update Events     โ”‚       โ”‚ - Trade Events  โ”‚         โ”‚
โ”‚                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ”‚ - Balance Eventsโ”‚         โ”‚
โ”‚                                                           โ”‚ - Ledger        โ”‚         โ”‚
โ”‚                                                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚
โ”‚                                                                                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.2 ๅ…ณ้”ฎ่ฎพ่ฎก็‚น

  1. ME Fan-out: ME ๅฐ† TradeEvent ๅนถ่กŒๅ‘้€ๅˆฐ๏ผš
    • trade_queue โ†’ Settlement (ๆŒไน…ๅŒ–ไบคๆ˜“่ฎฐๅฝ•)
    • balance_update_queue โ†’ UBSCore (ไฝ™้ข็ป“็ฎ—)
  2. UBSCore ๆ˜ฏไฝ™้ขๆ“ไฝœ็š„ๅ”ฏไธ€ๅ…ฅๅฃ: ๅค„็† Pre-Trade ้”ๅฎšใ€Post-Trade ็ป“็ฎ—ๅ’Œ้€€ๆฌพใ€‚
  3. Settlement ่šๅˆ: ๅŒๆ—ถๆถˆ่ดนไบคๆ˜“ไบ‹ไปถๅ’Œไฝ™้ขไบ‹ไปถใ€‚

2.3 ๆ•ฐๆฎ็ฑปๅž‹

BalanceUpdateRequest (ME โ†’ UBSCore): ๅŒ…ๅซๆˆไบคไบ‹ไปถๅ’Œๅฏ่ƒฝ็š„ไปทๆ ผๆ”นๅ–„(Price Improvement)ๆ•ฐๆฎใ€‚

BalanceEvent (UBSCore โ†’ Settlement): ๆ‰€ๆœ‰ไฝ™้ขๅ˜ๆ›ด็š„็ปŸไธ€้€š้“ (Lock, Settle, Credit, Refund)ใ€‚

#![allow(unused)]
fn main() {
pub enum BalanceEventType {
    Lock,           // Pre-Trade
    SpendFrozen,    // Post-Trade
    Credit,         // Post-Trade
    RefundFrozen,   // Price Improvement
    // ...
}
}

2.4 ๅฎž็Žฐ็Šถๆ€

็ป„ไปถ็Šถๆ€
ๆ‰€ๆœ‰้˜Ÿๅˆ—โœ… ๅทฒๅฎž็Žฐ
UBSCore BalanceEvent ็”Ÿๆˆโœ… ๅทฒๅฎž็Žฐ
Settlement ๆŒไน…ๅŒ–โœ… ๅทฒๅฎž็Žฐ

้ชŒ่ฏไธŽๆ€ง่ƒฝ (2025-12-17)

ๆญฃ็กฎๆ€ง

E2E ๆต‹่ฏ•ๅœจไธค็งๆจกๅผไธ‹ๅ‡้€š่ฟ‡ใ€‚

ๆ€ง่ƒฝๅฏนๆฏ”

1.3M ่ฎขๅ• (ๅซ 30 ไธ‡ๆ’คๅ•):

ๆจกๅผๆ‰ง่กŒๆ—ถ้—ดๅžๅ้‡ๆˆไบคๆ•ฐ
UBSCore (Baseline)23.5s55k ops/s538,487
ๅ•็บฟ็จ‹ Pipeline22.1s59k ops/s538,487
ๅคš็บฟ็จ‹ Pipeline29.1s45k ops/s489,804
  • ้—ฎ้ข˜: ๅคš็บฟ็จ‹ๆจกๅผๅœจๅคงๆ•ฐๆฎ้›†ไธŠๅ่€Œๆ›ดๆ…ข (-30%)๏ผŒไธ”็›ฎๅ‰่ทณ่ฟ‡ไบ†ๆ’คๅ•ๅค„็†ใ€‚

100k ่ฎขๅ• (ไป… Place):

ๆจกๅผๆ—ถ้—ดๅžๅ้‡ๆๅ‡
UBSCore755ms132k ops/s-
ๅ•็บฟ็จ‹519ms193k ops/s+46%
ๅคš็บฟ็จ‹391ms256k ops/s+93%
  • ่ง‚ๅฏŸ: ๅคš็บฟ็จ‹ๅœจ็ฎ€ๅ•็š„ๅฐๆ•ฐๆฎ้›†ไธŠ่กจ็Žฐๅ‡บ่‰ฒ (+93%)ใ€‚

ๅˆ†ๆž

ๅœจๅ•็ฌ”ๅค„็†ๆžๅฟซ็š„ๆƒ…ๅ†ตไธ‹๏ผŒๅคš็บฟ็จ‹ๅธฆๆฅ็š„ๅผ€้”€๏ผˆไธŠไธ‹ๆ–‡ๅˆ‡ๆขใ€้˜Ÿๅˆ—็ซžไบ‰ใ€ไบ‹ไปถ็”Ÿๆˆ๏ผ‰่ถ…่ฟ‡ไบ†ๅนถ่กŒ็š„ๆ”ถ็›Šใ€‚ๆญคๅค–๏ผŒ็ผบๅคฑๆ’คๅ•้€ป่พ‘้™ไฝŽไบ†ๆญฃ็กฎๆ€งใ€‚


ๅ…ณ้”ฎ่ฎพ่ฎกๅ†ณ็ญ–

  • ่ƒŒๅŽ‹: ่‡ชๆ—‹็ญ‰ๅพ… (Spin Wait)๏ผŒไผ˜ๅ…ˆไฝŽๅปถ่ฟŸใ€‚
  • ๅ…ณ้—ญ: ไฝฟ็”จๅŽŸๅญไฟกๅทไผ˜้›…้€€ๅ‡บใ€‚
  • ้”™่ฏฏๅค„็†: ๆ—ฅๅฟ—่ฎฐๅฝ•๏ผŒๆ ธๅฟƒ่ทฏๅพ„ๅฟ…้กปๆˆๅŠŸใ€‚