ISO/IEC 25390:2025 — 金融信息交换(FIX)简单二进制编码(SBE)

面向低延迟金融交易系统的高性能二进制线路格式标准

1. 简单二进制编码(SBE)概述

ISO/IEC 25390:2025 定义了简单二进制编码(Simple Binary Encoding, SBE)——一种由 FIX 交易社区最初为高性能金融交易系统开发的二进制线路格式。与使用人类可读文本的传统 FIX 标签-值编码不同,SBE 使用原生二进制数据类型,实现了大幅降低的延迟和更高的吞吐量。该标准通过 ISO/IEC JTC 1 PAS(可公开获取规范)程序被采纳,成为金融消息处理的官方国际标准。

对于构建电子交易系统的工程师,SBE 代表了线路格式效率的最先进水平。编码开销降至接近零——字段以原生二进制类型放置在固定位置,无需内存分配即可实现亚微秒级的解码。当每一微秒的延迟直接影响交易盈利能力时,这一点至关重要。

SBE 围绕以下几个关键原则进行设计:

  • 直接数据访问——固定位置和固定长度字段实现了随机访问,无需顺序解析
  • 原生二进制类型——无需在文本和二进制之间转换;数据以其自然格式存储
  • 带外元数据——消息模式(XML)与线路数据分开交换
  • 固定长度优先——支持变长字段和重复组,但尽量减少使用
特性 FIX 标签-值(传统) FIX SBE(ISO 25390)
编码方式 ASCII文本(如”35=D|55=IBM|54=1|…”) 二进制(字段位于已知字节偏移量)
解析模型 顺序扫描查找标签号 按偏移量直接内存访问
内存分配 每个字段的字符串分配 可实现零分配解码
解码延迟 微秒到毫秒级 亚微秒级(通常小于100纳秒)
模式定义 隐式(注释/文档中的字段定义) 显式XML模式(XSD)
线路大小 大(冗余文本) 紧凑(原生二进制大小+最小帧头)
版本管理 新增标签;废弃旧标签 带有向后兼容性的模式版本控制
关键的工程见解:标签-值和 SBE 之间 4-5 个数量级的延迟差异不仅仅在于二进制与文本。关键是固定字段位置的设计决策。标签-值需要扫描整个消息以找到特定标签;SBE 允许在已知偏移量处直接内存访问。

2. 线路格式与消息结构

2.1 字段编码

SBE 支持一组全面的数据类型,映射到原生二进制表示:

FIX 数据类型 SBE 编码 原始类型 说明
int 整数 int8/int16/int32/int64 可配置字节序(小端/大端)
Price/Amt 十进制 复合类型(指数+尾数) 可配置精度的定点数
Qty 整数或十进制 按指定类型 范围属性约束有效值
String 变长字符串 长度前缀+字符数据 长度字段位于数据之前
Char 定长字符数组 字节数组(无长度前缀) 用于定宽字段
Float 浮点数 float/float64 IEEE 754,支持空值
UTCTimestamp 日期/时间编码 基于纪元(可配置单位) 可达纳秒精度
MultipleValueValue 多值选择 位集合 高效的标志编码
Boolean 枚举 uint8 或类似类型 映射为二值枚举

2.2 消息帧与结构

每个 SBE 消息由三部分组成:一个帧头(由会话协议提供,如简单开放帧头)、一个 SBE 消息编码头(包含模式ID、模板ID、模式版本、块长度、重复组和变长字段计数)以及消息体。消息体是一个平坦的字段序列,可选地后跟重复组和变长数据。

一个常见的实现陷阱:字节序属性适用于消息模板内的所有字段,默认为小端序。在同一会话中混合使用不同字节序的模板需要仔细注意。为了最大的可移植性,多供应商环境建议使用网络字节序(大端序)。

2.3 重复组

SBE 支持条目大小固定的重复组,每个条目具有已知的块长度。组可以嵌套,支持分层数据结构。空组(numInGroup = 0)非常紧凑——它们完全省略了组数据。

3. 消息模式与扩展机制

SBE 消息模式以符合标准中定义的 XSD 模式的 XML 文档表示。模式定义了数据编码、消息模板和重复组结构。该标准的版本控制和扩展机制(第8章)尤为精巧——可以在新版本的模式中向消息添加字段,而不会破坏旧版本的解码器。

设计 SBE 模式时,遵循”先扩大再追加”的原则。如果某个字段将来可能需要更大的类型,从第一天起就将其定义为更大的类型。模式演进可以添加新字段,但不能更改现有字段类型而不破坏兼容性。

4. 常见问题解答

问1:SBE 是否仅限于 FIX 协议消息?
不。虽然 SBE 起源于 FIX 交易社区,但标准明确指出 SBE 是 FIX 消息的可能语法之一,但不限于 FIX 消息。SBE 可用于需要高性能二进制编码的任何应用。
问2:SBE 与 Protocol Buffers 或 FlatBuffers 相比如何?
SBE 在概念上最接近 FlatBuffers——两者都偏好固定位置以实现直接访问。然而,SBE 的设计更专门针对金融消息处理,原生支持十进制类型和 FIX 特定语义。
问3:简单开放帧头的作用是什么?
简单开放帧头在传输层提供消息边界。它由一个64位消息长度字段组成,并且与 SBE 消息编码分开定义,以允许会话协议选择的灵活性。
问4:SBE 能否用于多播或 RDMA?
可以。SBE 与传输无关。它通常用于 TCP、多播(用于市场数据分发)和 RDMA(远程直接内存访问)以实现最低延迟。固定位置设计对于 RDMA 特别有利。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注