撮合引擎

SODOS Exchange撮合引擎是使用 Go 语言开发的高性能订单撮合系统,采用红黑树和对象池等优化技术,实现亚毫秒级撮合延迟和超过 10 万 TPS 的吞吐量。

技术架构

核心技术栈

编程语言和框架

  • Go 1.21+: 高性能并发编程语言
  • Fiber v2: 高性能 HTTP Web 框架
  • GORM: Go ORM 数据库框架

数据存储

  • MySQL 8.0+: 订单持久化存储
  • Redis 6.0+: 事件发布和缓存

核心依赖

  • shopspring/decimal: 高精度小数计算
  • go-redis/redis: Redis 客户端
  • godotenv: 环境变量管理

系统架构

┌─────────────────────────────────────────────────────┐
│                  客户端层                            │
│        HTTP API | WebSocket | 内部服务调用          │
└─────────────────────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────┐
│               接入层 (HTTP Server)                   │
│                                                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐         │
│  │ 下单接口 │  │ 撤单接口 │  │ 查询接口 │         │
│  └──────────┘  └──────────┘  └──────────┘         │
└─────────────────────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────┐
│              撮合引擎核心 (Match Engine)             │
│                                                      │
│  ┌─────────────────────────────────────────────┐   │
│  │        订单簿管理 (Order Book)              │   │
│  │  ┌────────────┐  ┌────────────┐            │   │
│  │  │  买盘红黑树 │  │ 卖盘红黑树 │            │   │
│  │  │ (Buy Tree) │  │(Sell Tree) │            │   │
│  │  └────────────┘  └────────────┘            │   │
│  │         ↓                ↓                  │   │
│  │  ┌──────────────────────────┐              │   │
│  │  │    价格层级链表           │              │   │
│  │  │  (Price Level Queue)     │              │   │
│  │  └──────────────────────────┘              │   │
│  └─────────────────────────────────────────────┘   │
│                                                      │
│  ┌─────────────────────────────────────────────┐   │
│  │         撮合算法 (Matching Algorithm)       │   │
│  │  • 价格优先 (Price Priority)                │   │
│  │  • 时间优先 (Time Priority)                 │   │
│  │  • 部分成交 (Partial Fill)                  │   │
│  └─────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────┐
│              事件发布层 (Event Publisher)            │
│                                                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐         │
│  │ 成交事件 │  │ 订单事件 │  │ 深度事件 │         │
│  └──────────┘  └──────────┘  └──────────┘         │
│                   ↓                                  │
│            Redis Streams / Pub/Sub                  │
└─────────────────────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────┐
│                 持久化层 (Persistence)               │
│           MySQL (订单、成交记录持久化)               │
└─────────────────────────────────────────────────────┘

目录结构

match-engine/
├── 📱 cmd/
│   └── match-engine/
│       └── main.go              # 服务入口
├── 🔧 internal/
│   ├── config/                  # 配置管理
│   │   └── config.go            # 配置加载
│   ├── server/                  # HTTP 服务器
│   │   └── server.go            # Fiber 服务器配置
│   ├── handlers/                # HTTP 处理器
│   │   └── order.go             # 订单接口处理
│   ├── services/                # 业务服务层
│   │   ├── match_engine.go      # 撮合引擎服务
│   │   └── metrics.go           # 性能指标服务
│   ├── engine/                  # 核心引擎
│   │   ├── market/              # 市场引擎
│   │   │   ├── engine.go        # 市场引擎主逻辑
│   │   │   ├── depth_publisher.go   # 深度发布
│   │   │   ├── event_publisher.go   # 事件发布
│   │   │   ├── trade_id_generator.go # 成交ID生成
│   │   │   └── retry.go         # 重试机制
│   │   ├── orderbook/           # 订单簿
│   │   │   ├── orderbook.go     # 订单簿核心
│   │   │   ├── metrics.go       # 性能指标
│   │   │   └── time_in_force.go # 订单有效期
│   │   ├── persistence/         # 持久化
│   │   │   └── trade_persister.go # 成交持久化
│   │   ├── validation/          # 订单验证
│   │   │   └── order_validator.go # 订单验证器
│   │   └── errors/              # 错误定义
│   │       └── engine_errors.go # 引擎错误
│   ├── models/                  # 数据模型
│   │   ├── order.go             # 订单模型
│   │   ├── price_node.go        # 价格节点
│   │   └── currency.go          # 币种模型
│   ├── enum/                    # 枚举类型
│   │   ├── market_type.go       # 市场类型
│   │   ├── order_type.go        # 订单类型
│   │   └── event_type.go        # 事件类型
│   └── gateway/                 # 外部网关
│       ├── database.go          # 数据库连接
│       └── redis.go             # Redis 连接
├── 📦 Dockerfile                # Docker 镜像构建
├── 📝 go.mod                    # Go 模块依赖
└── 📖 README.md                 # 项目文档

