webentwicklung-frage-antwort-db.com.de

Best Practice zur Implementierung eines Live-Finanzdatenfeeds mit geringer Latenz mithilfe von WCF?

Ich habe einen .NET-Dienst, der Live-Finanzdaten an seine Kunden weiterleiten muss. Die Ausgaberate für diesen Feed wird möglicherweise sehr hoch und ich suche nach der besten Architektur, um diese Art von Service mit geringer Latenz und hoher Leistung zu implementieren.

Ich habe überlegt, einen Stream-Datenprovider zu verwenden, der für Audio oder Video verwendet wird, aber stattdessen Feed-Updates sendet.

Würde mich über jeden Gedanken zu diesem Thema oder über Beispiele aus der Praxis freuen

Update:

Ich muss kein WCF verwenden, das war nur mein erster Ansatz, da es sich um die aktuelle Technologie handelt. Jede andere Implementierung in C # ist willkommen.

34
Sol

Vollständige Offenlegung: Ich arbeite für Informatica (früher 29West) und bin im Engineering-Team für ihre Messaging-Produkte verantwortlich. Ich bin befangen. Ich habe jedoch ein ziemlich gutes Verständnis von Nachrichten mit geringer Latenz auf dem Finanzmarkt.

Wenn Ihre Nachrichtenrate etwa 60 Nachrichten pro Sekunde beträgt. (wie in einem Kommentar zu Will Deans Antwort angegeben), und sie werden an eine grafische Benutzeroberfläche geliefert, bei der ein Mensch davor sitzt und mit rasender Geschwindigkeit auf den Markt reagiert. Es spielt eigentlich keine Rolle, welche Software Sie verwenden aus Latenzsicht. Sie könnten sogar mit WCF zurechtkommen (obwohl ich trotzdem immer noch empfehlen würde, wir haben einmal darüber nachgedacht, einen Adapter dafür zu prototypisieren und Latenzen um eine Größenordnung aufzublähen - wir beschlossen, uns nicht darum zu kümmern damals).

Nun kann die Nachrichtensoftware von Informatica can in einer Mikrosekunde zwischen Prozessen auf derselben Maschine weiterleiten. Wenn Sie Nizza 10-Gigabit-Netzwerkkarten mit Kernel-Bypass oder InfiniBand-Ausrüstung kaufen möchten, können Sie Millionen von Nachrichten pro Sekunde zwischen Maschinen mit einstelligen Mikrosekunden Latenzzeit. In Kürze werden wir auch eine neue Datenserialisierungsbibliothek veröffentlichen, die in C/C++, Java und .NET als Teil des Messaging-Produkts unterstützt wird und in manchen Fällen tatsächlich schneller ist als Protocol Buffers (obwohl Protocol Buffers häufig verwendet werden und auch ein sehr gute Wahl). Unsere .NET- und Java-APIs haben beide eine Funktion namens "ZOD" für "Zero Object Delivery". Dies ist eine komische Art zu sagen, dass sie während der Nachrichtenübermittlung keine neuen Objekte generieren. Dies bedeutet, dass keine Speicherbereinigungspausen und zugehörige Latenzspitzen/Ausreißer auftreten. Wir haben ein anderes Produkt namens UMDS, das speziell dafür entwickelt wurde, den Hochgeschwindigkeits-Backbone-Verkehr für langsamere Desktop-Apps zu nutzen, ohne das Backbone oder andere Clients zu verlangsamen.

Ich könnte immer wieder darüber reden, wie großartig die Messaging-Software von Informatica ist, und ich denke, es lohnt sich, es auszuprobieren, aber dies sieht bereits aus wie eine direkte Anzeige, und ich bin ein Ingenieur und kein Verkäufer. Hier ein paar allgemeinere Ratschläge:

  • Wenn Sie über viele Clients verfügen, die dieselben Daten erhalten, möchten Sie UDP-Multicast verwenden. Sie wünschen sich oft einen zuverlässigen Multicast-Transport. Das bekannte (und kostenlose) zuverlässige Multicast-Protokoll ist PGM. Windows enthält eine Implementierung von PGM, die in C # verwendet werden kann. Ich verweise Sie auf Mike Rettigs exzellenten Blogbeitrag , wie Sie ihn verwenden können, wenn Sie ihn ausprobieren möchten. (Ich kenne Mike zufällig - er ist ein kluger Kerl.) Protokollwahl ist ein Bereich, in dem Sie bekommen, wofür Sie bezahlen. Das Messaging von Informatica umfasst ein zuverlässiges Multicast-Protokoll, das lose auf PGM basiert (unser Architekt, der es entworfen hat, hat den PGM-RFC vor langer Zeit mitgeschrieben), jedoch mit vielen wesentlichen Verbesserungen. Einfaches PGM ist jedoch für das, was Sie brauchen, in Ordnung.

  • Sie möchten mit einer Brokerless/Serverless-Architektur arbeiten. Lassen Sie die Apps Peer-to-Peer mit nichts in der Mitte kommunizieren. Vermeiden Sie zusätzliche Hops im Nachrichtenpfad (was normalerweise bedeutet, die meisten JMS-Implementierungen zu vermeiden, fast alles mit "queue" im Namen irgendwo usw.).

  • Denken Sie daran, wie sich Ihr System verhält, wenn sich ein einzelner Client falsch verhält. Kann ein langsamer Verbraucher alle anderen verlangsamen?

  • Es gibt eine Vielzahl von Betriebssystem-Tuning- und BIOS-Tuning-Optionen, die für jede Art von Low-Latency-Messaging, Eigenentwicklungen oder gekaufte Geräte von Vorteil sein können - Dinge wie Interrupt Coalescing , die Verbindung von NIC -Interrupts mit einem bestimmten CPU-Kern, seitliche Skalierung (was bei der Verwendung von UDP unter Windows bisher schrecklich war, in Zukunft aber deutlich besser werden sollte), Deaktivieren bestimmter CPU-Leistungszustände usw.

  • Widerstehen Sie der Versuchung, die integrierte Objektserialisierung in .NET zu verwenden, um ganze Objekte über die Leitung zu senden. Sie ist um Größenordnungen langsamer als ein einfaches Binärformat (z. B. Protokollpuffer oder die Serialisierungsbibliothek von Informatica oder Ihr eigenes Binärformat usw.) .).

