Exchange-core 交易核心
约 1627 字大约 5 分钟
2025-03-05
编写者:bugcode
本文已完成并校对
exchange-core 是一个基于 Java 的超高性能开源交易所核心,其架构设计围绕 低延迟、高吞吐、无暂停 的核心目标展开。
🏗️ 整体架构与设计哲学
该项目的核心设计哲学可以概括为以下几点:
- 基于 LMAX Disruptor 的流水线处理:整个系统是一个典型的多阶段流水线。
LMAX Disruptor是其核心“发动机”,负责在 CPU 核心之间以无锁方式传递订单指令(OrderCommand),从而实现极低延迟的并行处理。 - 事件溯源与内存工作状态:系统采用事件溯源模式。核心数据(订单簿、用户余额)完全在内存中操作以保证速度。每个状态变更(如下单、成交)都会作为事件顺序写入磁盘日志(Journaling),并支持从日志恢复状态。这种方式兼具内存的速度与磁盘的可靠性。
- “无锁”与“分片”并行:为避免锁竞争,引擎采用了分片策略。风控(
RiskEngine)和撮合(MatchingEngine)都按用户ID或交易对ID分片到多个CPU核心上独立并行运行。不同分片处理不同数据,完全没有锁竞争。
🧩 核心模块与职责
根据页面中的 Usage examples 和 Features,系统可分为以下模块:
| 模块名称 | 核心类/概念 | 主要职责 |
|---|---|---|
| 订单撮合引擎 | MatchingEngine, IOrderBook | 核心模块。维护特定交易对的订单簿(OrderBook),执行买入/卖出订单的匹配逻辑,生成交易事件(TradeEvent)。提供“Naive”和“Direct”两种实现。 |
| 风控与账户模块 | RiskEngine | 前置拦截与事后更新。在订单进入撮合前验证其合法性(余额、订单参数等);在撮合完成后更新用户账户余额,并计算手续费。支持“直接兑换”和“杠杆交易”两种模式。 |
| 磁盘日志与快照模块 | ISerializationProcessor, DummySerializationProcessor | 持久化与恢复。将每一笔交易和状态变更(OrderCommand)写入磁盘日志;支持创建内存状态的全量快照(Snapshots),以便快速恢复。 |
| API 与命令模块 | ExchangeApi, 各种 Api*Command (如 ApiPlaceOrder) | 对外接口。定义了所有用户可执行的操作命令(下单、撤单、查账等),并负责将它们包装成 OrderCommand 发布到 Disruptor 的 Ring Buffer 中。 |
| 事件处理与结果反馈 | SimpleEventsProcessor, IEventsHandler | 异步结果处理。作为 Disruptor 的消费者,接收并处理系统产生的各种事件(成交、拒绝、订单簿变化等),最终通过回调将结果异步返回给客户端。 |
📊 数据流与处理流程
一个典型的下单请求,其数据流大致如下:
- 提交命令:客户端通过
ExchangeApi发送一个ApiPlaceOrder命令。 - 发布到 Ring Buffer:API 将命令转换成一个
OrderCommand事件,发布到 LMAX Disruptor 的核心环形缓冲区(RingBuffer)。 - 流水线处理:
OrderCommand沿着 Disruptor 构建的处理链依次流动:- 风控预处理(R1):对应的
RiskEngine分片验证账户状态和订单合法性。 - 订单撮合(ME):验证通过后,对应的
MatchingEngine分片执行订单匹配,生成TradeEvent并更新订单簿。 - 风控释放/资金更新(R2):撮合完成后,
RiskEngine最终更新用户账户余额。 - 日志记录(J):与以上流程并行,
ISerializationProcessor将命令和结果异步写入磁盘。
- 风控预处理(R1):对应的
- 结果通知:整个流程完成后,一个包含最终结果的
CommandResult或TradeEvent被发送到SimpleEventsProcessor,并通过IEventsHandler回调通知客户端。
⚡ 核心技术栈与作用
为了达到极致的性能,项目选用了多个专门的 Java 库:
| 技术 | 核心作用 |
|---|---|
| LMAX Disruptor | 无锁并发框架,作为系统核心的“事件驱动引擎”,实现微秒级的 inter-thread 通信。 |
| Eclipse Collections | 提供高性能的内存数据结构,用于管理订单簿、价格档位等,对 GC 友好。 |
| Real Logic Agrona | 提供底层的、高并发、低延迟的数据结构和缓冲协议,与 Disruptor 协同工作。 |
| OpenHFT Chronicle-Wire | 一种高效的跨进程通信和序列化库,用于将 Java 对象持久化到内存映射文件,支持事件日志和快照。 |
| LZ4 Java | 极速压缩算法,对磁盘上的事件日志和快照进行实时压缩,节省存储空间和 I/O 时间。 |
| Adaptive Radix Tree (ART) | 高效的内存索引结构,用于快速查找特定用户订单或价格节点,比传统哈希表在某些场景下更优。 |
💡 总结与架构优缺点
优势
- 极致性能:通过无锁、分片、内存计算等设计,实现了官方基准中 5M/s 以上的吞吐量和 微秒级 的延迟,特别适合高频交易(HFT)。
- 高可靠性:采用事件溯源和快照机制,确保数据安全与快速恢复。
- 架构清晰:模块(风控、撮合、日志)之间职责划分明确,基于 Disruptor 的流水线易于理解和扩展。
- 生产验证:项目经过多种测试(单元、集成、性能、一致性测试),并已在一些项目中使用。
潜在挑战或局限
- 技术门槛高:需要对 LMAX Disruptor、无锁编程、Java 内存模型有深入理解,二次开发或问题排查难度较高。
- 社区活跃度:从页面可见最后稳定版本
0.5.3发布于 2020年6月,代码仓库虽有 2022 年的提交,但整体更新不算特别活跃。这可能在选用时需要考虑长期维护和支持问题。 - 功能待完善:官方
TODOs列表中提到,缺乏市场数据推送(Market Data Feeds)、清算结算(Clearing and Settlement) 以及 FIX/REST API 网关 等生产环境常用组件,需要自行开发集成。
总的来说,exchange-core 是一个为追求极致性能而精心设计的匹配引擎核心。如果你正在构建一个需要处理极高频次交易(如交易所、做市系统)的底层引擎,它是一个优秀的参考或基础。但你需要权衡其技术复杂性和待完善的功能,并评估社区活跃度对长期项目的影响。
项目地址
c++交易系统框架CppTrader项目: