Skip to content

Order Engine 撮合引擎开发文档

项目概述

Order Engine 是一个基于 Rust 开发的高性能金融交易撮合引擎,专注于提供低延迟、高吞吐的订单匹配服务。系统采用事件驱动架构,通过订单簿(Order Book)实现高效的订单撮合逻辑。

架构设计

系统架构

gRPC 请求


┌─────────────────────┐
│    gRPC Gateway     │  ← 接收外部订单请求
└─────────────────────┘


┌─────────────────────┐
│   Order Handler     │  ← 订单处理和撮合逻辑
│   (含 Order Book)   │
└─────────────────────┘


┌─────────────────────┐
│    Data Handler     │  ← 结果处理和分发
└─────────────────────┘

┌─────┴─────┐
▼           ▼
┌─────────┐ ┌─────────┐
│ MySQL   │ │RabbitMQ │  ← 数据持久化和消息发布
│Database │ │Message  │
└─────────┘ └─────────┘

核心模块

  • Order Book: 订单簿核心,管理买卖盘深度并执行撮合逻辑
  • Order Handler: 订单处理器,协调订单处理流程和状态管理
  • Data Handler: 数据处理器,负责结果持久化和消息发布
  • Order Tree: 订单树结构,维护价格-时间优先的订单队列

技术栈

组件技术选型用途
核心语言Rust高性能系统开发
通信协议gRPC/Protocol Buffers服务间通信
数据库MySQL交易数据持久化
消息队列RabbitMQ异步消息处理
监控Prometheus系统指标监控
容器化Docker服务部署

核心组件详解

Order Book(订单簿)

订单簿是系统的核心撮合组件,包含以下功能:

  • 双向订单树: 维护买单树和卖单树
  • 实时撮合: 执行价格-时间优先的订单匹配
  • 集合竞价: 支持开盘集合竞价模式
  • 市价单处理: 按份额或按金额的市价单撮合

Order Handler(订单处理器)

协调订单的生命周期管理:

  • 序列号管理: 确保订单处理的严格时序
  • 状态维护: 管理订单簿状态和配置参数
  • 结果收集: 收集撮合结果并传递给数据处理器
  • 错误处理: 处理业务逻辑错误和系统异常

Data Handler(数据处理器)

负责撮合结果的后续处理:

  • 批量写入: 高效的数据库批量操作
  • 消息发布: 通过 RabbitMQ 广播交易结果
  • 重试机制: 可靠的数据持久化保证
  • 性能监控: 记录处理性能指标

功能特性

订单管理

  • 订单类型: 限价单、市价单、条件单
  • 时效类型: GTC(撤单前有效)、IOC(立即成交或撤销)、FOK(全额成交或撤销)
  • 订单操作: 新增、修改、撤销、查询
  • 批量处理: 支持批量订单提交和处理

撮合机制

  • 价格优先: 更优价格优先成交
  • 时间优先: 同价位按序列号排序
  • 数量匹配: 支持部分成交和完全成交
  • 自成交控制: 防止同账户自成交

交易模式

  • 连续交易: 实时订单撮合模式
  • 集合竞价: 批量撮合确定开盘价
  • 暂停恢复: 支持交易暂停和恢复机制

风控机制

  • 粉尘单过滤: 过滤小额无意义订单
  • 价格保护: 市价单价格偏离保护
  • 订单验证: 多层次订单合法性检查
  • 流量控制: 防止系统过载

配置管理

核心参数

yaml
# 业务配置
symbol: "btc_usdt_perp"          # 交易对
dust_limit: 0                    # 粉尘单限额
last_price: 1                    # 初始价格
market_order_price_percent: 500  # 市价单价格保护比例
min_share: 100000                # 最小交易数量

# 性能配置
channel_size: 20                 # 通道缓冲区大小
write_db_interval: 200           # 数据库写入间隔(ms)
max_record_once: 700             # 单次最大写入记录数

# 服务配置
port: 9003                       # gRPC 服务端口
prometheus_port: 9004            # 监控端口

环境配置

yaml
# 日志配置
rust_log: "debug"

# 数据库配置
mysql_dsn: "mysql://user:pass@host:port/db"
mysql_max_connection: 5

