Trade-offs & Alternatives

📖 6 min read 📄 Part 7 of 10

Stock Trading Platform - Tradeoffs and Alternatives

Architecture Tradeoffs

Monolithic vs Microservices

Chosen: Hybrid (Monolithic Matching Engine + Microservices)

Monolithic Matching Engine:

Advantages:
- Ultra-low latency (<1ms)
- No network overhead
- Simpler deployment
- Easier to optimize

Disadvantages:
- Single point of failure
- Harder to scale
- All-or-nothing deployment

Use: Core matching engine

Microservices:

Advantages:
- Independent scaling
- Technology diversity
- Isolated failures
- Team autonomy

Disadvantages:
- Network latency
- Distributed complexity
- Harder to debug

Use: Supporting services (account, risk, reporting)

Why Hybrid:

Critical Path (Monolithic):
- Order matching
- Trade execution
- Sub-millisecond latency required

Non-Critical Path (Microservices):
- Account management
- Reporting
- Analytics
- Notifications

Benefits: Performance where it matters, flexibility elsewhere

In-Memory vs Persistent Storage

Chosen: In-Memory with Async Persistence

Pure In-Memory:

Advantages:
- Microsecond latency
- High throughput
- Simple code

Disadvantages:
- Data loss on crash
- Limited capacity
- No durability

Why not: Regulatory requirements

Synchronous Persistence:

Advantages:
- Guaranteed durability
- ACID compliance
- No data loss

Disadvantages:
- 10ms+ latency
- Low throughput
- Bottleneck

Why not: Too slow for HFT

In-Memory + Async Persistence:

Implementation:
1. Process in memory (<1ms)
2. Acknowledge to user
3. Write to WAL (async)
4. Batch commit to database

Benefits:
- Fast user response
- Guaranteed durability
- High throughput

Recovery:
- Snapshot + WAL replay
- <1 second recovery time
- Zero data loss

Matching Algorithm Tradeoffs

FIFO vs Pro-Rata

Chosen: FIFO (Price-Time Priority)

FIFO (First-In-First-Out):

Advantages:
- Fair and transparent
- Rewards speed
- Industry standard
- Simple to implement

Disadvantages:
- Favors HFT firms
- No size consideration
- Can be gamed

Use: Most markets

Pro-Rata:

Advantages:
- Rewards size
- Discourages quote stuffing
- Better for large orders

Disadvantages:
- Complex calculation
- Less transparent
- Slower execution

Use: Some futures markets

Why not chosen: Industry standard is FIFO

Continuous vs Batch Matching

Chosen: Continuous Matching

Continuous:

Advantages:
- Real-time execution
- Better price discovery
- Lower latency

Disadvantages:
- Favors HFT
- More volatile
- Higher infrastructure cost

Use: Stock markets

Batch (Call Auction):

Advantages:
- Fair for all participants
- Reduces HFT advantage
- Lower infrastructure cost

Disadvantages:
- Delayed execution
- Less liquidity
- Poor price discovery

Use: Market open/close, IPOs

Why not chosen: Users expect real-time

Network Tradeoffs

Kernel Bypass vs Traditional Stack

Chosen: Kernel Bypass (DPDK)

Traditional Network Stack:

Advantages:
- Simple to use
- Well-tested
- Standard APIs

Disadvantages:
- 50-100 μs latency
- Context switches
- Interrupts

Why not: Too slow for HFT

Kernel Bypass (DPDK):

Advantages:
- 5-10 μs latency
- No context switches
- Poll mode (no interrupts)
- 10x faster

Disadvantages:
- Complex setup
- Dedicated CPU cores
- Custom code

Implementation:
- Dedicate 2 cores per NIC
- Poll for packets
- Zero-copy processing
- Direct memory access

Benefits: Worth complexity for 10x speedup

TCP vs UDP

Chosen: Both (TCP for reliability, UDP for speed)

TCP:

Advantages:
- Reliable delivery
- Ordered packets
- Flow control

Disadvantages:
- Higher latency
- Head-of-line blocking
- Overhead

Use: Order submission, account queries

UDP:

Advantages:
- Lower latency
- No connection overhead
- Multicast support

Disadvantages:
- No reliability
- Packet loss
- Out-of-order

Use: Market data distribution