Wenn Sie spezifischere Fragen haben oder ausführlichere Ratschläge benötigen, lassen Sie es mich wissen!

37
strangelydim

Wie niedrig ist "niedrige Latenz" und wie beschäftigt ist "intensiv"? Sie müssen wissen, was Sie anstreben, um den richtigen Ansatz zu wählen.

Ich könnte Ihnen etwas Hardware liefern, das auf 100% aller Anfragen innerhalb von beispielsweise 20% bis zur vollen Kapazität Ihrer Netzwerkhardware antworten würde, aber WCF würde nicht viel nutzen.

In einer sehr weiten Näherung würde ich sagen, dass Dinge wie WCF ein sehr hohes Niveau darstellen und die Benutzerfreundlichkeit und Abstraktion zum Vorteil des Programmierers im Hinblick auf die Leistung (Latenz/Durchsatz) beeinträchtigen. Ob sie zu viel für Ihre Anwendung eintauschen, erfordert echte Zahlen.

Das weit verbreitete IP-basierte Protokoll mit der geringsten Latenz und dem geringsten Overhead ist UDP - daher wird es für Dinge wie DNS und NTP verwendet. Es ist auf dem Server sehr skalierbar, da der Server keinen Status beibehalten muss und er auf fast jeder Plattform sehr einfach implementiert werden kann. Sie müssen jedoch eher an Netzwerkpakete als an .NET-Objekte denken. Können Sie auch die Client-End-Software bereitstellen?

6
Will Dean

Live-Finanzdaten? Verlassen Sie sich niemals auf WCF. Gehen Sie stattdessen zu dem, was andere Branchen verwenden. Das heißt, NASDAQ verwendet Real-Time Innovations - Data Distribution Service , um Benutzern Live-Ticks zu liefern. Sie bieten C/C++/C # -API für ihre Kommunikationsbibliotheken, die extrem einfach einzurichten und zu verwenden sind (im Vergleich zu WCF).

Im Allgemeinen verwenden diese Echtzeitdatenfeeds publish/subscribe paradigm , wodurch sichergestellt wird, dass die Kommunikation mit minimalem Aufwand erfolgt. Diese Art von Ansatz ist die Hauptidee in nachrichtenorientierten Middleware-Produkten und genau das, was Finanzdienstleistungen für Echtzeitprodukte verwenden.

Auf einem Nebenknoten können Sie Echtzeit-Audio-Video-Pakete mithilfe der RTI-DDS-Bibliothek ausliefern. Soweit ich weiß, verwenden unbemannte Luftfahrzeuge wie MQ-9 diese Bibliothek erneut, um Live-Video- und Geo-Ortsinformationen an den Boden zu liefern Kontrollstationen.

Es gibt auch kostenlose Datenverteilungsdienst-Bibliotheken, aber ich habe keine Erfahrung damit. Sie müssen nur dafür googeln.

Edit : Ich bin gerade im Prototyping einer HMI-Software (Human Machine Interface), die die oben genannten RTI-DDS-Bibliotheken zusammen mit zwei anderen Bibliotheken verwendet, die über solche nachrichtenorientierten Architekturen verfügen, die bisher für alle einen Thread funktionierten meine Echtzeitkommunikationsbedürfnisse. Hier ist eine Demo: http://epics.codeplex.com/ (Wird zur Fernsteuerung der Ausrüstung in unserer brandneuen Nuklearforschungsanlage verwendet)

3
Teoman Soygul

