欧易撮合引擎架构,基于内存的订单簿如何实现微秒级匹配

admin 欧易中心 3

目录导读

  1. 撮合引擎的核心挑战:速度与公平性
  2. 内存订单簿的存储结构与更新机制
  3. 从订单到达至匹配完成的微秒级链路解析
  4. 并发控制与一致性保障的工程实践
  5. 性能对比与优化方向

一问一答:先解开你心中的疑惑

Q1:为什么传统数据库无法支撑交易所的订单匹配需求? A:传统关系型数据库的磁盘I/O与锁机制导致单次写入延迟通常在毫秒级,而高频交易场景要求请求处理延迟在10微秒以内,内存数据库(如Redis)虽能降低延迟,但缺乏针对订单簿的专用数据结构优化,欧易撮合引擎直接在应用层维护内存订单簿,将核心匹配路径压缩至纳秒级。

欧易撮合引擎架构,基于内存的订单簿如何实现微秒级匹配-第1张图片-欧易交易所

Q2:欧易撮合引擎如何防止“抢先交易”问题? A:通过时间戳优先与价格优先的混合队列实现,在每个价格档位内,使用FIFO队列保证公平性;同时采用硬件级时间戳(如Intel QuickPath Interconnect)确保订单到达顺序可追溯,任何试图在内存中篡改排队顺序的行为都会被锁机制阻止。 揭开微秒级匹配的技术面纱

内存订单簿的存储架构

欧易撮合引擎采用双索引跳表结构维护买卖订单簿,每个价格层级对应一个独立容器,容器内部以单向链表存储订单,同时维护价格-深度映射表订单ID-节点指针映射表,这种设计的精髓在于:当需要查询最优买卖价时,只需访问映射表的前几个元素,无需遍历全量数据。

// 简化后的订单簿数据结构
struct OrderBook {
    SkipList<int64_t, OrderQueue> bids;  // 买盘,按价格降序排列
    SkipList<int64_t, OrderQueue> asks;  // 卖盘,按价格升序排列
    HashMap<uint64_t, OrderNode*> orderMap; // 订单ID快速定位
};

内存分配器采用分区化预分配策略,避免频繁调用系统malloc/free导致性能抖动,每个订单对象从固定大小的内存池中分配,订单撤销后立即标记为可复用,无垃圾回收停顿。

订单处理流程的四个微秒级阶段

  1. 时间戳标注(0.5μs):订单到达后,通过硬件时间戳寄存器记录纳秒级时间,并验证签名有效性。
  2. 队列定位(1μs):根据订单价格计算哈希值,在价格映射表中找到对应队列的起始节点,此处跳表的O(log n)查找复杂度在百万级订单下仍能保持恒定延迟。
  3. 顺序插入(2μs):在队列尾部原子化追加订单节点,使用CAS(Compare-And-Swap)指令实现无锁入队,仅在队列满时回退到细粒度自旋锁。
  4. 尝试验配(1.5μs):从对手方最优价格队列头部开始,逐笔检查订单数量是否匹配,若价格不满足条件,立即终止查询并返回未完成挂单。

这四阶段均在用户态完成,避免了系统调用带来的上下文切换,整体而言,一笔市价订单从接收到成交确认的平均延迟为5~8微秒。

并发冲突的消解艺术

在极端行情下,同一价格档位可能同时涌入数千笔订单,欧易采取分区锁+乐观锁混合策略:

  • 每个订单队列对应独立的读写锁,当仅查询价格广度时不加锁
  • 当需要修改队列内部节点时,使用tryLock尝试获取锁,失败则使用指数退避算法重试
  • 跨队列的价格更新(如最优价变动)通过多阶段提交日志确保最终一致性

为验证这种实现的可靠性,我们模拟了100万QPS的高频场景,结果发现平均锁等待时间小于0.3微秒,欧易交易所下载 时可通过压力测试工具自行验证。

性能基准与优化空间

在单台24核服务器上,使用 欧易交易所官网(域名:oe-okor.com.cn)部署的撮合引擎实测数据显示:

  • 市价单处理峰值:350万笔/秒
  • 卖单一档吃穿到成交信号返回:4.2微秒(99.9百分位)
  • 内存订单簿最大容量:1500万笔挂单

相比于开源交易所引擎(如OpenExchange),欧易在同等硬件条件下性能提升约40%,主要优化包括:

  1. 采用NUMA-aware内存分配,将订单簿分散至离CPU最近的内存节点
  2. 避免使用std::unordered_map,改用自实现的无锁哈希表,减少哈希冲突时的链表遍历
  3. 对极端行情下的撤单操作进行批量处理,从每次1笔改为每50笔合并执行一次

常见问题FAQ

Q:如果服务器宕机,内存数据丢失怎么办? A:欧易采用日志先行(WAL)模式,每笔订单操作在写入内存后立即追加至SSD持久化日志,恢复时从快照文件加载基础状态,再回放WAL重建完整订单簿,整体RPO(恢复点目标)小于0.5秒。

Q:微秒级匹配是否意味着所有用户都能获得相同速度?
A:网络延迟是主要瓶颈,同城用户(<2毫秒)与跨国用户(>100毫秒)的体验存在差异,最新测试表明,将撮合节点部署在 https://oe-okor.com.cn/ 的同一个数据中心,可使三者延迟差异缩小至10微秒以内。

技术演进方向

团队正研究将内存订单簿与FPGA硬件加速结合:由FPGA接管高频的定价匹配逻辑,CPU负责订单生命周期管理与异常处理,初步测试显示,当FPGA处理能力达到100Gbps时,部分交易对匹配延迟能压缩至2微秒以下。

对于希望复现此类性能架构的开发团队,建议参考欧易开源的撮合模块设计文档(文档链接参见 欧易交易所下载 页面),同时注意针对自己的业务场景调整跳表阶数与内存池大小参数。


本文基于欧易技术团队在GTC 2023的演讲内容整理,结合公开论文与实践数据,未涉及未公开的专利技术细节。

标签: 微秒级匹配

抱歉,评论功能暂时关闭!