编程语言和框架
数据存储
核心依赖
┌─────────────────────────────────────────────────────┐
│ 客户端层 │
│ 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 # 项目文档
撮合核心算法优化到极致,P99 延迟小于 100 微秒。使用红黑树保证 O(log n) 的时间复杂度,内存访问局部性优化,CPU 缓存命中率高。
单实例支持超过 10 万 TPS 的订单处理能力。通过对象池、读写锁优化、批量处理等技术,充分发挥多核 CPU 性能。
支持按市场类型和交易对进行分片部署。每个实例独立运行,互不影响。通过负载均衡实现请求分发,线性扩展处理能力。
接收到关闭信号后,停止接收新订单,等待当前订单处理完成,保存状态后再退出。确保数据不丢失,订单不中断。
提供 HTTP 健康检查接口,监控服务运行状态。检查数据库连接、Redis 连接、订单簿状态等关键指标。
内置重试机制,自动处理临时性错误。对于持久化失败的成交记录,异步重试直到成功。详细的错误日志便于问题排查。
服务启动时从数据库恢复订单簿状态,继续处理未完成的订单。支持断点续传,中断后可快速恢复服务。
订单撮合和状态更新使用原子操作,保证数据一致性。要么全部成功,要么全部失败,不存在中间状态。
数据库操作使用事务,确保订单和成交记录的一致性。失败时自动回滚,保证数据完整性。
订单操作支持幂等,重复请求不会产生副作用。通过订单 ID 去重,避免重复下单和撤单。
事件发布采用最终一致性模型,允许短暂的延迟。通过重试机制保证事件最终送达,不丢失任何交易信息。
提交新订单到撮合引擎,支持限价单和市价单。验证订单参数,检查用户余额,执行撮合算法,返回订单状态。
撤销未成交或部分成交的订单。从订单簿移除订单,解冻资金,发布撤单事件,返回撤销结果。
修改未成交订单的价格或数量。只能修改未成交的订单,修改后重新进入撮合队列,保持时间优先级。
支持批量下单和批量撤单,提高处理效率。一次请求处理多个订单,减少网络开销,提升吞吐量。
获取指定交易对的订单簿深度数据。支持自定义档位数量,返回买卖盘的价格和数量。
查询最新的成交记录,支持分页和时间范围过滤。返回成交价格、数量、时间等详细信息。
获取支持的交易币种列表,按市场类型过滤。返回币种代码、精度、状态等信息。
实时查询撮合引擎性能指标,包括订单数量、撮合延迟、吞吐量等。支持按交易对查询,监控系统运行状态。
调试接口,查看订单簿完整快照。显示所有价格层级和订单详情,用于问题诊断和系统调优。
检查服务健康状态,返回各组件运行情况。用于负载均衡的健康探测和服务监控告警。
match-engine:event:{market_type}:{symbol}crypto-trade-channel-{market_type}match-engine:depth:{market_type}:{symbol}所有事件采用统一的 JSON 格式,包含事件类型、交易对、数据负载、时间戳等字段。支持版本控制,向后兼容旧版本订阅者。
提供 Dockerfile 构建镜像,支持容器化部署。多阶段构建优化镜像大小,生产镜像只包含必要文件。
通过环境变量配置服务参数,包括数据库连接、Redis 连接、服务端口等。支持配置文件和环境变量两种方式。
结构化日志输出,支持 JSON 格式。日志级别可配置,生产环境建议使用 INFO 级别。集成日志收集系统如 ELK。
提供 Prometheus 指标接口(待实现),集成 Grafana 监控面板。关键指标包括 TPS、延迟、错误率、订单簿深度等。
根据实际负载调整 Goroutine 池大小、对象池容量、批量处理大小等参数。使用 pprof 工具进行性能分析和优化。
严格验证订单参数,包括价格、数量、市场类型等。防止恶意订单攻击,拒绝不合法的订单请求。
对下单和撤单接口进行频率限制,防止恶意刷单。按用户 ID 和 IP 限制请求频率,超限后拒绝服务。
敏感数据传输使用 HTTPS 加密。数据库连接使用 SSL/TLS,Redis 连接使用密码认证。
记录所有订单操作的审计日志,包括用户 ID、操作类型、时间戳等。用于合规审计和问题追溯。