延迟测量

S# 通过 LatencyManager 测量订单注册和取消的延迟。该管理器确定从发送订单到收到交易所确认所经过的时间。

ILatencyManager 接口

ILatencyManager 接口定义了基础契约:

  • LatencyRegistration — 所有订单的总注册延迟时间 (TimeSpan)。
  • 延迟取消 — 所有订单的总取消延迟(时间跨度)。
  • Reset() — 重置管理器的状态。
  • ProcessMessage(Message) — 处理一条消息;返回给定操作的延迟或 null

运作方式

延迟管理器按照“请求-响应”原则运行:

1. 订单注册

当收到 OrderRegisterMessage 时,管理者会保存这对 (TransactionId, LocalTime) —— 即订单发送的时刻。

2. 订单取消

当收到 OrderCancelMessage 时,管理器会保存这一对 (TransactionId, LocalTime) —— 即取消发送的时刻。

3. 订购替换

当收到一个 OrderReplaceMessage 时,管理器会同时登记一个取消(旧订单的)和一个注册(新订单的)。

4. 确认

当收到包含订单信息的 ExecutionMessage(不处于 Pending 状态且不为 Failed)时,管理器会计算延迟:

Latency = ExecutionMessage.LocalTime - StoredLocalTime

结果根据操作类型被加到LatencyRegistrationLatencyCancellation

状态:ILatencyManagerState

ILatencyManagerState 接口存储管理器的内部状态:

  • 待处理的注册:AddRegistration(transactionId, localTime) / TryGetAndRemoveRegistration(transactionId, out localTime)
  • 待取消的订单:AddCancellation(transactionId, localTime) / TryGetAndRemoveCancellation(transactionId, out localTime)
  • 累计延迟:LatencyRegistration, LatencyCancellation
  • 添加方法:AddLatencyRegistration(TimeSpan)AddLatencyCancellation(TimeSpan)

默认实现是 LatencyManagerState

错误处理

如果一个订单失败(OrderState == Failed),延迟不会被计算——该记录会被直接从状态存储中移除。

通过适配器进行集成

LatencyMessageAdapter 类封装了一个内部适配器,并自动测量所有订单操作的延迟。

与战略的整合

该策略 (Strategy) 公开了 Latency 属性以跟踪延迟。

使用示例

// 创建带状态存储的管理器
var manager = new LatencyManager(new LatencyManagerState());

// 处理订单注册(保存发送时间)
manager.ProcessMessage(orderRegisterMsg);

// 处理确认(计算延迟)
TimeSpan? latency = manager.ProcessMessage(executionMsg);
if (latency != null)
{
    Console.WriteLine($"Latency: {latency.Value.TotalMilliseconds} ms");
}

// 总延迟
Console.WriteLine($"Registration latency: {manager.LatencyRegistration.TotalMilliseconds} ms");
Console.WriteLine($"Cancellation latency: {manager.LatencyCancellation.TotalMilliseconds} ms");

重置状态

Reset() 方法清除所有待处理记录并将累计延迟重置为零:

manager.Reset();