Files
wxjandClaude db0f2463ff feat: DPDK Market Data Feed Handler — production product app
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>
2026-07-01 12:36:47 +00:00

120 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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