Je mehr Annahmen und Funktionen Sie ausschneiden, desto schneller können Sie Ihr System erstellen. Je robuster und flexibler Sie versuchen, Dinge herzustellen, desto stärker wird Ihre Leistung leiden. Ich würde ein paar grundlegende Must-Haves vorschlagen:

  1. Ein Binärdatenserialisierungsformat. Verwenden Sie keine XML- oder andere von Menschen lesbare Lesbare Methode, um Ihre Daten zu übergeben. 
  2. Ein robustes Serialisierungsformat für Daten, das Architekturübergreifend, Sprachübergreifende Endpunkte unterstützen kann. BER kommt In den Sinn - C # scheint Unterstützung zu haben
  3. Ein Transportprotokoll, das Garantierte Zustellung und Daten Integrität garantiert. Wenn bei einem beliebigen Finanzalgorithmus Diese Daten verwendet werden, kann das Fehlen eines Ticks Bedeuten, dass die Differenz zwischen Und der Reihenfolge ausgelöst wird oder fehlt. .] auf einen Preis. Selbst wenn Sie Aggregieren, werden auf Ihrem Server Ticks zusammengefasst, und Sie möchten immer noch Steuern, wie die Informationen Ihren Ihren Clients angezeigt werden. TCP funktioniert für verteilte Systeme. Es gibt jedoch viel schnellere Alternativen, wenn sich Ihre Clients auf demselben Computer befinden wie Ihr Server. UDP wird nicht einmal garauntee order, was problematisch sein kann (wenn auch nicht unüberwindbar).

In Bezug auf die interne Verarbeitung:

  1. Vermeiden Sie Zeichenfolgen und andere Klassen, die Zu einfachen Aufgaben einen erheblichen Mehraufwand verursachen. Verwenden Sie stattdessen grundlegende Zeichenarrays . Ich bin mir nicht sicher, welche Optionen Sie in C # haben oder ob Sie überhaupt Alternativen haben. Wenn ja, verwenden Sie . Dies gilt auch für Datenstrukturen.
  2. Beachten Sie Fehler beim Vergleich von Doppel- und Gleitkommazahlen. Verwenden Sie Vergleiche, die nur die erforderliche Genauigkeit überprüfen. Wenn möglich, konvertieren Sie alles intern in Ganzzahlen und stellen Sie genügend Metadaten bereit, um sie am anderen Ende zurück zu konvertieren.
  3. Verwenden Sie etwas, das gepoolten Allokatoren in C++ ähnlich ist. Meine mangelnde Kenntnis von C # hindert mich daran, genauer zu sein. Wieder ist C # hier wahrscheinlich nicht die beste Wahl. Das Fazit ist, dass Sie viele Tick-Objekte erstellen und zerstören werden, und es gibt keinen Grund, das Betriebssystem jedes Mal nach dem Speicher zu fragen.
  4. Senden Sie nur Deltas, senden Sie keine Informationen, die Ihre Kunden bereits haben. Dies setzt voraus, dass Sie einen Transport mit garantierter Zustellung verwenden. Andernfalls könnten Sie lange Zeit veraltete Daten anzeigen.
3
hifier

Sie fragen speziell nach einem "Low-Latenz-Benutzer-Feed". Was möchten Sie wirklich mit geringer Latenz für "Feed Only" (und insbesondere, wenn es keinen Umsatz generiert), könnten die Benutzer eine Sekunde warten? das ist keine niedrige latenz.

Wenn Sie FAST handeln möchten, müssen Sie physisch von der Börse (oder in der Nähe mit einem optischen Link) über die Straße gehen. Als nächstes müssen Sie "auf der Karte handeln"; Die Ethernet-Karte ist "intelligent" und erhält "Handelsformeln", mit denen die Netzwerkkarte so programmiert wird, dass ein vorprogrammierter Handel auf Basis der empfangenen Daten (ohne dass der Computer belästigt wird) ausgeführt wird.

Siehe: http://intelligenttradingtechnology.com/article/groundbreaking-results-high-performance-trading-fpga-and-x86-technologies

Wenn Sie lernen, diese Umgebung zu manipulieren, werden Sie mehr kaufen als das Rad neu zu erfinden.

Eine extrem niedrige Latenz ist kostspielig, aber es geht um Milliarden. Ihre Einsätze (und das Streben nach geringerer Latenz) werden mit $ gedrosselt.

1
Rob

Dies könnte von Interesse sein, obwohl es für Spiele spezifisch ist ... Niedrigste Latenz kleine Datenübertragungsprotokolle? c #

Hier ist ein Tutorial zum Thema UDP-Verbindung http://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8r.html

Ein weiterer Artikel zu UDP http://msdn.Microsoft.com/en-us/magazine/cc163648.aspx

1
Jonathan

In der Vergangenheit habe ich Tibco-RV- oder Raw-Sockets zum Streaming von Preisen/Raten verwendet, bei denen Hochfrequenzaktualisierungen erwartet werden. In dieser Situation ist es oft der Client (oder tatsächlich der Benutzer), der die Einschränkung darstellt (da es nur so viele Updates gibt, die ein Benutzer verarbeiten kann), und dies ist ein Beispiel dafür, wo Sie Daten verlieren können. In dieser Situation kann ein clientseitiger Service-Broker verwendet werden, um Aktualisierungen zu drosseln. 

Wenn das System für automatisierten Handel oder HFT verwendet wird, haben sich Produkte wie 29West LatencyBuster als gut erwiesen und bieten garantiertes Messaging.

0
dashton