撮合引擎

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