一、低延迟架构概述:做市系统的核心挑战
做市系统,说白了就是一台「抢跑机器」。
我做了这么多年低延迟系统,最深的感触是:做市商赚的不是预测的钱,而是速度的钱。你比别人快1微秒,你就能在价格变动前完成挂单;你慢1微秒,可能就被别人「插队」了。
嗯,咱们先聊聊做市系统到底面临哪些核心挑战。
1.1 核心挑战:速度、稳定、公平
做市系统的核心挑战,我总结为三个词:
- 速度——从行情到达,到策略计算,再到订单发出,整个链路必须在微秒级完成。我在项目中遇到过,某次行情波动剧烈,系统延迟从5微秒飙到50微秒,结果就是连续被吃单,一天亏了上百万。
- 稳定性——系统不能「抖」。你想想看,如果延迟忽高忽低,策略参数根本没法调。我曾经见过一个团队,他们的系统平均延迟只有3微秒,但P99延迟到了200微秒——这种系统根本没法用。
- 公平性——交易所对做市商有严格的考核,比如挂单时间占比、买卖价差等。如果你的系统延迟不稳定,很容易触发交易所的惩罚机制。
一句话总结:做市系统的本质,是在极短的时间内,完成「行情接收→策略计算→订单发送」的闭环。任何一个环节的延迟,都会直接转化为亏损。
1.2 延迟的来源分析
延迟到底从哪来?我习惯把延迟拆成四个部分:
| 延迟类型 | 典型来源 | 量级(参考) |
|---|---|---|
| 网络延迟 | 网卡、交换机、光纤传输 | 1-100微秒 |
| 内核延迟 | 系统调用、中断处理、上下文切换 | 1-50微秒 |
| 应用延迟 | 协议解析、策略计算、内存分配 | 0.1-10微秒 |
| 硬件延迟 | CPU缓存未命中、内存访问、PCIe传输 | 0.01-1微秒 |
这里我想特别强调一点:很多人只关注「网络延迟」,觉得换个好网卡就万事大吉了。其实不然。我在优化一个系统时发现,网络延迟只占20%,剩下的80%都耗在了应用层的协议解析和内存拷贝上。说白了,你网卡再快,如果应用层代码写得烂,照样白搭。
避坑指南:我曾经花了两周时间优化网络延迟,结果只降了2微秒。后来发现,把协议解析从JSON换成二进制编码,直接降了15微秒。所以,先做profile,再动手优化。
1.3 低延迟架构的设计目标
低延迟架构的设计目标,其实就三个:
- 确定性——延迟要可预测,不能忽高忽低。我习惯用「P99延迟」作为核心指标,而不是平均值。平均值好看没用,极端值才要命。
- 最小化——把每个环节的延迟压到极致。比如,从网卡到应用层,能不能做到零拷贝?从策略计算到订单发送,能不能做到无锁?
- 可观测——每个环节的延迟都要能监控。我见过太多系统,出了问题只能靠猜。没有监控,你连问题在哪都不知道。
1.4 设计原则:我的经验之谈
做低延迟架构,我总结了几个原则:
- 减少拷贝——数据每拷贝一次,延迟就增加一次。能零拷贝就零拷贝,能共享内存就别用消息队列。
- 避免锁竞争——锁是延迟的「放大器」。我建议用无锁数据结构,或者用原子操作替代锁。
- 预分配资源——运行时动态分配内存,是延迟抖动的主要来源。我习惯在启动时就把所有内存分配好,运行时只复用。
- 绑定CPU核心——把关键线程绑定到特定CPU核心上,避免上下文切换。我曾经见过,一个线程被调度到不同核心上,延迟直接翻倍。
- 使用低延迟硬件——比如Solarflare网卡、FPGA加速卡。但要注意,硬件只是辅助,软件才是根本。
注意:不要盲目追求「极致低延迟」。我见过有人为了省1微秒,把代码写得极其复杂,结果出了问题根本没法调试。记住,可维护性也是架构设计的一部分。
1.5 知识体系总览
下面这张图,是我对低延迟架构知识体系的总结。你可以把它当作整个课程的「地图」:
1.6 小结
这一章,我们聊了做市系统的核心挑战、延迟的来源、设计目标和原则。说白了,低延迟架构不是堆硬件,而是从系统层面,把每个环节的延迟都压到极致。
我个人习惯,在开始任何优化之前,先画一张「延迟链路图」,把从行情接收到订单发送的每个环节都列出来,然后逐个测量、逐个优化。这样心里才有底。
嗯,下一章我们会深入聊「硬件选型与网络优化」,到时候我会分享一些具体的硬件配置和调优经验。