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 | ProtobufAPI 接口
订单操作接口
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 runDocker 部署
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静态检查