Implementation:
- Sequence numbers for ordering
- Application-level retransmission
- Multicast for fan-out

Data Consistency Tradeoffs

Strong vs Eventual Consistency

Chosen: Strong for Trades, Eventual for Reporting

Strong Consistency:

Use Cases:
- Trade execution
- Account balances
- Position updates

Implementation:
- ACID transactions
- Synchronous replication
- Optimistic locking

Tradeoff: Lower availability, higher latency

Eventual Consistency:

Use Cases:
- Portfolio valuation
- Historical data
- Analytics

Implementation:
- Async replication
- Read replicas
- Cache with TTL

Tradeoff: Higher availability, stale reads possible

Optimistic vs Pessimistic Locking

Chosen: Optimistic Locking

Optimistic:

Implementation:
1. Read with version number
2. Process
3. Update with version check
4. Retry if conflict

Advantages:
- High concurrency
- No lock contention
- Better performance

Disadvantages:
- Retry logic needed
- Wasted work on conflict

Use: Account updates, position updates

Pessimistic:

Implementation:
1. Lock record
2. Process
3. Update
4. Release lock

Advantages:
- No conflicts
- Simpler logic
- Guaranteed success

Disadvantages:
- Lock contention
- Deadlock risk
- Poor scalability

Why not: Can't handle 1M orders/second

Deployment Tradeoffs

Co-Location vs Cloud

Chosen: Co-Location for Matching, Cloud for Services

Co-Location:

Advantages:
- Ultra-low latency (<50 μs)
- Predictable performance
- Direct exchange access
- Competitive advantage

Disadvantages:
- High cost ($30K/rack/month)
- Manual scaling
- Hardware management

Use: Matching engine, market data gateway

Cloud:

Advantages:
- Easy scaling
- No hardware management
- Pay-as-you-go
- Global reach

Disadvantages:
- Higher latency (10-50ms)
- Variable performance
- No exchange access

Use: Account management, reporting, analytics

Why not for matching: Latency too high

Programming Language Tradeoffs

C++ vs Java vs Rust

Chosen: C++ for Matching, Java for Services

C++:

Advantages:
- Zero-cost abstractions
- Manual memory management
- Predictable performance
- Low latency

Disadvantages:
- Complex
- Memory safety issues
- Slower development

Use: Matching engine, market data gateway

Java:

Advantages:
- Productive
- Rich ecosystem
- Garbage collection
- Easier to hire

Disadvantages:
- GC pauses (10-100ms)
- Higher memory usage
- Less predictable

Use: Account services, reporting

Why not for matching: GC pauses unacceptable

Rust:

Advantages:
- Memory safety
- Zero-cost abstractions
- No GC
- Modern language

Disadvantages:
- Steep learning curve
- Smaller ecosystem
- Harder to hire

Future: Consider for new components

Monitoring Tradeoffs

Detailed vs Lightweight Monitoring

Chosen: Lightweight for Hot Path, Detailed for Cold Path

Detailed Monitoring:

Advantages:
- Complete visibility
- Easy debugging
- Rich metrics

Disadvantages:
- Performance overhead
- Increased latency
- Higher cost

Use: Non-critical services

Lightweight Monitoring:

Advantages:
- Minimal overhead
- Low latency impact
- High performance

Disadvantages:
- Limited visibility
- Harder debugging
- Sampling only

Use: Matching engine

Implementation:
- Sample 1% of orders
- Async metric collection
- Batch metric writes
- <10 μs overhead

Regulatory Tradeoffs

Real-Time vs Batch Reporting

Chosen: Real-Time Audit Log, Batch Reporting

Real-Time Reporting:

Advantages:
- Immediate compliance
- Real-time monitoring
- Fast detection

Disadvantages:
- Performance impact
- Complex implementation
- Higher cost

Use: Audit log (Kafka)

Batch Reporting:

Advantages:
- No performance impact
- Simpler implementation
- Lower cost

Disadvantages:
- Delayed compliance
- Slower detection
- Batch processing

Use: Daily/monthly regulatory reports

Implementation:
- Collect events in real-time
- Process in batch overnight
- Generate reports
- Submit to regulators

This comprehensive tradeoff analysis demonstrates the complex decision-making required to build a high-frequency trading platform that balances ultra-low latency, high throughput, and regulatory compliance.