Files
wxjandClaude 9a596e65e1 fix: WS frame parser — skip oversized payload to keep sync
- ws_client.c: When payload exceeds buffer, consume remaining bytes
  before returning error to prevent parser desynchronization.
- market_feed.c: Increase receive buffer 4K→64K, support both
  standard (symbol/timestamp) and compact (s/ts) JSON field names.
- ws_client.c: Disable per-frame debug print in release mode.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-01 12:53:33 +00:00
..

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 每秒消息数 吞吐指标

商业化路径

  1. 第一阶段(当前):单品种订阅 + 延迟统计 → MVP 演示
  2. 第二阶段(1-2 周):Prometheus /metrics HTTP 端点、JSON 配置文件
  3. 第三阶段(1 月):多核 RSS、TLS 支持、日志系统
  4. 第四阶段(3 月):HA 双活、热升级、管理 API