从零构建一个跨语言实时行情系统(一):设计思路与架构剖析

205 阅读6分钟

从零构建一个跨语言实时行情系统(一):设计思路与架构剖析

🚀 本文是“从零构建一个跨语言实时行情系统”系列第一篇,带你快速了解系统架构、模块设计与运行机制。

涵盖内容:

  • C++ 行情模拟器 + WebSocket 推送实现
  • Python 接入 FastAPI,统一控制层接口
  • WebSocket 毫秒级行情流 + 订阅机制
  • Docker 一键部署 + 快速运行

📌 所有代码已开源,建议收藏 + 关注专栏,不错过后续内容!


在构建量化交易、金融终端或数据分析平台的过程中,实时行情服务是不可或缺的基础组件。

但现实中,大多数企业或开发者要么依赖第三方服务(如行情网关、数据分发平台),要么面对“如何自建一个灵活、高性能、可维护的行情系统”这一难题。

本系列文章将手把手带你实现一个完整的跨语言实时行情系统,项目代号 yquote,采用 C++ + Python 混合架构,具备以下特点:

  • 🚀 高性能:C++ 后端实现核心行情处理与推送
  • 🧩 跨语言协作:Python 提供 API 控制层,适合快速集成
  • 📡 实时推送:WebSocket 通讯实现毫秒级数 据推送
  • 🐳 Docker 化部署:支持一键启动,开发部署零障碍

💡 为什么写这个系列?

作为一名金融后端开发者,我的经验是:

  • ❌ 很多开发者虽懂业务,但系统封闭,缺少系统搭建经验
  • ❌ 很多系统黑盒实现,难以调试与观测,依赖复杂难以部署运行
  • ❌ 接口封闭,缺乏定制能力,开发语言限制严格,无法跨语言开发业务
  • ❌ 缺乏教育意义,不适合训练 AI 模型或教学演示

这个系列的目标是——构建一个开源、高可控、高扩展的行情系统骨架,同时具备工程实践与教学双重价值。

与此同时,希望将我构建实时行情系统的实战经验整理成文章,分享给有类似目标的技术同仁——你可能是:

  • 想打造自己的量化平台的投资者;
  • 想在金融数据领域一起深耕底层技术的工程师;
  • 想学习 C++ 与 Python 甚至 golang Rust 跨语言系统构建方式的开发者。

👉 这不仅是一篇技术教程,更是一份与大家一起学习进步的渠道。


📦 项目地址 & 快速体验

👉 源码地址:Gitee - yquote 项目(欢迎 star⭐️)

git clone https://gitee.com/devilisy/yquote.git
cd yquote
# 脚本构建C++后端
cd cpp_backend
./build.sh          # Release模式
./build.sh Debug    # Debug模式
# 启动Python接口端
cd python_api
pip install -r requirements.txt
python app.py

然后访问:http://localhost:8000 可立即体验行情推送。


🧱 系统架构图

数据模拟器(模拟实时行情)、核心处理引擎(C++)、Python 网关接口、WebSocket 服务、Docker 化部署。

┌─────────────────┐    WebSocket    ┌─────────────────┐
│   Python API    │ ←─────────────→ │   C++ Backend   │
│   (FastAPI)     │                 │   (WebSocket)   │
└─────────────────┘                 └─────────────────┘
         ↑                                   ↑
         │ HTTP/WebSocket                    │
         ↓                                   ↓
┌─────────────────┐                 ┌─────────────────┐
│   Web Client    │                 │ Market Data     │
│   (Browser)     │                 │ Simulator       │
└─────────────────┘                 └─────────────────┘

🧪 系统模块总览

模块说明

  • C++ Market Data Simulator:模拟真实行情波动,每秒生成数十条行情 JSON 数据
  • Quote Subscription Service(C++):通过 WebSocket 推送实时行情流
  • Python API 网关:封装订阅、取消订阅等控制接口,支持用户 HTTP 请求
  • 用户客户端:通过 Python/浏览器/量化平台订阅数据,实现实时可视化或数据接入

📦项目结构拆解(代码仓库结构)

项目结构如下:

yquote/
├── cpp_backend/         # 核心行情服务(含行情生成器和推送模块)
├── python_api/          # Python Web 接口服务(FastAPI 实现)
├── docker/              # 多语言镜像构建与编排
├── tests/               # 功能测试脚本与订阅验证
├── start.sh             # 一键部署脚本
└── README.md / TECHNICAL.md ... # 各类说明文档

🏗️核心数据流逻辑

行情生成器(C++) --> JSON 编码 --> WebSocket 推送 --> Python API 订阅控制 --> 客户端接收

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   Web Client    │    │  Python Client  │    │  Test Client    │
│   (Browser)     │    │   (Script)      │    │   (Testing)     │
└─────────┬───────┘    └─────────┬───────┘    └─────────┬───────┘
          │                      │                      │
          │ HTTP/WebSocket       │ WebSocket            │ WebSocket
          │                      │                      │
          ▼                      ▼                      ▼
┌─────────────────────────────────────────────────────────────────┐
│                    Python API Layer                             │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────────┐  │
│  │   FastAPI   │  │ WebSocket   │  │    Auto Reconnect       │  │
│  │   Server    │  │   Client    │  │      Manager            │  │
│  └─────────────┘  └─────────────┘  └─────────────────────────┘  │
└─────────────────────┬───────────────────────────────────────────┘
                      │ WebSocket
                      │
                      ▼