核心功能

1. 订单簿管理

红黑树数据结构

  • 买盘红黑树: 价格从高到低排序,最高买价在树顶
  • 卖盘红黑树: 价格从低到高排序,最低卖价在树顶
  • 时间复杂度: O(log n) 的插入、删除、查找操作
  • 内存优化: 对象池复用,减少 GC 压力

价格层级管理

  • 双向链表: 同价位订单按时间先后排序
  • FIFO 队列: 先进先出保证时间优先
  • 快速访问: O(1) 时间复杂度的头部插入和删除
  • 哈希映射: 订单 ID 到订单对象的快速查找

深度数据生成

  • 实时计算: 动态生成指定档位的深度数据
  • 聚合统计: 各价格层级的订单数量和金额
  • 增量更新: 只推送变化的深度数据
  • 性能优化: 缓存深度快照,减少重复计算

2. 撮合算法

价格-时间优先原则

  • 价格优先: 买盘最高价优先,卖盘最低价优先
  • 时间优先: 同价位按订单时间先后顺序撮合
  • 公平撮合: 严格遵循市场公平交易规则

限价单撮合

  • 价格匹配: 买价 ≥ 卖价时触发撮合
  • 数量匹配: 按订单数量进行匹配
  • 部分成交: 支持订单部分成交,剩余量继续挂单
  • 完全成交: 订单完全成交后从订单簿移除

市价单撮合

  • 立即成交: 以对手盘最优价格立即成交
  • 价格滑点: 可能以多个价格层级成交
  • 深度消耗: 逐层消耗对手盘深度直到完全成交
  • 未成交撤销: 深度不足时未成交部分自动撤销

订单有效期

  • GTC (Good Till Cancel): 一直有效直到撤销
  • IOC (Immediate or Cancel): 立即成交否则撤销
  • FOK (Fill or Kill): 完全成交否则撤销
  • 自定义过期: 支持指定时间过期

3. 事件系统

成交事件发布

  • 实时推送: 成交完成后立即发布事件
  • Redis Streams: 使用 Redis Streams 持久化事件流
  • 多频道订阅: 按市场类型和交易对分频道
  • 事件格式: 标准化的 JSON 事件格式

订单状态事件

  • order_placed: 订单下单成功
  • order_filled: 订单完全成交
  • order_partially_filled: 订单部分成交
  • order_cancelled: 订单已撤销
  • order_modified: 订单已修改
  • order_expired: 订单已过期

深度更新事件

  • 增量更新: 只推送变化的价格层级
  • 完整快照: 定期推送完整深度快照
  • 聚合推送: 批量更新减少推送频率
  • 优先级队列: 高频交易对优先推送

4. 性能优化

对象池技术

  • 订单对象池: 复用订单对象,减少内存分配
  • 价格节点池: 复用价格层级节点
  • 事件对象池: 复用事件对象
  • GC 优化: 大幅减少 GC 停顿时间

读写锁优化

  • 读写分离: 使用 RWMutex 提高并发读性能
  • 细粒度锁: 按交易对分别加锁,减少锁竞争
  • 无锁设计: 关键路径使用无锁数据结构
  • 锁超时: 防止死锁的超时机制

内存优化

  • 精简数据结构: 只保留必要字段
  • 批量操作: 批量处理减少系统调用
  • 延迟清理: 延迟删除减少锁持有时间
  • 内存预分配: 预分配缓冲区避免频繁扩容

并发优化

  • Goroutine 池: 限制并发数避免资源耗尽
  • Channel 缓冲: 使用缓冲 Channel 减少阻塞
  • 异步处理: 非关键路径异步执行
  • 批量提交: 批量提交数据库减少 I/O

技术特性

高性能设计

亚毫秒级延迟

撮合核心算法优化到极致,P99 延迟小于 100 微秒。使用红黑树保证 O(log n) 的时间复杂度,内存访问局部性优化,CPU 缓存命中率高。

超高吞吐量

单实例支持超过 10 万 TPS 的订单处理能力。通过对象池、读写锁优化、批量处理等技术,充分发挥多核 CPU 性能。

水平扩展

支持按市场类型和交易对进行分片部署。每个实例独立运行,互不影响。通过负载均衡实现请求分发,线性扩展处理能力。

高可用设计

优雅关闭

接收到关闭信号后,停止接收新订单,等待当前订单处理完成,保存状态后再退出。确保数据不丢失,订单不中断。

健康检查

