Medição de Latência
S# mede a latência de registo e cancelamento de ordens através do LatencyManager. O gestor determina quanto tempo passa entre o envio de uma ordem e a recepção da confirmação da bolsa.
Interface ILatencyManager
A interface ILatencyManager define o contrato base:
- LatencyRegistration — latência total de registo em todas as ordens (TimeSpan).
- LatencyCancellation — latência total de cancelamento em todas as ordens (TimeSpan).
- Reset() — repõe o estado do gestor.
- ProcessMessage(Message) — processa uma mensagem; devolve a latência para a operação indicada ou
null.
Como Funciona
O gestor de latência opera segundo o princípio "pedido-resposta":
1. Registo de Ordem
Quando é recebida uma OrderRegisterMessage, o gestor guarda o par (TransactionId, LocalTime) — o momento em que a ordem foi enviada.
2. Cancelamento de Ordem
Quando é recebida uma OrderCancelMessage, o gestor guarda o par (TransactionId, LocalTime) — o momento em que o cancelamento foi enviado.
3. Substituição de Ordem
Quando é recebida uma OrderReplaceMessage, o gestor regista simultaneamente um cancelamento (da ordem antiga) e um registo (da nova ordem).
4. Confirmação
Quando é recebida uma ExecutionMessage com informação de ordem (não no estado Pending e não Failed), o gestor calcula a latência:
Latency = ExecutionMessage.LocalTime - StoredLocalTime
O resultado é adicionado a LatencyRegistration ou LatencyCancellation, dependendo do tipo de operação.
Estado: ILatencyManagerState
A interface ILatencyManagerState armazena o estado interno do gestor:
- Registos pendentes:
AddRegistration(transactionId, localTime)/TryGetAndRemoveRegistration(transactionId, out localTime) - Cancelamentos pendentes:
AddCancellation(transactionId, localTime)/TryGetAndRemoveCancellation(transactionId, out localTime) - Latências acumuladas:
LatencyRegistration,LatencyCancellation - Métodos de adição:
AddLatencyRegistration(TimeSpan),AddLatencyCancellation(TimeSpan)
A implementação predefinida é LatencyManagerState.
Tratamento de Erros
Se uma ordem falhar (OrderState == Failed), a latência não é contabilizada — o registo é simplesmente removido do armazenamento de estado.
Integração via Adaptador
A classe LatencyMessageAdapter envolve um adaptador interno e mede automaticamente a latência de todas as operações de ordens.
Integração com Estratégia
A estratégia (Strategy) expõe a propriedade Latency para acompanhar a latência.
Exemplo de Utilização
// Criar um gestor com um armazenamento de estado
var manager = new LatencyManager(new LatencyManagerState());
// Processar registo de ordem (guardar a hora de envio)
manager.ProcessMessage(orderRegisterMsg);
// Processar confirmação (calcular latência)
TimeSpan? latency = manager.ProcessMessage(executionMsg);
if (latency != null)
{
Console.WriteLine($"Latency: {latency.Value.TotalMilliseconds} ms");
}
// Latências totais
Console.WriteLine($"Registration latency: {manager.LatencyRegistration.TotalMilliseconds} ms");
Console.WriteLine($"Cancellation latency: {manager.LatencyCancellation.TotalMilliseconds} ms");
Repor o Estado
O método Reset() limpa todos os registos pendentes e repõe as latências acumuladas a zero:
manager.Reset();