定义
一条 TCP 或 WebSocket 连接,只有在交换过一次关闭之后才算被正常关闭。如果一个路由器、一跳 Wi-Fi、一条 VPN 或者远端服务器突然失效,那次交换就从未发生。本地的套接字保持打开,读操作只是阻塞,而在某件事强迫流量穿过那条死掉的路径之前,不会有任何错误被抛出来。
它在交易里为什么危险
- 一个冻住的价格和一条空的订单流,看起来像一个安静的市场,而那是屏幕能显示出来的最令人安心的图像。
- 头寸和在途委托可能已经不再被更新,所以显示停止反映这个账户。
- 连接标识仍然可以读作「已连接」,因为没有任何东西告诉过它相反的事。
检测
唯一可靠的信号都是基于时间的:必须按某个间隔到达的心跳,以及记下「距任何一帧到达已经过了多久」的看守程序。一个算例:最后一帧在 14:02:10 到达,而看守程序的阈值是 5 分钟;那么第一次警告可以在 14:07:10 发出,随后最多每分钟重复一次。一个安静的市场解释不了「连一次服务器 ping 都没有的五分钟」。
在 Senzoukria 里
承载行情数据的 ticker plant 有帧失效检测。对 PnL 和下单 plant 来说,一个看守程序记录每一帧收到的数据、包括服务器的 ping,并在读取器声称自己还活着、而五分钟里什么都没到达时记录一条警告。按设计它只记录:把它接进会话的健康状态里,会让任何一次误报都触发下单 plant 的重新登录,而有些自营商系统拒绝并发登录。连接诊断从另一侧处理同一个陷阱:当每一步都被接受、却没有任何一个 tick 到达时,它明确地把这件事说出来,而不是显示一张正常的图表。
常见错误
- 宁可相信一个「已连接」的标识,而不相信最后那笔成交的时间戳。
- 等一个半开套接字永远不会产生的错误消息。
- 一有沉默就自动重连,而那可能和「每个登录一个会话」的规则相撞。
相关内容
同一栏目
其他语言版本
常见问题
- 我怎么把一条死掉的数据流和一个安静的市场区分开?
- 看时间而不是看价格:最后一笔成交和最后一次更新是什么时候到的、同一条数据流上别的工具有没有在动,以及这个市场按排程是否应当开着。一个开着而且有流动性的市场,不会沉默好几分钟。
- 为什么不在数据一停就自动重连?
- 因为沉默有好几种原因,包括暂停交易和已收市的时段,而有些提供方对每个登录只允许一个会话。盲目重连可能结束一个正在工作的会话、或者被拒绝,这正是为什么把检测和动作分开。