2017-09-06 2 views
0

Ich erhalte große Datenmengen (häufige kleine Nachrichten) von einem ITCH-Protokollserver.Schwer zu erklärende Verzögerung in TcpClient

Meine App funktioniert gut, in dem alle Nachrichten korrekt analysiert werden. Allerdings bekomme ich mysteriöse Verzögerungen, wenn (soweit ich das beurteilen kann) nichts passiert, außer dass der Code bei "ReadByte" eingestellt ist.

TcpClient simpleTcp = new TcpClient(serverAddress, serverPort); 
simpleTcp.NoDelay = true; 
simpleTcp.Client.NoDelay = true;     
simpleTcp.Client.ReceiveBufferSize = 1024; 
simpleTcp.ReceiveBufferSize = 1024; 
simpleTcp.ReceiveTimeout = 5000; 


NetworkStream tcpStream = simpleTcp.GetStream(); 

//Send login and subscciptions... 

while (true) 
{ 
    lock (TcpLock) 
    { 
     int abyte = tcpStream.ReadByte(); 
     try 
     { 
      LbTime.Stopwatch.Restart(); 
      Console.WriteLine("\n>>>>GetMessage Start: " + DateTime.UtcNow.ToString("HH:mm:ss.fff") + " " + LbTime.Stopwatch.ElapsedMilliseconds.ToString("F0")); 

      //Process message (Complex) 

      Console.WriteLine(">>>>GetMessage End: " + LbTime.Stopwatch.ElapsedMilliseconds.ToString("F0") + " Now: " + DateTime.UtcNow.ToString("HH:mm:ss.fff") + "\n"); 
     } 
     catch (Exception err) 
     { 
      throw; 
     } 
    } 
    } 

Ich zeige die Zeit am Anfang und am Ende der Verarbeitung. Allerdings, wenn ich eine spätere Nachricht bekomme - die Zeit unterscheidet sich stark von der Zeit in der empfangenen Nachricht begraben. I.e. Ich erhalte die Nachricht spät.

Ich habe das auf 2 Maschinen versucht, letzteres hatte nichts anderes darauf laufen, und ich bekomme manchmal noch mysteriöse Verzögerungen.

Ich kann Ihnen nicht helfen, da ich nicht in der Lage bin, ein funktionierendes Beispiel zu liefern, da es von der Verbindung mit einem privaten ITCH-Protokollserver abhängig ist.

Wenn jemand etwas Licht vergießen kann, wäre das toll.

+0

Wie spät ist "spät"? Daten müssen über ein Netzwerk übertragen werden, und auf der Sendeseite kann es aufgrund der Pufferung zu Verzögerungen kommen. –

+0

200+ ms. Dies ist auf einem xConnect sehr schnelle interne Verbindung – ManInMoon

+0

Okay, klingt wie es könnte Nagles Algorithmus mit Pufferung auf der sendenden Seite sein. Oder nur der Unterschied in Systemuhren - zwei Systemuhren im Abstand von 200ms sind sehr glaubwürdig. –

Antwort

0

Diese Verzögerung blieb mir unerklärlich. Mehrere Antworten auf ähnliche Fragen legen jedoch nahe, dass die Verwendung roher Sockets besser wäre.

Ich ersetze alle meine Stream und NetworkStreams mit Socket und jetzt funktioniert die Socket.Receive() ohne Ad-hoc-Verzögerungen.