字号
三个不同的问题
序列号、事件时间戳和接收时间戳描述不同性质。源序列可能规定某个通道中的顺序;事件时间戳由源端赋值;接收时间戳记录消费者何时观察到消息。具体含义需要由数据源规范定义。
明确排序的作用范围
序列号可能属于某个连接、分区、通道或标的。在不同作用范围之间,更大的序列号未必表示更晚。使用序列号检测缺口或重建状态前,应先明确其作用范围。
排序无法替代语义
传输延迟或重放可能使接收顺序不同于源事件顺序。时间戳精度相同或来自不同时钟时,按事件时间排序也可能不合适。确定性的排序不自动等于正确的重建。
三条消息的示例
考虑同一对象的 SET 消息:序列 1 将数量设为 10,序列 2 设为 4,序列 3 设为 7。契约规定单一序列范围和覆盖语义,每次 SET 替换上一数量。
按源序列重放最终为 7,按接收顺序 1、3、2 重放最终为 4。两种程序都可以是确定性的,但只有前者遵循本例契约。其他协议可能需要不同处理,因此不能据此给所有行情按名为 sequence 的字段排序。
运行公开实验一个可复现的实验
Aurora Lab 公开示例使用三条合成消息,其中一条更新延迟到达。比较按源序列与按接收顺序重放的结果;最终值的差异说明重建需要明确的顺序契约。
记录契约
记录时间戳单位、时钟域、序列范围、重复消息处理及恢复程序。在标准化表示之外保留原始字段。本例关注数据完整性,不涉及价格预测或交易执行。
恢复也是模型的一部分
实际处理器需要明确应对重复、缺口和会话重置。根据协议,可能需要缓冲、请求恢复、加载快照或将状态标记为不可用。重新排列已经到达的消息,并非通用恢复程序。
记录状态何时恢复可信,以及哪些证据支持恢复。在标准化记录之外保留原始字段。下游消费者应能区分不完整状态与有效状态,无需重新检查全部事件历史。