Files
sanguo_vnpy/research/vnpy/nas-deployment-architecture-analysis.md
T
2026-04-29 20:15:06 +08:00

13 KiB
Raw Blame History

NAS 环境 sanguo_vnpy Web Trader 架构分析

需求背景

  • 部署目标:NAS 机器上构建一套 sanguo_vnpy 环境
  • 使用方式:多位将军协同开发,可进行回测、模拟交易、实盘
  • 设计原则:基础架构保持 vnpy 官方设计不变,只做必要功能扩展
  • 基础设施:NAS 提供存储和计算,多用户通过 Web Trader 访问

基于官方双进程架构在NAS上的适配分析

当前官方架构图回顾

┌─────────────────────────────────────────────────────────────┐
│  浏览器 / 前端 (各将军本地或通过NAS访问)                     │
└─────────────┬───────────────────────────────────────────────┘
              │ HTTPS / WebSocket
              ↓
┌─────────────────────────────────────────────────────────────┐
│  NAS机器: Web服务进程 (vnpy_webtrader)                      │
│  - FastAPI Web服务器                                        │
│  - REST API / WebSocket                                     │
│  - RPC客户端                                                │
└─────────────┬───────────────────────────────────────────────┘
              │ RPC (本地TCP)
              ↓
┌─────────────────────────────────────────────────────────────┐
│  NAS机器: 单一共享交易进程                                 │
│  - VeighNa Trader 核心                                      │
│  - RPC服务端                                                │
│  - 所有Gateway连接                                          │
│  - 策略运行                                                 │
└─────────────────────────────────────────────────────────────┘

潜在问题分析

问题1:单一共享交易进程无法支持多用户隔离

现状:官方默认设计是 单用户单交易进程

在我们NAS场景:

  • 多位将军同时使用同一个交易进程
  • 账户、持仓、策略都混在一起
  • 无法做用户权限隔离
  • 一个用户出错可能影响所有人

风险等级🔴 高风险


问题2:数据存储路径问题

现状vn.py默认数据存在本地路径

