Medición de latencia
S# mide la latencia de registro y cancelación de órdenes mediante LatencyManager. El administrador determina cuánto tiempo pasa entre el envío de una orden y la recepción de la confirmación del exchange.
Interfaz ILatencyManager
La interfaz ILatencyManager define el contrato base:
- LatencyRegistration — latencia total de registro en todas las órdenes (TimeSpan).
- LatencyCancellation — latencia total de cancelación en todas las órdenes (TimeSpan).
- Reset() — restablece el estado del administrador.
- ProcessMessage(Message) — procesa un mensaje; devuelve la latencia de la operación dada o
null.
Cómo funciona
El administrador de latencia funciona según el principio "solicitud-respuesta":
1. Registro de orden
Cuando se recibe un OrderRegisterMessage, el administrador guarda el par (TransactionId, LocalTime): el momento en que se envió la orden.
2. Cancelación de orden
Cuando se recibe un OrderCancelMessage, el administrador guarda el par (TransactionId, LocalTime): el momento en que se envió la cancelación.
3. Reemplazo de orden
Cuando se recibe un OrderReplaceMessage, el administrador registra simultáneamente una cancelación (de la orden antigua) y un registro (de la nueva orden).
4. Confirmación
Cuando se recibe un ExecutionMessage con información de orden (no en estado Pending y no Failed), el administrador calcula la latencia:
Latency = ExecutionMessage.LocalTime - StoredLocalTime
El resultado se agrega a LatencyRegistration o LatencyCancellation según el tipo de operación.
Estado: ILatencyManagerState
La interfaz ILatencyManagerState almacena el estado interno del administrador:
- Registros pendientes:
AddRegistration(transactionId, localTime)/TryGetAndRemoveRegistration(transactionId, out localTime) - Cancelaciones pendientes:
AddCancellation(transactionId, localTime)/TryGetAndRemoveCancellation(transactionId, out localTime) - Latencias acumuladas:
LatencyRegistration,LatencyCancellation - Métodos de adición:
AddLatencyRegistration(TimeSpan),AddLatencyCancellation(TimeSpan)
La implementación predeterminada es LatencyManagerState.
Manejo de errores
Si una orden falla (OrderState == Failed), la latencia no se contabiliza: el registro simplemente se elimina del almacén de estado.
Integración mediante adaptador
La clase LatencyMessageAdapter envuelve un adaptador interno y mide automáticamente la latencia de todas las operaciones con órdenes.
Integración con Strategy
La estrategia (Strategy) expone la propiedad Latency para realizar seguimiento de la latencia.
Ejemplo de uso
// Creación de un administrador con un almacén de estado
var manager = new LatencyManager(new LatencyManagerState());
// Procesamiento del registro de orden (guardar la hora de envío)
manager.ProcessMessage(orderRegisterMsg);
// Procesamiento de la confirmación (cálculo de latencia)
TimeSpan? latency = manager.ProcessMessage(executionMsg);
if (latency != null)
{
Console.WriteLine($"Latencia: {latency.Value.TotalMilliseconds} ms");
}
// Latencias totales
Console.WriteLine($"Latencia de registro: {manager.LatencyRegistration.TotalMilliseconds} ms");
Console.WriteLine($"Latencia de cancelación: {manager.LatencyCancellation.TotalMilliseconds} ms");
Restablecimiento del estado
El método Reset() borra todos los registros pendientes y restablece las latencias acumuladas a cero:
manager.Reset();