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>
DPDK Market Data Feed Handler
基于 DPDK 用户态 TCP/WebSocket 协议栈的生产级行情接入网关。
产品定位
金融行业最典型的低延迟场景:从交易所或行情提供商接收实时 WebSocket 行情数据,以微秒级延迟解析并转发给下游交易系统。
功能
- 零拷贝 DPDK 数据路径(跨核 < 1μs)
- 多品种行情订阅(股票代码、期货合约)
- 延迟直方图统计:min / avg / P50 / P95 / P99 / max(微秒级)
- 消息速率跟踪:每品种 msg/s
- 定时统计输出(可配间隔)
- SIGINT/SIGTERM 优雅退出
- 断线检测与统计
编译
cd .. && make app
# 产物: build/market_feed
运行
1. 启动行情服务端(任选一种)
# Python 零依赖服务端
python3 demo/market_data_server.py 8080 100
# C 高性能 echo 服务端(兼容测试)
./test/ws_echo_server 8080
2. 启动 DPDK 行情网关
./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 | 每秒消息数 | 吞吐指标 |
商业化路径
- 第一阶段(当前):单品种订阅 + 延迟统计 → MVP 演示
- 第二阶段(1-2 周):Prometheus /metrics HTTP 端点、JSON 配置文件
- 第三阶段(1 月):多核 RSS、TLS 支持、日志系统
- 第四阶段(3 月):HA 双活、热升级、管理 API