Believe and act as if it were impossible to fail

系统总体架构(第一版)

目标:构建一个高性能、弹性、可在线热加载策略与在线更新配置的加密货币套利系统。系统由 Rust(执行层)Python(策略层) 协作组成。设计原则:模块化、可观测、可扩展、可安全热重载。


总体组件视图

+----------------+        +----------------+        +----------------+
| ExchangeFeeds  | <----> |   Rust Core    | <----> | Message Bus    |
| (WS/REST)      |        | (Execution)    |        | (NATS/Redis/Kafka)
+----------------+        +----------------+        +----------------+
                                ^  ^  ^
                                |  |  |
                       +--------+  |  +---------+
                       |           |            |
                 +-------------+  |     +---------------+
                 | Shared Cache|<-+     | Python Policy  |
                 | (Redis/mmap)|        | (hot-loadable) |
                 +-------------+        +---------------+
                          ^                      |
                          |                      |
                   +--------------+         +----------+
                   | Config Store | <-----> | Admin UI |
                   | (etcd/Consul)|         +----------+
                   +--------------+

核心组件说明(简洁版)

  1. ExchangeFeeds(多交易所采集)

    • 负责稳定订阅交易所的 WebSocket 行情(depth/tick/trade)和轮询 REST(余额、写单结果)。
    • 要点:连接池、自动重连、限速、心跳。
  2. Rust Core(Execution Engine)

    • 负责快速撮合、下单、确认、风控。严格做两件事:低延迟执行 + 状态机一致性。
    • 提供 gRPC / local IPC 接口供策略层下达命令。
    • 持久化执行日志到高吞吐存储(Kafka/ClickHouse/Timescale)用于回放与审计。
  3. Message Bus(NATS / Redis Streams / Kafka)

    • 负责不同模块间的异步数据流:行情、聚合、策略信号、执行回报。
    • 选择:若延迟最关键选 NATS;需持久化/回溯选 Kafka;简单部署可用 Redis Streams。
  4. Shared Cache(Redis + mmap/共享内存)

    • 高频共享结构(最近 orderbook 快照、top-of-book)用共享内存或 mmap 存放,Rust 持写,Python 读快速访问。
    • Redis 用作全局短时状态、限额计数器、锁。
  5. Python Policy(策略层)

    • 策略以插件形式存在(每个策略为一个独立包或脚本)。
    • 支持在线热加载:通过加载器加载新的策略包或替换已有策略实例,不重启主进程。
    • 决策结果以标准指令发送到 Message Bus 或直接 gRPC 调用 Rust Core。
  6. Config Store(etcd/Consul) + Admin UI

    • 所有运行时配置(交易对白名单、风控阈值、策略参数)存储在 etcd/Consul。
    • Admin UI 可以在线修改配置,变更通过 watch 推送到各个实例。
  7. 监控与告警

    • Prometheus + Grafana:采集延迟、失败率、订单确认时间、资金风险指标。
    • 日志聚合(ELK 或 Loki)。
  8. 存储与回放

    • 行情原始流与执行事件写入 Kafka(或 S3)做回放与回测。

热加载(hot-load)策略设计

  1. 策略插件化

    • 每个策略是一个独立包(Python 模块),遵循统一接口:init(config), on_tick(data), on_signal(...), shutdown()
    • 策略以进程内沙箱运行(可选使用子进程隔离)。
  2. 热加载流程

    • 管理端(Admin UI)上传策略包到策略仓库(或 S3)。

    • 策略管理器(在 Python 层)检测到新版本后:

      • 将旧实例标记为 drain(停止接收新信号,完成未完成任务),
      • 动态导入新策略模块并 init,进行小流量验证(canary),
      • 验证通过后切换路由到新实例;失败则回滚到旧实例。
  3. 安全与隔离

    • 策略运行在有限权限的环境(容器或子进程),禁止直接访问关键凭证。
    • 使用资源限制(CPU/内存/网络)和超时监控。
  4. 配置热更新

    • 配置存在 etcd/Consul。各节点开启 watch,变更后即时加载到内存并通知策略与 Rust。
    • 同时写入变更日志,支持 diff/回滚。

缩放(Scaling)策略

  • 水平扩展 Rust Core 实例:每个实例处理一组交易所或交易对。使用负载分片(shard by symbol)和 leader 选举控制写入权限。
  • 策略层水平扩展:策略可按策略ID水平扩容,消息总线负责分发(consumer groups)。
  • 弹性扩容:在Kubernetes中通过 HPA(基于自定义指标:延迟/处理速率)自动扩容。

接口与协议(简洁清单)

  • 行情流:WebSocket -> Rust -> Message Bus(topic: market.<exchange>.<symbol>)
  • 策略信号:Python -> Message Bus(topic: signal.<strategy>) 或 gRPC/REST -> Rust
  • 执行回报:Rust -> Message Bus(topic: exec.<order_id>) -> Python
  • Config:Admin UI <-> etcd (watch)

容错与回滚

  • 所有关键变更(策略版本、配置)必须支持回滚。
  • 策略热替换采用 Canary 发布策略,失败自动回滚并告警。
  • 关键路径(下单)双写日志并在本地做幂等检查。

部署建议(快速列出)

  • 使用 Kubernetes + Helm。容器化 Rust、Python、NATS/Redis、etcd、Prometheus。
  • CI/CD:策略包与镜像分开部署。策略包可通过 Admin UI 或 CI 上传。
  • Secrets:使用 Kubernetes Secrets 或 Vault 管理 API key。

下一步(建议的工程任务清单)

  1. 确认消息总线选型(NATS / Redis Streams / Kafka)。
  2. 实现 Rust Core 最小可用原型(行情订阅 + 本地下单模拟)。
  3. 实现 Python 插件热加载框架(含 canary + rollback)。
  4. 集成 etcd 配置 watch 与 Admin UI。
  5. 完成监控与回放管道(Prometheus + Kafka)。

文档结束。

我已为你创建并保存了系统架构文档(可在线查看 / 编辑)。

接下来我可以直接:

  1. 把某个模块展开成详细设计(例如:Rust Execution Engine 或 Python 热加载框架)。
  2. 给出具体的技术选型对比(NATS vs Kafka vs Redis Streams、etcd vs Consul 等)。
  3. 输出可运行的最小原型代码样例(Rust + Python 的通信示例)。

你想先做哪一项?