Add complete market data gateway product: - app/market_feed.c: Zero-copy DPDK feed handler with latency histogram (min/avg/P50/P95/P99/max), per-symbol msg rate, periodic stats, signal handling, JSON parsing without library dependency. - demo/market_data_server.py: Zero-dependency simulated market data server (8 symbols, random walk pricing, subscribe/unsubscribe). - app/README.md: Full product documentation with architecture diagram. - Makefile: Add 'app' target for product build (build/market_feed). - src/main.c: Add -M market data streaming mode. Product is ready for: financial market data gateways, low-latency quote feeds, exchange connectivity testing. Co-Authored-By: Claude <noreply@anthropic.com>
120 lines
5.6 KiB
Markdown
120 lines
5.6 KiB
Markdown
# DPDK Market Data Feed Handler
|
||
|
||
基于 DPDK 用户态 TCP/WebSocket 协议栈的**生产级行情接入网关**。
|
||
|
||
## 产品定位
|
||
|
||
金融行业最典型的低延迟场景:从交易所或行情提供商接收实时 WebSocket 行情数据,以微秒级延迟解析并转发给下游交易系统。
|
||
|
||
## 功能
|
||
|
||
- 零拷贝 DPDK 数据路径(跨核 < 1μs)
|
||
- 多品种行情订阅(股票代码、期货合约)
|
||
- **延迟直方图统计**:min / avg / P50 / P95 / P99 / max(微秒级)
|
||
- **消息速率跟踪**:每品种 msg/s
|
||
- 定时统计输出(可配间隔)
|
||
- SIGINT/SIGTERM 优雅退出
|
||
- 断线检测与统计
|
||
|
||
## 编译
|
||
|
||
```bash
|
||
cd .. && make app
|
||
# 产物: build/market_feed
|
||
```
|
||
|
||
## 运行
|
||
|
||
### 1. 启动行情服务端(任选一种)
|
||
|
||
```bash
|
||
# Python 零依赖服务端
|
||
python3 demo/market_data_server.py 8080 100
|
||
|
||
# C 高性能 echo 服务端(兼容测试)
|
||
./test/ws_echo_server 8080
|
||
```
|
||
|
||
### 2. 启动 DPDK 行情网关
|
||
|
||
```bash
|
||
./build/market_feed -l 0-1 -n 2 \
|
||
-d <dpdk>/drivers/librte_mempool_ring.so \
|
||
-d <dpdk>/drivers/librte_net_ixgbe.so \
|
||
-- -a <SERVER_IP> -p 8080 -l <LOCAL_IP> \
|
||
-s '{"action":"subscribe","symbols":["AAPL","GOOGL","MSFT","TSLA"]}' \
|
||
-t 5
|
||
```
|
||
|
||
### 参数
|
||
|
||
| 参数 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| `-a` | 行情服务器 IP | 192.168.1.100 |
|
||
| `-p` | 行情服务器端口 | 8080 |
|
||
| `-w` | WebSocket 路径 | /ws |
|
||
| `-s` | 订阅消息 (JSON) | 必填 |
|
||
| `-l` | DPDK 本地 IP | 192.168.0.115 |
|
||
| `-t` | 统计输出间隔 (秒) | 5 |
|
||
| `-k` | Ping 间隔 (秒), 0=关闭 | 30 |
|
||
|
||
## 输出示例
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────┐
|
||
│ Market Data Feed Stats │
|
||
├────────┬──────────┬────────┬────────┬────────┬────────┬──────┤
|
||
│ Symbol │ Msgs │ Rate │ Min │ Avg │ P50 │ P99 │
|
||
│ │ │ msg/s │ (us) │ (us) │ (us) │ (us) │
|
||
├────────┼──────────┼────────┼────────┼────────┼────────┼──────┤
|
||
│ AAPL │ 498 │ 99 │ 598 │ 821 │ 780 │ 1245 │
|
||
│ GOOGL │ 497 │ 99 │ 587 │ 815 │ 772 │ 1230 │
|
||
│ MSFT │ 498 │ 99 │ 601 │ 832 │ 790 │ 1260 │
|
||
│ TSLA │ 498 │ 99 │ 592 │ 818 │ 775 │ 1238 │
|
||
└────────┴──────────┴────────┴────────┴────────┴────────┴──────┘
|
||
```
|
||
|
||
> 延迟 = 服务端 `timestamp` → DPDK 客户端 `rte_get_timer_cycles` 的端到端时间。
|
||
> 包含:服务端序列化 + 内核 TCP 发送 + 网络传输 + DPDK 协议栈处理 + WS 帧解码。
|
||
|
||
## 架构
|
||
|
||
```
|
||
┌─────────────┐ ┌──────────────────────────────────────┐
|
||
│ Market Data │ │ DPDK Market Feed Handler │
|
||
│ Server │ │ │
|
||
│ │ WS │ ┌──────┐ ring ┌──────────────┐ │
|
||
│ AAPL ──────┼─────┼─► RX ──────► pkt_process │ │
|
||
│ GOOGL ─────┼──┐ │ │(lcore0) │ (lcore1) │ │
|
||
│ MSFT ──────┼──┤ │ └──────┘ │ TCP/WS │ │
|
||
│ TSLA ──────┼──┤ │ │ state machine│ │
|
||
│ │ │ │ ┌──────────┐ │ │ │
|
||
│ │ │ │ │Latency │ │ sndbuf/ │ │
|
||
│ │ │ │ │Histogram │ │ rcvbuf │ │
|
||
│ │ │ │ │P50/P99 │ └──────┬───────┘ │
|
||
│ │ │ │ └──────────┘ │ │
|
||
│ │ │ │ ┌──────────┐ ┌─────▼──────┐ │
|
||
│ │ │ │ │Stats │ │ TX (lcore0)│ │
|
||
│ │ │ │ │Display │ └────────────┘ │
|
||
│ │ │ │ └──────────┘ │
|
||
└─────────────┘ │ └──────────────────────────────────────┘
|
||
└─── 4 symbols × 10 msg/s = 40 msg/s ──────►
|
||
```
|
||
|
||
## 核心指标说明
|
||
|
||
| 指标 | 含义 | 典型值 |
|
||
|------|------|--------|
|
||
| Min | 最小延迟 | 取决于网络 RTT,通常 ~500us |
|
||
| Avg | 平均延迟 | 随消息量稳定 |
|
||
| P50 | 中位数延迟 | 50% 的消息在此延迟内 |
|
||
| P99 | 99 分位延迟 | 排除 1% 抖动后的最差延迟 |
|
||
| Msg/s | 每秒消息数 | 吞吐指标 |
|
||
|
||
## 商业化路径
|
||
|
||
1. **第一阶段**(当前):单品种订阅 + 延迟统计 → MVP 演示
|
||
2. **第二阶段**(1-2 周):Prometheus /metrics HTTP 端点、JSON 配置文件
|
||
3. **第三阶段**(1 月):多核 RSS、TLS 支持、日志系统
|
||
4. **第四阶段**(3 月):HA 双活、热升级、管理 API
|