┌─────────────────────────────────────────────────────────────────┐
│                   C++ Backend Core                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────────┐  │
│  │   Config    │  │ WebSocket   │  │    Market Data          │  │
│  │  Manager    │  │   Server    │  │     Simulator           │  │
│  └─────────────┘  └─────────────┘  └─────────────────────────┘  │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────────┐  │
│  │   Quote     │  │   Client    │  │    Thread Pool          │  │
│  │  Manager    │  │  Manager    │  │     Manager             │  │
│  └─────────────┘  └─────────────┘  └─────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

核心组件

1. 配置管理器 (ConfigManager)
class ConfigManager {
public:
    bool loadConfig(const std::string& config_file);
    std::string getString(const std::string& section, const std::string& key, const std::string& default_value = "") const;
    int getInt(const std::string& section, const std::string& key, int default_value = 0) const;
    double getDouble(const std::string& section, const std::string& key, double default_value = 0.0) const;
    bool getBool(const std::string& section, const std::string& key, bool default_value = false) const;
    std::vector<std::string> getStringList(const std::string& section, const std::string& key, const std::vector<std::string>& default_value = {}) const;
    void printConfig() const;
};

功能特性:

  • INI格式配置文件解析
  • 多种数据类型支持 (string, int, double, bool, string_list)
  • 默认值机制
  • 配置验证和错误处理
  • 运行时配置显示
2. WebSocket服务器 (WebSocketServer)
class WebSocketServer {
public:
    bool start();
    void stop();
    void sendMessage(const std::string& client_id, const std::string& message);
    void sendToSubscribers(const std::vector<std::string>& client_ids, const std::string& message);
    std::vector<std::string> getClientIds() const;
    
    // 回调函数设置
    void setMessageCallback(std::function<void(const std::string&, const std::string&)> callback);
    void setClientConnectCallback(std::function<void(const std::string&)> callback);
    void setClientDisconnectCallback(std::function<void(const std::string&)> callback);
};

技术实现:

  • 符合RFC 6455标准的WebSocket协议
  • 标准握手流程 (SHA-1 + Base64)
  • 完整的帧格式解析和生成
  • 掩码处理和验证
  • 多线程客户端处理
  • 线程安全的客户端管理
3. 行情管理器 (QuoteManager)
class QuoteManager {
public:
    void updateQuote(const QuoteData& quote);
    std::vector<QuoteData> getAllQuotes() const;
    QuoteData getQuote(const std::string& symbol) const;
    
    // 订阅管理
    void subscribe(const std::string& client_id, const std::vector<std::string>& symbols);
    void unsubscribe(const std::string& client_id, const std::vector<std::string>& symbols);
    void unsubscribeAll(const std::string& client_id);
    std::vector<std::string> getSubscribers(const std::string& symbol) const;
    size_t getSubscriptionCount() const;
};

核心特性:

  • 双向索引订阅管理 (客户端↔股票)
  • 线程安全的数据访问
  • 高效的订阅查询
  • 自动清理机制
4. 市场数据模拟器 (MarketDataSimulator)
class MarketDataSimulator {
public:
    void start();
    void stop();
    void addSymbol(const std::string& symbol, double initial_price);
    void removeSymbol(const std::string& symbol);
    void setUpdateInterval(int interval_ms);
    void setPriceVolatility(double volatility_percent);
    void setDataCallback(std::function<void(const QuoteData&)> callback);
    bool isRunning() const;
};

模拟特性:

  • 可配置的价格波动率
  • 可调节的更新频率
  • 多股票并行模拟
  • 真实的市场数据格式

🚀 部署概述

支持的操作系统

  • Linux: Ubuntu 20.04+, CentOS 8+, RHEL 8+
  • macOS: 10.15+
  • Windows: Windows 10+ (WSL2推荐)

开发环境部署

Ubuntu/Debian 系统
# 更新系统包
sudo apt update && sudo apt upgrade -y

# 安装基础依赖
sudo apt install -y build-essential cmake git curl

# 安装OpenSSL开发库
sudo apt install -y libssl-dev

# 安装Python和pip
sudo apt install -y python3 python3-pip python3-venv

# 验证安装
gcc --version
cmake --version
python3 --version
其他系统

详见仓库文档


🔍 后续计划预告

  • 🧪 WebSocket 数据推送调优技巧
  • 🧬 Pybind11 跨语言回调设计
  • ⚙️ Docker Compose 多模块部署

📎 附录:项目定位与适用人群

角色适用方式
C++/Python 开发者学习系统级数据推送服务设计
想自建行情系统的量化研究员快速搭建自用行情推送网关
跨语言系统架构实践者快速搭建多语言集群,跨语言进程通信
网课教培数据通信课程实验平台

欢迎关注本系列,后续还将包括:

  • 🔧 性能优化与监控

  • 🔄 多用户订阅管理

  • 🧬 Pybind11/Golang/ZeroMQ 等跨语言扩展

  • 🧭 历史行情回放与回测支持

👉 点赞 + 收藏 + 关注我,持续更新系统开发实战干货!