# 消息队列配置
amqp_url: "amqp://localhost:5672"
exchange_name: "fo.ex.order_engine.result"
result_format: "Protobuf"  # Json | Protobuf

API 接口

订单操作接口

protobuf
service Relay {
    // 批量订单处理
    rpc BatchOrder(BatchOrderRequest) returns (BatchOrderResponse);

    // 流式订单初始化
    rpc Init(stream InitRequest) returns (InitResponse);

    // 系统控制
    rpc Reset(ResetRequest) returns (ResetResponse);
    rpc Pause(PauseRequest) returns (PauseResponse);
    rpc Resume(ResumeRequest) returns (ResumeResponse);
}

查询接口

protobuf
service Relay {
    // 订单簿查询
    rpc QueryOrderBook(QueryOrderBookRequest) returns (QueryOrderBookResponse);
    rpc QueryOrderBookGrouped(QueryOrderBookGroupedRequest) returns (QueryOrderBookGroupedResponse);

    // 系统状态查询
    rpc GetSettings(GetSettingsRequest) returns (GetSettingsResponse);
    rpc OrderBookInfo(OrderBookInfoRequest) returns (OrderBookInfoResponse);
}

控制接口

protobuf
service ExchangeControlService {
    rpc StartWork(ControlStartWorkRequest) returns (ControlStartWorkResponse);
    rpc StopWork(ControlStopWorkRequest) returns (ControlStopWorkResponse);
    rpc QueryStatus(ControlQueryStatusRequest) returns (ControlQueryStatusResponse);
}

数据模型

订单结构

rust
pub struct Order {
    id: String,                    // 订单唯一标识
    seq: u64,                      // 序列号
    buy_or_sell: bool,             // 买卖方向
    market_or_limit: bool,         // 订单类型
    limit_price: BigUint,          // 限价
    shares: BigUint,               // 数量
    tif: TIF,                      // 时效类型
    account_id: String,            // 账户ID
    expire_time: u64,              // 过期时间
}

时效类型

rust
pub enum TIF {
    GTC,  // Good-Till-Cancel: 不成交部分挂单
    IOC,  // Immediate-Or-Cancel: 不成交部分撤单
    FOK,  // Fill-Or-Kill: 要么全成交要么撤单
}

订单命令

rust
pub enum OrderCommandType {
    PUT_ORDER,     // 挂单(不撮合)
    EXEC_ORDER,    // 挂单(撮合)
    CANCEL_ORDER,  // 取消订单
    MODIFY_ORDER,  // 修改订单
    CALL_AUCTION,  // 集合竞价
}

系统部署

构建和编译

bash
# 开发构建
cargo build

# 生产构建
make build

# 运行服务
make run

Docker 部署

bash
# 构建镜像
docker-compose build

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f order-executor

分布式部署

bash
# 多实例部署
make 9005  # 部署到端口 9005
make 9006  # 部署到端口 9006
make 9007  # 部署到端口 9007

性能优化

内存管理

  • 使用 BigUint 处理高精度数值计算
  • 采用对象池减少内存分配
  • 合理设置缓冲区大小避免阻塞

并发处理

  • 基于 Tokio 异步运行时
  • 多通道并行处理订单流
  • 无锁数据结构优化性能

数据库优化

  • 批量写入减少 I/O 开销
  • 连接池管理数据库连接
  • 异步写入避免阻塞主流程

监控和运维

关键指标

  • 订单处理延迟: P50/P95/P99 延迟分布
  • 系统吞吐量: 每秒处理订单数
  • 撮合成功率: 订单撮合成功率
  • 资源使用: CPU、内存、网络使用率

告警规则

  • 订单处理延迟超过阈值
  • 系统错误率超过预设值
  • 数据库连接池耗尽
  • 消息队列积压超限

故障处理

  • 服务降级: 暂停非关键功能
  • 流量控制: 限制订单提交速率
  • 状态恢复: 基于序列号的状态恢复
  • 手动干预: 通过控制接口人工处理

开发规范

代码规范

  • 遵循 Rust 官方代码风格指南
  • 使用 cargo fmt 自动格式化
  • 通过 cargo clippy 静态检查

🚀 构建现代化数字资产交易平台