提供 HTTP 健康检查接口,监控服务运行状态。检查数据库连接、Redis 连接、订单簿状态等关键指标。

错误恢复

内置重试机制,自动处理临时性错误。对于持久化失败的成交记录,异步重试直到成功。详细的错误日志便于问题排查。

状态恢复

服务启动时从数据库恢复订单簿状态,继续处理未完成的订单。支持断点续传,中断后可快速恢复服务。

数据一致性

原子操作

订单撮合和状态更新使用原子操作,保证数据一致性。要么全部成功,要么全部失败,不存在中间状态。

事务支持

数据库操作使用事务,确保订单和成交记录的一致性。失败时自动回滚,保证数据完整性。

幂等设计

订单操作支持幂等,重复请求不会产生副作用。通过订单 ID 去重,避免重复下单和撤单。

最终一致性

事件发布采用最终一致性模型,允许短暂的延迟。通过重试机制保证事件最终送达,不丢失任何交易信息。


API 接口

订单管理

下单接口

提交新订单到撮合引擎,支持限价单和市价单。验证订单参数,检查用户余额,执行撮合算法,返回订单状态。

撤单接口

撤销未成交或部分成交的订单。从订单簿移除订单,解冻资金,发布撤单事件,返回撤销结果。

修改订单

修改未成交订单的价格或数量。只能修改未成交的订单,修改后重新进入撮合队列,保持时间优先级。

批量操作

支持批量下单和批量撤单,提高处理效率。一次请求处理多个订单,减少网络开销,提升吞吐量。

市场数据

深度数据查询

获取指定交易对的订单簿深度数据。支持自定义档位数量,返回买卖盘的价格和数量。

成交记录查询

查询最新的成交记录,支持分页和时间范围过滤。返回成交价格、数量、时间等详细信息。

币种列表查询

获取支持的交易币种列表,按市场类型过滤。返回币种代码、精度、状态等信息。

监控调试

性能指标

实时查询撮合引擎性能指标,包括订单数量、撮合延迟、吞吐量等。支持按交易对查询,监控系统运行状态。

订单簿快照

调试接口,查看订单簿完整快照。显示所有价格层级和订单详情,用于问题诊断和系统调优。

健康检查

检查服务健康状态,返回各组件运行情况。用于负载均衡的健康探测和服务监控告警。


事件发布

事件频道

成交事件频道

  • 频道格式: match-engine:event:{market_type}:{symbol}
  • 发布时机: 每笔成交完成后立即发布
  • 事件内容: 成交价格、数量、买卖订单 ID、成交时间
  • 订阅方: WebSocket 网关、行情聚合服务、数据分析服务

成交数据频道

  • 频道格式: crypto-trade-channel-{market_type}
  • 发布时机: 成交事件聚合后发布
  • 事件内容: 聚合后的成交数据,用于行情展示
  • 订阅方: 行情服务、K线生成服务

深度更新频道

  • 频道格式: match-engine:depth:{market_type}:{symbol}
  • 发布时机: 订单簿深度变化时发布
  • 事件内容: 增量或完整深度数据
  • 订阅方: WebSocket 网关、行情缓存服务

事件格式

所有事件采用统一的 JSON 格式,包含事件类型、交易对、数据负载、时间戳等字段。支持版本控制,向后兼容旧版本订阅者。


部署运维

Docker 部署

提供 Dockerfile 构建镜像,支持容器化部署。多阶段构建优化镜像大小,生产镜像只包含必要文件。

环境配置

通过环境变量配置服务参数,包括数据库连接、Redis 连接、服务端口等。支持配置文件和环境变量两种方式。

日志管理

结构化日志输出,支持 JSON 格式。日志级别可配置,生产环境建议使用 INFO 级别。集成日志收集系统如 ELK。

监控告警

提供 Prometheus 指标接口(待实现),集成 Grafana 监控面板。关键指标包括 TPS、延迟、错误率、订单簿深度等。

性能调优

根据实际负载调整 Goroutine 池大小、对象池容量、批量处理大小等参数。使用 pprof 工具进行性能分析和优化。


安全机制

订单验证

严格验证订单参数,包括价格、数量、市场类型等。防止恶意订单攻击,拒绝不合法的订单请求。

频率限制

对下单和撤单接口进行频率限制,防止恶意刷单。按用户 ID 和 IP 限制请求频率,超限后拒绝服务。

数据加密

敏感数据传输使用 HTTPS 加密。数据库连接使用 SSL/TLS,Redis 连接使用密码认证。

审计日志

记录所有订单操作的审计日志,包括用户 ID、操作类型、时间戳等。用于合规审计和问题追溯。

加密数字货币交易所系统-WEB3区块链开发者 • © 2026