Latenzmessung
S# misst die Latenz der Orderregistrierung und Orderstornierung über den LatencyManager. Der Manager bestimmt, wie viel Zeit zwischen dem Senden einer Order und dem Empfang der Bestätigung von der Börse vergeht.
Interface ILatencyManager
Das Interface ILatencyManager definiert den Basiskontrakt:
- LatencyRegistration - gesamte Registrierungslatenz über alle Orders (TimeSpan).
- LatencyCancellation - gesamte Stornierungslatenz über alle Orders (TimeSpan).
- Reset() - setzt den Zustand des Managers zurück.
- ProcessMessage(Message) - verarbeitet eine Nachricht; gibt die Latenz für die angegebene Operation oder
nullzurück.
Funktionsweise
Der Latenzmanager arbeitet nach dem Request-Response-Prinzip:
1. Orderregistrierung
Wenn eine OrderRegisterMessage empfangen wird, speichert der Manager das Paar (TransactionId, LocalTime) - den Zeitpunkt, zu dem die Order gesendet wurde.
2. Orderstornierung
Wenn eine OrderCancelMessage empfangen wird, speichert der Manager das Paar (TransactionId, LocalTime) - den Zeitpunkt, zu dem die Stornierung gesendet wurde.
3. Orderersetzung
Wenn eine OrderReplaceMessage empfangen wird, registriert der Manager gleichzeitig sowohl eine Stornierung (der alten Order) als auch eine Registrierung (der neuen Order).
4. Bestätigung
Wenn eine ExecutionMessage mit Orderinformationen empfangen wird (nicht im Zustand Pending und nicht Failed), berechnet der Manager die Latenz:
Latency = ExecutionMessage.LocalTime - StoredLocalTime
Das Ergebnis wird je nach Operationstyp zu LatencyRegistration oder LatencyCancellation addiert.
Zustand: ILatencyManagerState
Das Interface ILatencyManagerState speichert den internen Zustand des Managers:
- Ausstehende Registrierungen:
AddRegistration(transactionId, localTime)/TryGetAndRemoveRegistration(transactionId, out localTime) - Ausstehende Stornierungen:
AddCancellation(transactionId, localTime)/TryGetAndRemoveCancellation(transactionId, out localTime) - Akkumulierte Latenzen:
LatencyRegistration,LatencyCancellation - Methoden zum Hinzufügen:
AddLatencyRegistration(TimeSpan),AddLatencyCancellation(TimeSpan)
Die Standardimplementierung ist LatencyManagerState.
Fehlerbehandlung
Wenn eine Order fehlschlägt (OrderState == Failed), wird die Latenz nicht gezählt - der Eintrag wird lediglich aus dem Zustandsspeicher entfernt.
Integration über Adapter
Die Klasse LatencyMessageAdapter umschließt einen inneren Adapter und misst automatisch die Latenz für alle Orderoperationen.
Integration mit Strategy
Die Strategie (Strategy) stellt die Eigenschaft Latency zur Verfolgung der Latenz bereit.
Verwendungsbeispiel
// Manager mit Zustandsspeicher erstellen
var manager = new LatencyManager(new LatencyManagerState());
// Orderregistrierung verarbeiten (Sendezeit speichern)
manager.ProcessMessage(orderRegisterMsg);
// Bestätigung verarbeiten (Latenz berechnen)
TimeSpan? latency = manager.ProcessMessage(executionMsg);
if (latency != null)
{
Console.WriteLine($"Latency: {latency.Value.TotalMilliseconds} ms");
}
// Gesamtlatenzen
Console.WriteLine($"Registration latency: {manager.LatencyRegistration.TotalMilliseconds} ms");
Console.WriteLine($"Cancellation latency: {manager.LatencyCancellation.TotalMilliseconds} ms");
Zustand zurücksetzen
Die Methode Reset() löscht alle ausstehenden Einträge und setzt akkumulierte Latenzen auf null zurück:
manager.Reset();