3. Serving策略基础:Serving层定义、在量化交易链路中的位置与核心目标
3.1 Serving层定义
Serving层(在线服务层)是量化交易系统中直接面向行情数据消费与交易决策执行的中间层。它负责将经过清洗、加工、存储的行情数据,以极低延迟、高吞吐的方式推送给策略引擎或交易执行模块。Serving层是连接“数据生产”与“策略消费”的桥梁,也是整个链路中延迟敏感度最高的环节。
核心定义:Serving层 = 行情数据实时分发 + 订阅管理 + 协议转换 + 流量控制 + 故障隔离。
Serving层通常以发布-订阅(Pub/Sub)模式工作,支持多策略、多交易标的的并行订阅。它不负责策略逻辑计算,也不负责订单路由,只专注于将正确的数据在正确的时间送达正确的消费者。
3.2 Serving层在量化交易链路中的位置
量化交易系统的典型数据流链路如下:
- 交易所行情网关 — 接收原始行情(Tick/Level2)
- 行情解码与校验层 — 协议解析、去重、时间戳校准
- 行情加工与聚合层 — K线合成、价差计算、指标衍生
- 行情存储层 — 历史行情数据库、快照存储
- Serving层 — 实时分发、订阅管理、协议转换
- 策略引擎 — 信号生成、订单管理
- 交易执行层 — 订单路由、风控检查、交易所对接
Serving层位于第5层,是数据从“加工完成”到“策略消费”的最后一公里。其性能直接决定了策略能否在毫秒甚至微秒级别响应市场变化。
3.3 Serving策略的核心目标
Serving策略的设计围绕三个核心目标展开:低延迟、高可用、一致性。这三个目标相互制约,需要在架构设计中做权衡。
| 目标 | 定义 | 关键指标 | 典型实现手段 |
|---|---|---|---|
| 低延迟 | 从行情数据到达Serving层到策略引擎收到数据的时间差 | P50 < 10μs, P99 < 50μs | 零拷贝、内存映射、无锁队列、内核旁路(DPDK) |
| 高可用 | Serving层在故障时仍能持续提供行情分发服务 | 可用性 ≥ 99.999%,故障切换 < 1s | 主备切换、多活部署、熔断降级、健康检查 |
| 一致性 | 同一行情数据在不同策略或不同节点间无差异 | 数据不丢、不重、不乱序 | 序列号校验、去重机制、有序分发、快照对齐 |
3.3.1 低延迟
低延迟是Serving层最核心的竞争力。在量化交易中,微秒级的延迟差异可能直接转化为盈亏。Serving层的延迟优化通常从以下维度展开:
- 数据路径优化:减少数据拷贝次数,使用共享内存或RDMA直接传输。
- 线程模型:采用Reactor模式或Busy-polling,避免上下文切换。
- 序列化/反序列化:使用FlatBuffers、Cap'n Proto等零拷贝序列化方案。
- 网络协议:基于UDP组播或TCP私有协议,减少协议栈开销。
实践建议:在Serving层设计中,优先优化P99延迟而非平均延迟。尾部延迟对策略的冲击远大于平均延迟波动。
3.3.2 高可用
Serving层一旦中断,所有依赖实时行情的策略将立即失效。高可用设计需要覆盖以下场景:
- 节点故障:主节点宕机后,备用节点在1秒内接管服务。
- 网络分区:多机房部署,避免单点网络故障影响全局。
- 流量突增:行情爆发时(如开盘、重大事件),Serving层需具备弹性扩缩能力。
- 数据源切换:交易所行情源切换时,Serving层需平滑过渡,不中断服务。
3.3.3 一致性
一致性保证所有策略在同一时间点看到相同的行情数据。在分布式Serving架构中,一致性面临以下挑战:
- 数据乱序:网络传输或多线程处理可能导致行情数据到达顺序与交易所产生顺序不一致。
- 数据重复:故障切换或重传机制可能导致同一笔行情被多次投递。
- 数据丢失:缓冲区溢出或网络丢包可能导致行情缺失。
一致性保障的常用策略:
| 问题 | 解决方案 | 实现方式 |
|---|---|---|
| 数据乱序 | 序列号排序 + 等待窗口 | 每个行情包携带交易所序列号,Serving层按序投递,乱序包暂存等待 |
| 数据重复 | 去重缓存 + 幂等投递 | 维护最近N个序列号的Bloom Filter或LRU缓存 |
| 数据丢失 | 快照对齐 + 增量补偿 | 定期发送全量快照,策略检测到序列号跳跃时请求增量补偿 |
注意:一致性保障会引入额外的延迟开销。在极低延迟场景下,需要根据策略容忍度做权衡。例如,高频做市策略可能更关注低延迟,允许少量乱序;而套利策略则对一致性要求更高。
3.4 三个目标的权衡关系
低延迟、高可用、一致性三者之间存在经典的CAP-like权衡:
- 低延迟 vs 高可用:高可用需要冗余和故障检测,这会增加数据路径的延迟。例如,主备切换需要心跳检测和状态同步。
- 低延迟 vs 一致性:严格一致性需要排序、去重、等待窗口,这些操作都会增加延迟。放松一致性要求可以换取更低的延迟。
- 高可用 vs 一致性:故障切换时,如果追求高可用快速切换,可能牺牲数据一致性(如丢包或重复)。
在实际Serving策略设计中,需要根据业务场景确定优先级:
| 业务场景 | 优先级排序 | 典型延迟预算 |
|---|---|---|
| 高频做市 | 低延迟 > 高可用 > 一致性 | < 5μs |
| 统计套利 | 一致性 > 低延迟 > 高可用 | < 100μs |
| 趋势跟踪 | 高可用 > 一致性 > 低延迟 | < 1ms |
架构原则:Serving层应提供可配置的延迟-一致性-可用性策略,允许不同策略根据自身需求选择不同的Serving通道或参数。灰度发布时,新版本Serving策略应先在低优先级策略上验证,再逐步推广到核心策略。