行情繁忙时,如果交易屏幕上的订单簿卡住或跳变,问题通常出在行情数据源上:它在接入时丢了更新,把订单簿拼错了,或者发往数百块屏幕的速度太慢。先测量你最忙的那一小时,再用那一天的录制数据测试每一家公司。
如果在行情繁忙时,你交易屏幕上的订单簿卡住、跳变,或者显示出不可能的价格,故障通常出在三个地方之一:更新在交易所行情接入的地方丢失,订单簿拼装出错,或者订单簿送到数百块屏幕上的速度太慢。在聘用任何人之前,先测量你最忙的那一小时,然后用那一天的录制数据去测试你考虑的每一家公司。
简短的答案:交易所给它发出的每一条更新都编了号。构建良好的系统会立刻发现缺失的编号,把订单簿标记为已过时,然后重建。麻烦始于缺口没被发现、重建要花好几秒,或者一条慢连接拖住了所有交易员。把你最忙那一天的行情录下来,把对它的回放当作每家公司都必须通过的测试:买产品之前要测,请团队为你开发时,也要把它作为第一阶段的验收标准。
它出现在最忙的时刻,比如央行发布公告或者开盘时。屏幕上的订单簿停住一两秒,然后跳变。已经撤销的订单仍然显示着。有时买方的最高出价高于卖方的最低要价,这叫作交叉订单簿(crossed book)。在单一交易所里,除了开盘和收盘集合竞价之外,这样的订单会立即撮合成交。所以,如果你的屏幕上某一家交易所的订单簿出现交叉,就说明你那份订单簿副本是错的。
接着,客服会收到两位交易员发来的截图:同一个品种,他们看到的订单簿却不一样。又或者,有交易员对某笔订单的成交价提出异议,因为屏幕上显示的是另一个价格。
交易所的订单簿行情是一连串细小的变动:新增一笔订单、撤销一笔订单、发生一笔成交。你的系统从订单簿的一份完整副本(称为快照)出发,按顺序应用这些变动。每个变动都有编号,所以缺了哪一个能被发现。Nasdaq 在其 TotalView-ITCH 5.0 行情的规范中说,这条行情“由一系列带序号的消息组成”,也就是按顺序编了号。
行情繁忙时,变动的流量急剧上升。有些在路上或在你自己的服务器内部丢失,有些到达的顺序被打乱。如果系统没发现缺口,它就会把收到的东西照单全收,显示一份已经和交易所对不上的订单簿。如果它发现了缺口,却要花好几秒才能恢复,屏幕就会停住不动。
交易所默认客户会丢更新。CME Group 在其 MDP 3.0 行情的文档中说,出现缺口之后,“应当假定客户端系统中维护的所有订单簿都可能不再处于正确的最新状态”。
一共三处,每一处都需要各自的修复方法。工程师把第三处称为扇出(fan-out),因为一条更新流会像扇子一样展开,分发到许多屏幕上。上面链接的那篇技术文章详细讲了这三处。
第一处是接入环节,也就是交易所行情到达的地方。有些交易所提供了找回丢失数据的办法。Nasdaq 的传输协议之一 MoldUDP64,能让接收方“发现并重新请求丢失的数据包”。CME 把同一条数据流分别通过名为 A 和 B 的两条线路各发一次,并另外运行一条快照行情,用来把订单簿更新到最新状态。如果你的系统发现不了缺口,这些都无济于事。
接下来是拼装订单簿,这里的风险在于一个变动被应用两次、顺序错乱,或者被应用到错误的快照上。加密货币交易所 Binance 在它的指南里列出了把快照与实时数据流衔接起来的确切步骤。不按这些步骤构建的订单簿照样显示价格,看上去也没问题,但价格是错的。
最后是扇出:订单簿被发送给数百个交易员会话,每块已连接的屏幕对应一个会话。用着不稳定移动网络的交易员,或者一台已经卡住的终端,读取更新的速度都很慢。如果服务器等着这个会话,其他所有会话也都得跟着等。放任这个会话积压的更新无限增长也好不到哪里去,因为服务器会耗尽内存,让所有人一起宕掉。
在构建良好的系统里,服务器只对更新排一次序,然后把同样的结果发给每一个会话。落后的会话要么直接拿到订单簿的最新画面、跳过中间的步骤,要么被服务器断开并告知原因,屏幕随后重新连接,拿到一份新的副本。一条行情可能同时在不止一个地方出问题。
取过去一个月里最忙的那一小时,收集它的以下数字:
然后把一个繁忙日子的原始行情原样录下来,连同每个数据包到达的时间。按真实速度和更快的速度回放这份录制数据,就是你给名单上每家公司出的测试,每次修复之后也要重做一遍。
接收交易所行情并维护订单簿的软件,叫作行情处理器(feed handler)。你有三条路可选,你的测量结果应该指向其中一条。后两条可以结合起来。
如果测量结果指向一个明确的故障,比如缺口没被发现或者重建太慢,而且熟悉这套代码的人还在,那就修好你现有的行情处理器。
现成的行情处理器是一款授权使用的软件:它接入交易所,发现缺口,把一份正确、最新的订单簿交给你的系统。托管行情服务更进一步:由行情数据供应商去接入各家交易所,你只从它那里接收一条统一格式的数据流。
如果接入环节运转正常,问题却依然存在,那就重建向交易员发送数据的那一层。表现是:交易员仍然看到不同的订单簿,一个慢会话拖累其余所有会话,或者你计划服务的会话数量要比现在多得多。
让你名单上的每一家公司都接受同样的五项测试:
amBrain 构建算法交易基础设施:订单执行、行情数据和交易前风控。
amBrain 网站上有一句话:“交易终端开发、订单管理系统和 FIX 协议交易所对接。”
amBrain 诊断交易和广告技术领域的慢系统:对运行中的平台做端到端测量,报告会指明时间耗在了哪里。
amBrain 自 2019 年起开发软件。它用一句话描述自己的团队:“团队规模最多 40 人,其中约 75% 是资深人员。”它有三种合作方式:整体交付、专属团队,或工程师嵌入你的团队。客户拥有产品与代码的全部所有权,amBrain 的可复用组件除外。
本文不是案例研究,也不描述任何客户项目。本文没有引用 amBrain 所建任何系统的延迟数字,也不给出任何价格或工期。
如果 amBrain 在你的候选名单上,就向它提出与其他每家公司同样的五个问题,并把你的录制数据作为你们约定的任何工作的验收标准。
带上您当前的架构和让您担心的故障场景,我们用半小时一起梳理。