在我们NAS场景:

  • 数据库文件需要放在NAS共享存储,方便各进程访问
  • 需要规划统一数据目录结构
  • 需要考虑多进程并发访问SQLite的问题(如果用SQLite

风险等级🟡 中风险


问题3:进程管理与稳定性

现状:默认需要手动启停进程

在我们NAS场景:

  • 需要后台稳定运行,不能随会话退出而终止
  • 需要崩溃自动重启
  • 需要方便查看日志、排查问题
  • 需要系统级别的进程监控(systemd)

风险等级🟡 中风险


问题4:网络访问路径

现状:默认仅本地访问

在我们NAS场景:

  • NAS通常在内网,需要外网访问需要做好反向代理
  • WebSocket需要特殊配置支持反向代理
  • 证书问题(HTTPS

风险等级🟢 低风险,配置好即可解决


问题5:保持基础架构不变的边界

你说"基础架构我不太想改",这里需要明确:

范围 是否属于"基础架构" 是否需要改
vnpy核心MainEngine/EventEngine/RPC设计 不需要改
vnpy_webtrader的FastAPI+REST+WebSocket设计 不需要改
多用户进程模型(单进程vs多进程) 不属于基础架构,是部署架构问题 需要适配
数据目录存储规划 不属于核心架构,是部署配置问题 需要适配

不同方案对比

方案A:保持官方架构,单交易进程 + 单Web进程

架构

NAS → 1个交易进程(RPC服务端) → 1个Web进程 → 所有用户共享

优点

  • 完全保持官方基础架构,一点不改
  • 资源占用最小

缺点

  • 无用户隔离,所有操作混在一起
  • 无法支持每人独立测试策略
  • 一人出错影响全局
  • 权限无法控制

适用场景:只有你一个人用,不适合多用户团队协作

结论:不推荐,不符合我们多将军协作场景


方案B:每个用户独立一对进程(推荐)

架构

┌─────────────────────────────────────────────────────────┐
│                    Nginx 反向代理                         │
│  - 根据路径/子域名分发到不同Web进程                       │
└─────────────┬───────────────────────────────────────────┘
              ├───────────┬───────────┐
              ↓           ↓           ↓
        ┌─────────┐ ┌─────────┐ ┌─────────┐
        │ Web-姜维 │ │ Web-张飞 │ │ Web-关羽 │  每个用户一个Web进程
        └─────┬───┘ └─────┬───┘ └─────┬───┘
              │            │            │
              ↓            ↓            ↓
        ┌─────────┐ ┌─────────┐ ┌─────────┐
        │交易-姜维 │ │交易-张飞 │ │交易-关羽 │  每个用户一个交易进程
        └─────────┘ └─────────┘ └─────────┘
              │            │            │
              └────────────┼────────────┘
                           ↓
                  NAS共享存储 (各用户独立数据目录)

优点

  • 用户之间完全隔离,互不影响
  • 每个人可以自由测试自己的策略,不怕弄挂别人
  • 数据独立存储,权限清晰
  • 依然保持官方基础架构不变(每个进程都是标准官方架构)
  • 可以独立启停,不影响他人

缺点

  • 资源占用比单进程多,但现在NAS性能足够支撑
  • 需要做简单的进程管理和配置文件生成

结论:推荐!既保持了官方基础架构,又解决了多用户隔离问题,符合需求。


方案C:共享交易进程 + 多Web进程 + 用户级数据隔离

架构

┌─────────────────────────────────────────────────────────┐
│                    Nginx 反向代理                         │
└─────────────┬───────────────────────────────────────────┘
    ┌─────────┴─────────┐
    ↓                   ↓
┌─────────┐        ┌─────────┐
│ Web-张1 │        │ Web-张2 │      多Web进程,共享一个交易进程
└─────┬───┘        └─────┬───┘
      │                  │
      └──────────┼───────┘
                 ↓
         ┌───────────────┐
         │ 共享交易进程   │      单一交易核心,通过用户ID隔离数据
         └───────────────┘

优点

  • 比方案B省点资源

缺点

  • 需要修改vnpy核心代码加入用户隔离逻辑(违反"基础架构不想改"原则)
  • 依然存在干扰风险(一个错误操作可能影响所有用户数据)
  • 维护复杂度高,难以跟进官方更新

结论:不推荐,改基础架构得不偿失,省了点资源带来更多风险


推荐方案:方案B 详细设计

目录结构规划(在NAS上)

/mnt/nas-volume/sanguo_vnpy/
├── config/                    # 全局配置
│   ├── nginx/                # Nginx配置(各用户站点配置)
│   └── systemd/              # systemd单元文件
├── data/                      # 全局共享数据
│   ├── history/              # 历史行情数据(共享只读)
│   └── master-db/            # 主数据库(可选)
└── users/                     # 用户目录(每位将军一个)
    ├── jiangwei/             # 姜维
    │   ├── data/             # 个人数据
    │   ├── logs/             # 日志
    │   ├── strategies/       # 个人策略
    │   ├── config.json      # 进程配置(RPC端口,Web端口等)
    │   ├── start_trading.py  # 个人交易进程启动脚本
    │   └── start_web.py      # 个人Web进程启动脚本
    ├── zhangfei/
    │   └── ...
    └── guanyu/
        └── ...

端口分配规划

约定端口分配规则:

  • 交易RPC请求端口:2000 + 用户编号 * 10
  • 交易RPC订阅端口:2000 + 用户编号 * 10 + 1
  • Web服务端口:8000 + 用户编号
用户 编号 RPC请求 RPC订阅 Web端口
姜维 1 2010 2011 8001
张飞 2 2020 2021 8002
关羽 3 2030 2031 8003
赵云 4 2040 2041 8004
... ... ... ... ...

Nginx 配置示例(按路径分发)

server {
    listen 443 ssl;
    server_name nas.yourdomain.com;

    # SSL证书配置...

    # 姜维
    location /jiangwei/ {
        proxy_pass http://127.0.0.1:8001/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        
        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 张飞
    location /zhangfei/ {
        proxy_pass http://127.0.0.1:8002/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
    # 更多用户...
}

systemd 进程管理(每个用户一对服务)

/etc/systemd/system/
├── sanguo-trade-jiangwei.service
├── sanguo-web-jiangwei.service
├── sanguo-trade-zhangfei.service
├── sanguo-web-zhangfei.service
└── ...

这样:

  • 开机自动启动
  • 崩溃自动重启
  • 可以独立启停某个用户的进程
  • 日志统一通过journald管理

需要改动的地方总结(很少,不改核心架构)

改动项 是否改vnpy核心 说明
1. 规划目录结构 不改动 只是创建目录,不碰代码
2. 为每个用户生成启动脚本 不改动 只是调用官方API,生成启动文件
3. Nginx反向代理配置 不改动 纯运维配置
4. systemd服务文件 不改动 纯运维配置
5. 端口分配规则 不改动 只是配置

结论:完全符合你的要求 "基础架构我不太想改",我们只是做了部署层的适配,vnpy官方核心架构一点不改。


存在的其他风险和应对

风险 应对方案
总资源不够(CPU/内存) 设定用户上限,不用的进程可以停掉,使用时再开
历史行情数据重复存储 全局共享一份历史数据,用户数据目录只做链接
SQLite并发问题 推荐MySQL/PostgreSQL存tick/bar数据,或者每个用户独立SQLite
实盘账户安全 每个用户自己保管APIKey,配置文件权限设为600,只有自己能读

总结建议

  1. 遵循官方基础架构:保持"Web进程 + 交易进程"的双进程模型不变,不修改vnpy核心代码
  2. 多用户隔离方案:每个用户分配独立一对进程,完全隔离,互不影响
  3. 目录规划:全局共享数据放公共区,每个用户数据独立存放
  4. 进程管理:用systemd管理各进程,开机自启,崩溃自动恢复
  5. 访问入口:用Nginx反向代理,按路径分发,统一入口

这个方案完全满足:

  • 基础架构不改动
  • 支持多位将军同时协作
  • 隔离性好,一人出问题不影响全局
  • 便于运维管理
  • 支持回测、模拟、实盘

你的意见如何?确认这个方向我就开始动手搭建基础目录和配置模板。