行情订阅按品种分片,就是把不同交易品种的订阅流量切割到不同节点上处理,用水平扩展换单机性能瓶颈,这是目前中大型交易系统降低单节点负载最直接有效的方案。 核心思路不复杂:不再让一台机器扛住所有品种的行情推送,而是把压力拆开,让每台机器只关心自己负责的那部分品种。
行情订阅按品种分片,和轮询方式相比有哪些区别
很多团队早期做行情订阅,用的都是轮询或者广播,所有客户端连到同一组节点,服务端把全量行情广播给所有连接,这种模式在品种少、用户少的时候问题不大,但一旦品种多起来、订阅量大起来,单节点负载就会迅速攀升。
分片的核心不同在于责任边界,轮询模式下,每个节点都要处理所有品种的订阅和推送,没有分工,只能靠堆硬件硬扛,分片模式下,品种被明确划归到不同节点,比如原油、PTA这类能化品种归节点A管理,铜、铝这些有色品种归节点B管理,节点之间互不干扰。
行业共识认为,分片的优势主要体现在三个维度:
- 资源利用率高:每个节点只处理自己负责的品种集合,CPU和内存开销可控,不会出现某台机器因为一个热门品种瞬间被打满的情况。
- 故障半径小:一个节点挂了,受影响的用户范围被锁定在特定品种内,不会全市场瘫痪。
- 扩容成本低:行情品种增加或者用户量上涨,加一台机器、划分新的分片区间就行,不用改动现有架构。
轮询和分片的对比,用一个实际场景来说明更直观:
| 对比维度 | 轮询/广播模式 | 按品种分片 |
|---|---|---|
| 单节点负载 | 随品种数线性上升 | 仅与负责品种相关 |
| 故障影响面 | 全市场用户受影响 | 仅受影响品种用户 |
| 横向扩展方式 | 全量复制,成本高 | 按品种增量扩展 |
| 实现难度 | 低,适合小规模 | 中等,需做好路由设计 |
行情订阅按品种分片的核心设计思路
分片不是一个开关,改了配置就能跑,它需要从数据平面到控制平面做整体设计,这里拆开讲三层细节。
划分维度:用品种代码做哈希还是做区间
最常见的方式是用品种代码计算哈希值,然后映射到节点,代码可以选合约代码(rb2410)、品种缩写(RB)、或者更细的合约月份,哈希的好处是分布均匀,坏处是同一个品种家族的合约会被打散到不同节点,用区间划分则相反,把连续的品种代码分到一段,管理方便,但可能出现热点不均。
实际工程里,按品种缩写做哈希更实用,比如螺纹钢的 RB 系列合约全部落到节点A,热卷的 HC 系列落到节点B,这样同一个品种的深度行情、逐笔成交都留在同一个节点内,逻辑清晰,调试方便。
路由层设计:连接和订阅分开处理
分片之后,客户端不能随便连一个节点就订阅任何品种,路由层要承担连接网关和订阅分发两个职责,连接网关只管建立连接、维持心跳,不处理行情数据;订阅分发负责把订阅请求转发到目标分片节点,然后让分片节点直接向客户端推送数据。
这套设计的价值在于,客户端不需要关心后端有多少个节点,只需要知道网关地址即可,网关内部维护一份「品种到节点」的映射表,每次客户端发来订阅请求,网关根据品种代码查表,把请求转发到正确的节点。
节点的独立状态管理
每个分片节点内部,需要维护三份核心数据:
- 品种快照:当前负责品种的最新行情快照,包括买卖盘口、最新价、成交量。
- 订阅关系表:哪些客户端订阅了哪些品种,推送频率是多少。
- 待推送队列:行情变化时生成的增量消息,按客户端分别排队。
这三份数据都只存在于单个节点内部,不需要跨节点同步,这点非常重要,它意味着分片节点之间天然无共享状态,扩展性得到了质的提升。
行情订阅按品种分片的实现步骤与故障恢复
方案落地需要遵循一条明确的操作路径,以常见的期货行情系统为例,实施过程可以拆成以下几步。
第一步:盘点品种归属
把交易所提供的全部合约品种整理成一张清单,按照产业板块或者交易所规则进行分组,分组的原则是相关性高、热度均衡,例如能化板块放一组,黑色系一组,有色一组,农产品一组,金融期货一组,每组的品种数量不需要完全一样,但预计订阅热度总和要相对均衡。
第二步:搭建订阅网关
网关层推荐用无状态设计,多个网关实例前置在负载均衡后面,网关与分片节点之间建立长连接池,订阅请求从网关进来后,网关根据映射表把请求转发给下游节点,这里的映射表要支持动态更新,以便后续扩缩容。
第三步:配置静态路由表
把「品种分组到节点」的映射关系做成配置文件,分发给所有网关。
- 能化组,节点地址 10.0.1.11:7001
- 黑色组,节点地址 10.0.1.12:7001
- 有色组,节点地址 10.0.1.13:7001
第四步:建立故障转移流程
节点挂掉后的恢复流程是分片方案里最容易出问题的地方,合理的做法是让网关在检测到节点心跳超时后,将该节点负责的品种区间临时转移到备用节点,同时推送一条「订阅迁移通知」给受影响的客户端,客户端收到通知后,重新走一遍订阅流程,连接到新的备用节点上。
这里的关键是,备用节点需要提前加载好所有品种的快照数据,这意味着每个分片节点除了同步全量行情之外,还要把快照数据定期同步到备用节点。
第五步:动态扩缩容
新增节点时,网关需要将原节点的一部分品种迁移出去,流程是先让新节点加载这部分品种的快照,再更新路由表,等新节点运行稳定后,再让旧节点释放这部分品种的订阅连接,整个过程中,行情推送不能中断,所以需要一个过渡期,即新旧节点同时发送一段时间,等客户端全部切到新节点后再停止旧节点的推送。
行情订阅按品种分片在实盘交易场景中的落地成本与价值
不少团队会问:这套方案到底值不值得做?答案取决于你的用户规模和场景复杂度。
如果是校内模拟交易系统,几十个用户连一台机器绰绰有余,做分片纯属多余,按用户量轮询就够了,但面向真实市场的交易系统,例如互联网券商柜台、量化私募的内部行情源,或者是上海、深圳两地的期货公司极速交易柜台,并发连接数动辄上万,每秒行情推送量达到数万笔,这时候单节点无论怎么调优都很难支撑,分片几乎是必选项。
说到落地成本,主要花在三个地方:
- 开发成本:网关层加路由逻辑、节点层改状态管理模式、故障转移流程要重写,整体工作量在两个开发周左右。
- 机器资源:分片以后每台机器的负载降下来了,但机器数量上去了,好在可以用性能普通的云主机替代高端物理机,综合算下来总服务器成本基本持平,但瓶颈上限扩展了好几倍。
- 维护成本:多节点的监控、日志、告警体系需要跟上,否则排障时会比较痛苦。
从投入产出比看,这套方案值得投入的一个核心信号是:你发现单节点的 CPU 使用率长期在 70% 以上,或者行情高峰期出现推送延迟超过 100 毫秒的情况,这是单节点逼近极限的典型症状。
行情订阅按品种分片后的常见故障转移流程
Q1:行情订阅按品种分片后,节点宕机是否会中断已建立的连接?
会短暂中断,但影响面被控制在本节点负责的品种范围内,网关检测到节点心跳超时后,会在秒级完成路由切换,将订阅该品种的客户端重定向到备用节点,客户端需要实现断线重连和重新订阅的逻辑,建议将订阅请求设计为幂等操作,即重复发送相同订阅不会产生副作用。
Q2:用户同时订阅多个品种,但这些品种落在了不同节点,怎么做?
网关会把每个品种的订阅请求分别转发到对应节点,客户端收到的行情来自多个分片节点,这对客户端是透明的,因为所有行情数据都从网关的下行通道汇聚后推送,或者由分片节点直接发送给客户端,需要注意的是,客户端在业务层最好按品种维护独立的行情回调状态,避免因为某个品种的延迟影响整体逻辑。
Q3:行情订阅按品种分片和按用户ID分片相比,各自的适用场景是什么?
按用户ID分片适合低频交易场景,因为一个用户的所有数据落在同一节点,查询和推送都在节点内完成,按品种分片适合高频全量行情场景,因为行情数据是共享的,不同用户看的是同一份快照,按品种分片避免了同一份数据在每个节点各自维护一份带来的冗余开销和一致性成本,期货、期权这类多合约的衍生品交易系统,业内普遍采用按品种分片的方案。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/632618.html





