Monday 13 February 2017

Handels System Workflow

Messaging Patterns 187 Integrationsmuster in der Praxis 187 Fallstudie: Bond Trading System (von Jonathan Simon) Es ist leicht, sich von einer großen Sammlung von Mustern oder einer Mustersprache zu distanzieren. Muster sind die Abstraktion einer Idee in einer wiederverwendbaren Form. Oft macht die sehr generische Natur der Muster, die sie so nützlich macht auch sie schwer zu begreifen. Manchmal ist die beste Sache, um zu verstehen, Muster ist eine reale Welt Beispiel. Nicht ein erfundenes Szenario, was passieren könnte, sondern was tatsächlich passiert und was passieren wird. Dieses Kapitel wendet Muster an, um Probleme mit einem Entdeckungsprozess zu lösen. Das System, das wir diskutieren, ist ein Anleihehandelssystem, mit dem ich zwei Jahre lang von der ersten Planung bis zur Fertigung gearbeitet habe. Wir untersuchen Szenarien und Probleme, die angetroffen wurden und wie man sie mit Mustern lösen kann. Dies beinhaltet den Entscheidungsprozess der Auswahl eines Musters sowie die Kombination und Anpassung von Mustern an die Bedürfnisse des Systems. Und das alles unter Berücksichtigung der Kräfte, die in realen Systemen einschließlich Geschäftsanforderungen, Kundenentscheidungen, architektonische und technische Anforderungen, sowie Legacy-System-Integration. Die Absicht dieses Ansatzes besteht darin, ein klareres Verständnis der Muster selbst durch praktische Anwendung zu schaffen. Aufbau eines Systems Eine große Investmentbank der Wall Street setzt sich für die Schaffung eines Anleihepreissystems ein, um den Workflow ihrer Anleihenhandelsplattform zu rationalisieren. Derzeit müssen die Anleihenhändler die Preise für eine große Anzahl von Anleihen an mehrere verschiedene Handelsplätze senden, jeweils mit einer eigenen Benutzeroberfläche. Das Ziel des Systems ist die Minimierung der Minutien der Preisbildung aller ihrer Anleihen kombiniert mit fortschrittlichen analytischen Funktionalität spezifisch für den Anleihemarkt in einer einzigen gekapselte Benutzeroberfläche. Das bedeutet Integration und Kommunikation mit mehreren Komponenten über verschiedene Kommunikationsprotokolle. Der High Level Flow des Systems sieht so aus: Zuerst kommen Marktdaten ins System. Marktdaten sind Daten über den Preis und andere Eigenschaften der Anleihe, die repräsentieren, was die Leute bereit sind, die Anleihe für den freien Markt zu kaufen und zu verkaufen. Die Marktdaten werden sofort an die Analytik-Engine gesendet, die die Daten verändert. Analytics bezieht sich auf mathematische Funktionen für Finanzanwendungen, die die Preise und andere Attribute von Anleihen verändern. Dies sind generische Funktionen, die Eingangsvariablen verwenden, um die Ergebnisse der Funktion an eine bestimmte Bindung anzupassen. Die Client-Anwendung, die auf jedem Trader-Desktop ausgeführt wird, konfiguriert die Analytics-Engine auf einer pro Trader-Basis und steuert die Besonderheiten der Analytics für jede Bindung, die der Trader kalkuliert. Sobald die Analytik auf die Marktdaten angewendet wird, werden die geänderten Daten an verschiedene Handelsplätze verschickt, in denen Händler von anderen Firmen die Anleihen kaufen oder verkaufen können. Architektur mit Patterns Mit diesem Überblick über den Workflow des Systems können wir auf einige der architektonischen Probleme eingehen, denen wir während des Designprozesses begegnen. Werfen wir einen Blick auf, was wir bis jetzt wissen. Händler benötigen eine sehr ansprechende Anwendung auf Windows NT - und Solaris-Workstations. Daher haben wir uns entschlossen, die Client-Anwendung als Java-Dick-Client zu implementieren, weil es unabhängig von seiner Plattform ist und schnell auf User-Input - und Marktdaten reagieren kann. Auf der Serverseite sind wir erben Legacy-C-Komponenten, die unser System nutzen wird. Die Marktdatenkomponenten kommunizieren mit der TIB-Messaging-Infrastruktur. Wir erben die folgenden Komponenten: Market Data Price Feed Server. Publiziert eingehende Marktdaten an die TIB. Analytics Engine. Führt Analysen zu eingehenden Marktdaten durch und überträgt die geänderten Marktdaten an die TIB. Beitragsserver. Führt alle Kommunikation mit Handelsplätzen durch. Die Handelsplätze sind Drittkomponenten, die nicht von der Bank kontrolliert werden. Legacy Market Data Subsystem Legacy Contribution Subsystem Wir müssen entscheiden, wie die einzelnen Subsysteme (Java dicken Client, Marktdaten und Beitrag) zu kommunizieren. Wir könnten den dicken Client direkt mit den Legacy-Servern kommunizieren, aber das würde zu viel Business-Logik auf dem Client erfordern. Stattdessen bauen Sie gut ein Paar Java-Gateways, um mit den Legacy-Servern zu kommunizieren. Das Pricing Gateway für Marktdaten ist ein Contribution Gateway zum Senden von Preisen an Handelsplätze. Dies wird eine gute Kapselung der Geschäftslogik in Bezug auf diese Bereiche zu erreichen. Die aktuellen Komponenten im System sind unten dargestellt. Die Verbindungen, die als gekennzeichnet sind. Zeigen, dass wir noch nicht sicher sind, wie einige der Komponenten kommunizieren werden. Das System und seine Komponenten Die erste Frage der Kommunikation ist, wie der Java-Dick-Client und die beiden Java-Server-Komponenten zu integrieren, um Daten auszutauschen. Sehen wir uns die vier in diesem Buch vorgeschlagenen Integrationsstile an: File Transfer. Gemeinsame Datenbank. Remoteprozeduraufruf. Und Messaging. Wir können Shared Database sofort ausschließen, weil wir eine Schicht der Abstraktion zwischen dem Client und der Datenbank erstellen möchten und keinen Datenbankzugriffscode im Client haben möchten. File Transfer kann ähnlich ausgeschlossen werden, da minimale Latenzzeiten erforderlich sind, um sicherzustellen, dass aktuelle Preise an die Handelsplätze verschickt werden. So haben Sie die Wahl zwischen Remote Procedure Invocation oder Messaging. Die Java-Plattform bietet integrierte Unterstützung für Remote Procedure Invocation und Messaging. RPC-Stil Integration kann mit Remote Method Invocation (RMI), CORBA oder Enterprise Java Beans (EJB) erreicht werden. Der Java Messaging Service (JMS) ist die gemeinsame API für die Integration von Messaging-Stilen. So sind beide Integrationsstile in Java einfach zu implementieren. Also, die besser für dieses Projekt arbeiten, Remote Procedure Invocation oder Messaging. Es gibt nur eine Instanz des Pricing Gateways und eine Instanz des Contribution Gateways im System, aber meistens verbinden sich viele Thick Clients mit diesen Diensten (eine für jeden Bondhändler, der zu einer bestimmten Zeit angemeldet ist). Des Weiteren wäre die Bank ein generisches Preissystem, das in anderen Anwendungen genutzt werden kann. Neben einer unbekannten Anzahl von Think-Clients kann es eine unbekannte Anzahl anderer Anwendungen geben, die die aus den Gateways kommenden Preisdaten verwenden. Ein Thick-Client (oder eine andere Anwendung, die die Kalkulationsdaten verwendet) kann RPC ziemlich einfach verwenden, um Anrufe an die Gateways zu tätigen, um Preisdaten zu erhalten und die Verarbeitung aufzurufen. Allerdings werden die Preisdaten ständig veröffentlicht, und bestimmte Kunden sind nur an bestimmten Daten interessiert, so dass die relevanten Daten an die richtigen Kunden in einer fristgerechten Weise könnte schwierig sein. Die Kunden könnten die Gateways abfragen, aber das wird eine Menge Overhead verursachen. Es wäre besser für die Gateways, die Daten den Kunden zur Verfügung zu stellen, sobald sie verfügbar sind. Dies erfordert jedoch jedes Gateway, um zu verfolgen, welche Clients momentan aktiv sind, und welche bestimmte Daten dann wünschen, wenn ein neues Datenelement verfügbar wird (was mehrmals pro Sekunde passieren wird), muss das Gateway machen Ein RPC an jeden interessierten Client, um die Daten an den Client zu übergeben. Idealerweise sollten alle Clients gleichzeitig benachrichtigt werden, so dass jeder RPC in einem eigenen gleichzeitigen Thread erstellt werden muss. Dies kann funktionieren, wird aber sehr schnell sehr kompliziert. Messaging vereinfacht dieses Problem erheblich. Mit Messaging. Können wir für die verschiedenen Arten von Preisdaten separate Kanäle definieren. Wenn dann ein Gateway ein neues Datenpaket erhält, fügt es eine Nachricht hinzu, die diese Daten dem Publish-Subscribe-Kanal für diesen Datentyp enthält. Unterdessen hören alle Klienten, die an einer bestimmten Art von Daten interessiert sind, auf dem Kanal für diesen Typ. Auf diese Weise können die Gateways problemlos neue Daten an jeden senden, der interessiert ist, ohne zu wissen, wie viele Höreranwendungen es gibt oder was sie sind. Die Clients müssen weiterhin in der Lage sein, Verhalten in den Gateways aufzurufen. Da es immer nur zwei Gateways gibt und der Client wahrscheinlich blockieren kann, während die Methode synchron aufgerufen wird, können diese Client-to-Gateway-Aufrufe ziemlich einfach mit RPC implementiert werden. Da wir jedoch bereits Messaging für die Gateway-to-Client-Kommunikation verwenden, sind Nachrichten wahrscheinlich genauso gut für die Implementierung von Client-zu-Gateway-Kommunikation. Daher wird die gesamte Kommunikation zwischen den Gateways und den Clients durch Messaging erreicht. Da alle Komponenten in Java geschrieben sind, bietet JMS eine einfache Auswahl für das Messaging-System. Dies schafft effektiv einen Message Bus oder eine Architektur, die es möglich macht, dass zukünftige Systeme mit dem aktuellen System mit wenig oder keiner Änderung an der Messaging-Infrastruktur integriert werden können. Auf diese Weise kann die Geschäftsfunktionalität der Anwendung leicht von anderen Anwendungen genutzt werden, die die Bank entwickelt. Java-Komponenten Die Kommunikation mit JMS JMS ist einfach eine Spezifikation und wir müssen uns für ein JMS-konformes Messaging-System entscheiden. Wir beschlossen, IBM MQSeries JMS zu verwenden, da die Bank ein IBM-Shop mit WebSphere-Anwendungsservern und vielen anderen IBM Produkten ist. Daher verwenden wir MQSeries, da wir bereits über eine Support-Infrastruktur verfügen und eine Site-Lizenz des Produkts besitzen. Die nächste Frage ist, wie das MQSeries-Messaging-System mit dem eigenständigen C-Contribution-Server und den TIBCO-basierten Market Data - und Analytics Engine-Servern verbunden wird. Wir brauchen eine Möglichkeit für die MQSeries-Konsumenten, Zugriff auf die TIB-Nachrichten zu haben. Aber wie könnten wir das Message Translator-Muster verwenden, um TIB-Nachrichten in MQSeries-Nachrichten zu übersetzen. Obwohl der C-Client für MQSeries als Message Translator dient. Mit es würde JMS Server Unabhängigkeit zu opfern. Und obwohl TIBCO eine Java API hat, haben der Kunde Architekt und Manager sie abgelehnt. Als Ergebnis muss der Message Translator Ansatz aufgegeben werden. Die Brücke vom TIB-Server zum MQSeries-Server benötigt die Kommunikation zwischen C und Java. Wir könnten CORBA verwenden, aber dann was über das Messaging Ein genauerer Blick auf das Message Translator-Muster zeigt, dass es mit dem Channel-Adapter in seiner Verwendung von Kommunikationsprotokollen verwandt ist. Das Herzstück eines Channel-Adapters besteht darin, Nicht-Messaging-Systeme mit Messaging-Systemen zu verbinden. Ein Paar von Kanaladaptern, die zwei Messaging-Systeme verbindet, ist eine Messaging Bridge. Der Zweck einer Messaging Bridge besteht darin, Nachrichten von einem Messagingsystem zu einem anderen zu übertragen. Genau das machen wir mit der zusätzlichen Komplexität der intra-sprachigen Java-to-C-Kommunikation. Wir können die Cross Language Messaging Bridge mit einer Kombination aus Channel Adapter und CORBA implementieren. Wir werden zwei leichte Channel-Adapter-Server aufbauen, einen in C, der die Kommunikation mit dem TIB verwaltet, und einen in Java, der die Kommunikation mit JMS verwaltet. Diese beiden Kanaladapter. Die Message Endpoint selbst sind, kommunizieren miteinander über CORBA. Wie unsere Wahl für MQSeries, verwenden wir CORBA anstatt JNI, da es ein Unternehmensstandard ist. Die Messaging-Bridge implementiert die effektiv simulierte Nachrichtenübersetzung zwischen scheinbar inkompatiblen Messaging-Systemen und verschiedenen Sprachen. Message Translator using Channel Adapters Das nächste Diagramm zeigt das aktuelle Systemdesign einschließlich der Gateways und anderer Komponenten. Dies ist ein gutes Beispiel für eine Musteranwendung. Wir kombinierten zwei Kanaladapter mit einem Nicht-Messaging-Protokoll, um das Message Translator-Muster zu implementieren, wobei effektiv ein Muster verwendet wurde, um ein anderes Muster zu implementieren. Darüber hinaus haben wir den Channel-Adapter-Kontext geändert, um zwei Messaging-Systeme mit einem Nicht-Messaging-Cross-Language-Übersetzungsprotokoll zu verknüpfen, anstatt ein Messaging-System mit einem Nicht-Messaging-System zu verbinden. Das aktuelle System mit den Kanaladaptern Strukturierung von Kanälen Ein Schlüssel zur Arbeit mit Mustern ist nicht nur zu wissen, wann, welches Muster zu verwenden, sondern auch, wie man am effektivsten verwenden. Bei jeder Musterimplementierung sind sowohl die Besonderheiten der Technologieplattform als auch andere Gestaltungskriterien zu berücksichtigen. Dieser Abschnitt wendet denselben Ermittlungsprozess an, um die effizienteste Verwendung des Publish-Subscribe-Kanals im Kontext des Marktdatenservers, der mit der Analytik-Engine kommuniziert, zu finden. Echtzeit-Marktdaten stammen aus dem Marktdaten-Feed, einem C-Server, der Marktdaten auf der TIB überträgt. Der Marktdaten-Feed verwendet für jede Anleihe, für die er die Preise veröffentlicht, einen eigenen Publish-Subscribe-Kanal. Dies mag ein wenig extremer erscheinen, da jede neue Bindung einen eigenen neuen Kanal braucht. Aber das ist nicht so schwer, da man eigentlich keine Kanäle in TIBCO erstellen muss. Vielmehr werden Kanäle durch einen hierarchischen Satz von Themennamen, die als Subjekte bezeichnet werden, referenziert. Der TIBCO-Server filtert dann einen einzelnen Nachrichtenfluss durch das Subjekt und sendet jedes einzelne Objekt einem einzigen virtuellen Kanal zu. Das Ergebnis ist ein sehr leichter Nachrichtenkanal. Wir könnten ein System erstellen, das auf wenigen Kanälen veröffentlicht wird, und Abonnenten können nur auf Preise zugreifen, für die sie interessiert sind. Dies würde es erforderlich machen, dass Abonnenten einen Message Filter oder Selective Consumer verwenden, um den gesamten Datenfluss auf interessante Anleihenpreise zu filtern Sollte so verarbeitet werden, wie sie eingegangen ist. Da die Marktdaten auf Bond-dedizierten Kanälen veröffentlicht werden, können sich Abonnenten für Updates auf einer Reihe von Anleihen registrieren. Dies ermöglicht es effektiv den Teilnehmern zu filtern, indem sie selektiv Kanäle abonniert und nur Aktualisierungen von Interesse empfängt, anstatt zu entscheiden, nachdem die Nachricht empfangen wurde. Es ist wichtig zu beachten, dass die Verwendung mehrerer Kanäle, um eine Filterung zu vermeiden, eine nicht standardmäßige Verwendung von Messaging-Kanälen ist. Im Kontext der TIBCO-Technologie entscheiden wir aber, ob wir Filter oder die in TIBCO eingebaute Kanalfilterung implementieren oder eigene Filter einsetzen müssen - und nicht, ob wir so viele Kanäle verwenden. Die nächste Komponente, die wir entwerfen müssen, ist die Analytik-Engine, ein weiterer CTIB-Server, der die Marktdaten modifiziert und an die TIB weitergibt. Obwohl es außerhalb des Bereichs unserer JavaJMS-Entwicklung liegt, arbeiten wir eng mit dem C-Team zusammen, um es zu entwerfen, da wir die primären Kunden der Analytics-Engine sind. Das Problem besteht darin, die Kanalstruktur zu finden, die die neu modifizierten Marktdaten am effizientesten wiedergibt. Da wir bereits einen dedizierten Message Channel pro Bindung aus dem Marktdaten-Preis-Feed geerbt haben, wäre es logisch, die Marktdaten zu modifizieren und die geänderten Marktdaten auf dem dedizierten Message Channel zu übertragen. Aber dies wird nicht funktionieren, da die Analytik Modifikation der Anleihen Preise sind Händler-spezifisch. Wenn wir die geänderten Daten auf dem Bond Message Channel erneut senden. Werden wir die Datenintegrität zerstören, indem wir generische Marktdaten durch handelspezifische Daten ersetzen. Auf der anderen Seite könnten wir einen anderen Nachrichtentyp für traderspezifische Marktdaten haben, die wir auf demselben Kanal veröffentlichen, sodass die Teilnehmer entscheiden können, an welche Nachricht sie interessiert sind, um die Datenintegrität nicht zu zerstören. Aber dann müssen Kunden ihre eigenen Filter implementieren, um Nachrichten für andere Händler zu trennen. Zusätzlich wird es eine erhebliche Zunahme der von den Teilnehmern empfangenen Nachrichten geben, was eine unnötige Belastung für sie bedeutet. Es gibt zwei Möglichkeiten: Ein Kanal pro Trader: Jeder Trader hat einen bestimmten Kanal für die geänderten Marktdaten. Auf diese Weise bleiben die ursprünglichen Marktdaten intakt und jede Traderanwendung kann auf ihre spezifischen Händler Nachrichtenkanal für die geänderten Preisaktualisierungen zu hören. Ein Channel pro Trader pro Bond: Erstellen Sie einen Message Channel pro Trader pro Bindung ausschließlich für die geänderten Marktdaten dieser Bonds. Zum Beispiel würden die Marktdaten für Anleihen ABC auf dem Channel Bond ABC veröffentlicht, während die geänderten Marktdaten für Trader A auf Message Channel Trader A, Bond ABC, geänderte Marktdaten für Trader B auf Trader B, Bond ABC und veröffentlicht werden würden bald. Ein Kanal pro Trader Ein Kanal pro Bond pro Trader Es gibt Vor-und Nachteile für jeden Ansatz. Der Pro-Bond-Ansatz verwendet beispielsweise viel mehr Nachrichtenkanal. Im schlimmsten Fall ist die Anzahl der Meldungskanäle die Anzahl der Anleihen insgesamt multipliziert mit der Anzahl der Händler. Wir können obere Schranken setzen auf die Anzahl der Kanäle, die erstellt werden, da wir wissen, dass es nur etwa 20 Händler und sie nie mehr als ein paar hundert Bonds. Damit liegt die obere Grenze unter dem 10.000er Bereich, der nicht so aussergewöhnlich ist, verglichen mit dem fast 100.000 Nachrichtenkanal, den der Marktdatenpreis-Feed verwendet. Auch, da wir die TIB und Message Channel sind ziemlich billig, die Anzahl der Message Channel s ist nicht ein schweres Problem. Andererseits könnte die schiere Anzahl von Nachrichtenkanälen ein Problem aus einer Managementperspektive sein. Jedes Mal, wenn eine Anleihe hinzugefügt wird, muss ein Kanal für jeden Trader gepflegt werden. Dies könnte in einem sehr dynamischen System schwerwiegend sein. Unser System ist jedoch im wesentlichen statisch. Es verfügt außerdem über eine Infrastruktur zur automatischen Verwaltung des Nachrichtenkanals. Dies kombiniert mit der ererbten Architektur einer Legacykomponente unter Verwendung eines ähnlichen Ansatzes minimiert den Nachteil. Dies ist nicht zu sagen, wir sollten eine unnötig übermäßige Anzahl von Message Channel s. Vielmehr können wir einen architektonischen Ansatz implementieren, der eine große Anzahl von Nachrichtenkanälen verwendet, wenn es einen Grund gibt. Und es gibt einen Grund, in diesem Fall kommt auf die Lage der Logik. Wenn wir den pro-Trader-Ansatz implementieren, benötigt die Analytics-Engine eine Logik, um Eingangs - und Ausgangskanäle zu gruppieren. Dies liegt daran, dass die Eingangskanäle der Analytics Engine pro Bond und der Output Message Channel s pro Trader sind und die Analytics Engine alle Analytics-Inputs von mehreren Bonds für einen bestimmten Trader an einen traderspezifischen Output Message Channel leiten muss. Dadurch wird die Analytik-Engine effektiv zu einem Content-Based Router, der eine benutzerdefinierte Routing-Logik für unsere Anwendung implementiert. Im Anschluss an die Message Bus Struktur ist die Analytics Engine ein generischer Server, der von mehreren anderen Systemen in der. Also wollen wir es nicht mit System-spezifische Funktionalität zu bewölken. Auf der anderen Seite, die Per-Bond-Ansatz funktioniert, da die Idee eines Händlers, die die Analytik Ausgabe der Anleihen Preise ist ein Unternehmen akzeptiert Praxis. Der Per-Bond-Ansatz hält die Nachrichtenkanal-Trennung des Marktdaten-Feeds intakt, während der Hinzufügen mehrerer Nachrichten-Kanal s. Bevor wir den Client erreichen, wollen wir einen Content-basierten Router, um diese verschiedenen Kanäle zu einer überschaubaren Anzahl von Kanälen zu kombinieren. Wir möchten nicht, dass die Clientanwendung auf dem Trader-Desktop auf Tausende oder Zehntausende von Nachrichtenkanälen zu hören ist. Nun wird die Frage, wo die Content-Based Router setzen. Wir könnten einfach haben, dass der CTIB-Kanaladapter alle Nachrichten an das Pricing Gateway auf einem einzelnen Message Channel weiterleitet. Dies ist aus zwei Gründen schlecht, weil wir die Geschäftslogik zwischen C und Java aufteilen würden, und wir würden den Vorteil des separaten Nachrichtenkanals auf der TIB-Seite verlieren, was es uns ermöglicht, die Filterung später im Datenfluss zu vermeiden. Wenn wir unsere Java-Komponenten betrachten, können wir sie entweder im Pricing Gateway platzieren oder eine Zwischenkomponente zwischen dem Pricing Gateway und dem Client erstellen. In der Theorie, wenn wir die Bond-basierte Trennung von Message Channel s bis hin zum Client bestanden, würde das Pricing Gateway Pricing-Informationen mit derselben Kanalstruktur wie das Pricing Gateway und die Analytics Engine erneut senden. Dies bedeutet eine Duplizierung aller Bond-TIB-Kanäle in JMS. Selbst wenn wir eine Zwischenkomponente zwischen dem Pricing Gateway und dem Client erstellen, muss das Pricing Gateway immer noch alle Kanäle in JMS duplizieren. Auf der anderen Seite erlaubt die Implementierung der Logik direkt im Pricing Gateway die Vermeidung von Duplizierung der großen Anzahl von Kanälen in JMS, was uns ermöglicht, eine viel kleinere Anzahl von Kanälen in der Grßenordnung von einem pro Trader zu schaffen. Das Pricing Gateway registriert sich durch den CTIB Channel Adapter als Verbraucher für jede Bindung jedes Traders im System. Dann wird das Pricing Gateway jedem bestimmten Client nur die Nachrichten zu diesem bestimmten Händler weiterleiten. Auf diese Weise verwenden wir nur eine kleine Anzahl von Nachrichtenkanälen am JMS-Ende, während wir den Nutzen der Trennung am TIB-Ende maximieren. Der komplette Market Data Flow zum Client Die Message Channel Layout Diskussion ist ein gutes Beispiel dafür, wie die Integration von Patterns wichtig ist. Das Ziel hier war, herauszufinden, wie man effektiv den Nachrichten-Kanal s verwenden. Sagen Sie verwenden ein Muster ist nicht genug. Sie müssen herausfinden, wie man am besten implementieren und integrieren in Ihr System, um die Probleme zu lösen. Darüber hinaus zeigt dieses Beispiel Geschäftskräfte in Aktion. Wenn wir Geschäftslogik in irgendwelchen unserer Bestandteile umsetzen konnten, konnten wir mit dem pro Händleransatz gegangen und ein allgemeineres einfacherer Ansatz mit vielen weniger Kanälen implementiert haben. Auswählen eines Nachrichtenkanals Nachdem wir nun die Mechanismen der Kommunikation zwischen den JavaJMS-Komponenten und den C-TIBCO-Komponenten kennen und wir einige Nachrichtenkanalstrukturierungen gesehen haben, müssen wir entscheiden, welchen JMS-Nachrichtenkanal die Java-Komponenten zur Kommunikation verwenden sollen . Bevor wir zwischen den verschiedenen Nachrichtenkanälen wählen können, die in JMS verfügbar sind, können wir uns den hohen Nachrichtenfluss des Systems ansehen. Wir haben zwei Gateways (Pricing and Contribution), die mit dem Kunden kommunizieren. Marktdaten fließen zum Client vom Pricing Gateway, der es an das Contribution Gateway sendet. Die Clientanwendung sendet eine Nachricht an das Pricing Gateway, um die auf jede Anleihe angewendeten Analysen zu ändern. Das Contribution Gateway sendet auch Nachrichten an die Client-Anwendung, die den Status der Preisaktualisierungen an die verschiedenen Handelsplätze weiterleitet. Der Systemnachrichtenfluss Die JMS-Spezifikation beschreibt zwei Message-Channel-Typen, Point-to-Point-Kanal (JMS Queue) und Publish-Subscribe Channel (JMS-Topic). Erinnern Sie sich, dass der Fall für die Verwendung von publish-subscribe es allen interessierten Konsumenten ermöglicht, eine Nachricht zu erhalten, während der Fall für die Verwendung von Punkt-zu-Punkt ist, um sicherzustellen, dass nur ein berechtigter Verbraucher eine bestimmte Nachricht erhält. Viele Systeme würden einfach Nachrichten an alle Client-Anwendungen senden, sodass jede einzelne Client-Anwendung selbst entscheiden kann, ob eine bestimmte Nachricht verarbeitet werden soll oder nicht. Dies funktioniert nicht für unsere Anwendung, da eine große Anzahl von Marktdaten-Nachrichten an jede Client-Anwendung gesendet werden. Wenn wir Marktdaten-Updates an uninteressierten Trader weitergeben, werden wir unnötigerweise Client-Prozessor-Zyklen verschwenden, die entscheiden, ob eine Marktdaten-Aktualisierung verarbeitet werden soll oder nicht. Punkt-zu-Punkt-Kanäle klingt zunächst wie eine gute Wahl, da die Clients Nachrichten an eindeutige Server senden und umgekehrt. Aber es war eine Geschäftsanforderung, dass Händler zu mehreren Maschinen gleichzeitig angemeldet werden können. Wenn ein Händler an zwei Arbeitsplätzen gleichzeitig angemeldet ist und eine Punkt-zu-Punkt-Preisaktualisierung gesendet wird, wird nur eine der beiden Clientanwendungen die Meldung erhalten. Dies liegt daran, dass nur ein Verbraucher auf einem Point-to-Point-Kanal eine bestimmte Nachricht empfangen kann. Beachten Sie, dass nur die erste von jeder Gruppe von Trader-Client-Anwendungen die Nachricht empfängt. Punkt-zu-Punkt-Messaging für Preisaktualisierungen Wir konnten dies mit dem Empfängerlistenmuster lösen, das Nachrichten zu einer Liste der beabsichtigten Empfänger veröffentlicht, sodass nur Clients in der Empfängerliste Nachrichten empfangen können. Mit diesem Muster kann das System Empfängerlisten mit allen Client-Anwendungsinstanzen erstellen, die mit jedem Trader zusammenhängen. Das Senden einer Nachricht, die sich auf einen bestimmten Händler bezieht, würde wiederum die Nachricht zu jeder Anwendung in der Empfängerliste senden. Dies garantiert, dass alle Client-Anwendungsinstanzen, die sich auf einen bestimmten Händler beziehen, die Nachricht erhalten. Der Nachteil dieses Ansatzes ist, dass es eine gewisse Implementierungslogik erfordert, um die Empfänger und Abfertigungsnachrichten zu verwalten. Empfänger-Liste für Preis-Updates Obwohl Punkt-zu-Punkt zur Arbeit gemacht werden könnte, sehen wir, ob es einen besseren Weg gibt. Durch die Verwendung von Publish-Subscribe-Kanälen könnte das System Nachrichten auf handelsüblichen Kanälen und nicht auf Client-spezifische Kanäle übertragen. Auf diese Weise würden alle Client-Anwendungen, die Nachrichten für einen einzelnen Händler verarbeiten, die Nachricht empfangen und verarbeiten. Publish-Subscribe-Messaging für Preisaktualisierungen Der Nachteil der Verwendung von Publish-Subscribe-Channels ist, dass eine eindeutige Nachrichtenverarbeitung nicht mit den Serverkomponenten gewährleistet ist. Es wäre möglich, mehrere Instanzen einer Server-Komponente instanziiert zu werden und jede Instanz verarbeitet dieselbe Nachricht, die möglicherweise ungültige Preise aussendet. Beim Abrufen des Systemnachrichtenflusses ist nur eine einzige Kommunikationsrichtung mit jedem Nachrichtenkanal zufriedenstellend. Server-to-Client-Kommunikation mit publish-subscribe ist zufriedenstellend, während Client-zu-Server-Kommunikation nicht und Client-Server-Kommunikation mit Punkt-zu-Punkt zufrieden stellend ist, während Server-Client nicht. Da es nicht notwendig ist, denselben Nachrichtenkanal in beide Richtungen zu verwenden, können wir jeden Nachrichtenkanal nur in einer Richtung verwenden. Die Client-to-Server-Kommunikation wird mit Punkt-zu-Punkt implementiert, während die Server-to-Client-Kommunikation mit publish-subscribe implementiert wird. Mit dieser Kombination von Message Channel s profitiert das System von der direkten Kommunikation mit den Server-Komponenten mittels Point-to-Point Messaging und der Multicast-Art von publish-subscribe ohne einen der Nachteile. Nachrichtenfluss mit Kanaltypen Problemlösungen mit Patterns Patterns sind Werkzeuge und Patternsammlungen sind Toolboxes. Sie helfen, Probleme zu lösen. Einige denken, dass Muster nur während des Entwurfs nützlich sind. Im Anschluss an die Toolbox-Analogie, das ist wie sagen, dass Werkzeuge sind nur sinnvoll, wenn Sie ein Haus zu bauen, nicht, wenn Sie es zu beheben. Die Tatsache ist, dass Muster ein nützliches Werkzeug während eines Projekts sind, wenn es gut angewandt wird. In den folgenden Abschnitten werden wir denselben Mustererforschungsprozess verwenden, wie wir ihn im vorigen Abschnitt verwendet haben, um Probleme in unserem nun arbeitenden System zu lösen. Blinkende Marktdaten-Updates Trader wollen, dass Tabellenzellen blinken, wenn neue Marktdaten für eine Anleihe erhalten werden, was eindeutig die Veränderungen anzeigt. Der Java-Client empfängt Nachrichten mit neuen Daten, die eine Client-Daten-Cache-Aktualisierung auslösen und schließlich in der Tabelle blinken. Das Problem ist, dass Updates ziemlich häufig kommen. Der GUI-Threadstapel wird überladen und erfriert den Client schließlich, da er nicht auf Benutzerinteraktion reagieren kann. Wir gehen davon aus, dass das Blinken optimiert ist und sich auf den Datenfluss von Nachrichten durch den Aktualisierungsprozess konzentriert. Eine Prüfung der Leistungsdaten zeigt, dass die Clientanwendung mehrere Updates eine Sekunde empfängt, einige Updates traten weniger als eine Millisekunde auseinander auf. Zwei Muster, die so aussehen, als könnten sie dazu beitragen, den Nachrichtenfluss zu verlangsamen, sind Aggregator und Nachrichtenfilter. Ein erster Gedanke ist, einen Nachrichtenfilter zu implementieren, um die Geschwindigkeit des Nachrichtenflusses durch das Auswerfen von Aktualisierungen zu steuern, die eine kleine Zeitspanne nach der Referenznachricht empfangen werden. Als Beispiel können wir sagen, dass wir Nachrichten innerhalb von 5 Millisekunden von einander ignorieren werden. Der Nachrichtenfilter kann die Zeit der letzten akzeptablen Nachricht zwischenspeichern und alle empfangenen Nachrichten innerhalb der nächsten 5 Millisekunden auswerfen. Während andere Anwendungen nicht in der Lage, Datenverlust in einem solchen Ausmaß zu widerstehen, ist dies in unserem System durch die Häufigkeit der Preis-Updates völlig akzeptabel. Time Based Message Filter Das Problem bei diesem Ansatz ist, dass nicht alle Datenfelder zur gleichen Zeit aktualisiert werden. Jede Bindung hat ungefähr 50 Datenfelder, die dem Benutzer einschließlich Preis angezeigt werden. Wir wissen, dass nicht jedes Feld in jeder Nachricht aktualisiert wird. Wenn das System aufeinander folgende Nachrichten ignoriert, kann es sehr gut sein, wichtige Daten zu werfen. Das andere Muster von Interesse ist der Aggregator. Der Aggregator wird verwendet, um die Abstimmung mehrerer, verwandter Nachrichten in einer einzigen Nachricht zu verwalten, wodurch der Nachrichtenfluss möglicherweise reduziert wird. Der Aggregator könnte eine Kopie der Bonddaten aus der ersten aggregierten Nachricht behalten und dann nur neue oder geänderte Felder aufeinanderfolgende Nachrichten aktualisieren. Schließlich werden die aggregierten Bonddaten in einer Nachricht an den Client übergeben. Für jetzt gehen wir davon aus, dass der Aggregator eine Nachricht alle 5 Millisekunden wie die Message Filter senden wird. Später, gut erkunden eine andere Alternative. Aggregator mit teilweise aufeinanderfolgenden Updates Der Aggregator. Wie jedes andere Muster, ist nicht eine silberne Kugel es hat seine Pluspunkte und Minus, die erforscht werden müssen. Ein mögliches Minus ist, dass die Implementierung eines Aggregators den Nachrichtenverkehr durch eine große Menge in unserem Fall nur verringern würde, wenn viele Nachrichten innerhalb einer relativ kurzen Zeit in Bezug auf die gleiche Bindung kommen. Auf der anderen Seite würden wir nichts erreichen, wenn der Java-Client nur Updates für ein Feld über alle Trader-Anleihen erhält. Wenn wir zum Beispiel 1000 Nachrichten in einem bestimmten Zeitrahmen mit 4 interessierenden Bonds erhalten, würden wir den Nachrichtenfluss von 1000 auf 4 Nachrichten in diesem Zeitrahmen reduzieren. Alternativ, wenn wir 1000 Nachrichten im gleichen Zeitrahmen mit 750 Bonds von Interesse erhalten, haben wir reduziert den Nachrichtenfluss von 1000 bis 750 Nachrichten relativ wenig Gewinn für den Aufwand. Eine schnelle Analyse der Nachrichtenaktualisierungen beweist, dass der Java-Client viele Nachrichten empfängt, die Felder der gleichen Bindung aktualisieren und damit verbundene Nachrichten. Also, Aggregator ist in der Tat eine gute Entscheidung. Was übrig bleibt, ist zu bestimmen, wie der Aggregator wissen wird, wann eine Nachricht gesendet wird, die er aggregiert hat. Das Muster beschreibt ein paar Algorithmen für die Aggregator zu wissen, wann die Nachricht zu senden. Dazu gehören Algorithmen, die bewirken, dass der Aggregator seinen Inhalt nach Ablauf einer bestimmten Zeitspanne aussendet, nachdem alle erforderlichen Felder in einem Datensatz abgeschlossen sind, und andere. Das Problem mit all diesen Ansätzen ist, dass der Aggregator den Nachrichtenfluss und nicht den Client steuert. Und der Client ist der große Engpass in diesem Fall, nicht der Nachrichtenfluss. Dies liegt daran, dass der Aggregator davon ausgeht, dass die Konsumenten seiner gelöschten Nachrichten (die Clientanwendung in diesem Fall) ereignisgesteuerte Konsumenten oder Verbraucher sind, die auf Ereignisse von einer externen Quelle angewiesen sind. Wir müssen den Kunden in einen Polling Consumer verwandeln. Oder einen Verbraucher, der kontinuierlich nach Nachrichten sucht, so dass die Client-Anwendung den Nachrichtenfluss steuern kann. Wir können dies tun, indem Sie einen Hintergrund-Thread, der kontinuierlich Zyklen durch die Menge von Bindungen und Updates und blinkt alle Änderungen, die seit der letzten Iteration aufgetreten sind. Auf diese Weise kontrolliert der Client, wann Nachrichten empfangen werden, und garantiert dadurch, dass er bei hohen Aktualisierungsperioden niemals mit Meldungen überlastet wird. Wir können dies leicht implementieren, indem wir eine Command Message an den Aggregator senden, die eine Aktualisierung initiiert. The Aggregator will respond with a Document Message containing the set of updated fields that the client will process. The choice of Aggregator over Message Filter is clearly a decision based solely on the business requirements of our system. Each could help us solve our performance problems, but using the Message Filter would solve the problem at cost of the system data integrity. Major Production Crash With the performance of the flashing fixed, we are now in production. One day the entire system goes down. MQSeries crashes, bringing several components down with it. We struggle with the problem for a while and finally trace it back to the MQSeries dead letter queue (an implementation of the Dead Letter Channel ). The queue grows so large that it brings down the entire server. After exploring the messages in the dead letter queue we find they are all expired market data messages. This is caused by slow consumers, or consumers that do not process messages fast enough. While messages are waiting to be processed, they time out (see the Message Expiration pattern) and are sent to the Dead Letter Channel . The excessive number of expired market data messages in the dead letter queue is a clear indication that the message flow is too great messages expire before the target application can consume them. We need to fix the message flow and we turn to patterns for help slowing down the message flow. A reasonable first step is to explore solving this problem with the Aggregator as we recently used this pattern to solve the similar flashing market data control rate problem. The system design relies on the client application to immediately forward market data update messages to the trading venues. This means the system cannot wait to collect messages and aggregate them. So the Aggregator must be abandoned. There are two other patterns that deal with the problem of consuming messages concurrently: Competing Consumers and Message Dispatcher . Starting with Competing Consumers . the benefit of this pattern is the parallel processing of incoming messages. This is accomplished using several consumers on the same channel. Only one consumer processes each incoming message leaving the others to process successive messages. Competing Consumers . however, will not work for us since we are using Publish-Subscribe Channel s in server-to-client communication. Competing Consumers on a Publish-Subscribe Channel channel means that all consumers process the same incoming message. This results in more work without any gain and completely misses the goal of the pattern. This approach also has to be abandoned. On the other hand, the Message Dispatcher describes an approach whereby you add several consumers to a pool. Each consumer can run its own execution thread. One main Message Consumer listens to the Channel and delegates the message on to an unoccupied Message Consumer in the pool and immediately returns to listening on the Message Channel . This achieves the parallel processing benefit of Competing Consumers . but works on Publish-Subscribe Channel s. The Message Dispatcher in context Implementing this in our system is simple. We create a single JMSListener called the Dispatcher, which contains a collection of other JMSListener s called Performers. When the onMessage method of the Dispatcher is called, it in turn picks a Performer out of the collection to actually process the message. The result of which is a Message Listener (the Dispatcher) that always returns immediately. This guarantees a steady flow of message processing regardless of the message flow rate. Additionally, this works equally well on a Publish-Subscribe Channel s as it does on a Point-to-Point Channel s. With this infrastructure, messages can be received by the client application at almost any rate. If the client application is still slow to process the message after receiving them, the client application can deal with the delayed processing and potentially outdated market data rather than the messages expiring in the JMS Message Channel . The crash discussed in this section and the fix using the Message Dispatcher is an excellent example of the limits of applying patterns. We encountered a performance problem based on a design flaw not allowing the client to process messages in parallel. This greatly improved the problem, but did not completely fix it. This is because the real problem was the client becoming a bottleneck. This couldnt be fixed with a thousand patterns. We later addressed this problem by refactoring the message flow architecture to route messages directly from the Pricing Gateway to the Contribution Gateway. So patterns can help design and maintain a system, but dont necessarily make up for poor upfront design. Throughout this chapter, we have applied patterns to several different aspects of a bond trading system including solving initial upfront design problems and fixing a nearly job threatening production crash with patterns. We also saw these patterns as they already exist in third party product, legacy components, and our JMS and TIBCO messaging systems. Most importantly, these are real problems with the same types of architectural, technical and business problems we experience as we design and maintain our own systems. Hopefully reading about applying patterns to this system helps give you a better understanding of the patterns as well as how to apply them to your own systems. Want to keep up-to-date Follow My Blog . Want to read more in depth Check out My Articles . Want to see me live See where I am speaking next . Find the full description of this pattern in: Enterprise Integration Patterns Gregor Hohpe and Bobby Woolf ISBN 0321200683 650 pages Addison-Wesley From Enterprise Integration to Enterprise Transformation: My new book describes how architects can play a critical role in IT transformation by applying their technical, communication, and organizational skills with 37 episodes from large-scale enterprise IT. Parts of this page are made available under the Creative Commons Attribution license. You can reuse the pattern icon, the pattern name, the problem and solution statements (in bold), and the sketch under this license. Other portions of the text, such as text chapters or the full pattern text, are protected by copyright. Messaging Patterns 187 Integration Patterns in Practice 187 Case Study: Bond Trading SystemSlideshare uses cookies to improve functionality and performance, and to provide you with relevant advertising. Wenn Sie fortfahren, die Website zu durchsuchen, stimmen Sie der Verwendung von Cookies auf dieser Website zu. Siehe unsere Benutzervereinbarung und Datenschutzbestimmungen. Slideshare verwendet Cookies, um Funktionalität und Leistung zu verbessern und Ihnen relevante Werbung zu bieten. Wenn Sie fortfahren, die Website zu durchsuchen, stimmen Sie der Verwendung von Cookies auf dieser Website zu. Siehe unsere Datenschutzrichtlinie und Benutzervereinbarung für Details. Explore all your favorite topics in the SlideShare app Get the SlideShare app to Save for Later even offline Continue to the mobile site Upload Login Signup Double tap to zoom out Trade And Settlement Process Share this SlideShare LinkedIn Corporation copy 2017Backtesting and Trade Systems Build it. Test it. Trade it. CQGs state-of-the-art backtesting and trade system tools put you in control of your strategies. Develop and optimize your system and signals by modeling against years of available historical data. When its, ready automatically trade it through CQGs AutoTrader. Add the trade system package to your CQG IC Test Your Ideas before Risking Your Money Our trade system package allows customers to analyze past trading activity and build strategies based on that activity. Take advantage of our features to fine-tune entry and exit points and test user-defined parameter values. Benefit from our numerous backtesting resources by examining trading activity based on the creation of long or short trades, a variety of entry and exit signals, and the commissions the trader must pay. Evaluate Entry Signals Using Your Favorite Conditions With Signal Evaluator, you can analyze effectiveness over a particular time period using your own specific buy and sell signals. Your analysis can be applied to both portfolios and individual commodities. Optimize Your System Parameters Optimize your workflow by using the Trade System Optimizer, a valuable trading tool that tests the results of trading systems running different settings and the combination of parameters included in trade signals. Automatically Trade Your Trading System Now that you have your trading system, have CQG automatically trade it. CQG AutoTrader is a proprietary trading execution engine that allows customers to simultaneously execute numerous systems at once with equal precision and discipline. In turn, it provides traders with greater capacity and accuracy in systems trading versus manual execution. The product supports various order types and allows customers to configure execution parameters related to price, size, and timing of orders. For maximum transparency, CQG AutoTrader is integrated with various position monitoring modules, such as the Orders and Positions window and the Automated Trading System (ATS) study, where customers can monitor trading signals and positions on charts and trading interfaces. CQG AutoTrader can be used in live or demo trading modes. Demo CQG AutoTrader with a free trial of CQG IC Backtesting Videos Powerful Automation CQG Product Specialist Doug Janson outlines CQG ICs automation features. Learn how to define formulas, test formulas using Entry Signal Evaluator, and create a trading system. View now Intelligent Backtesting CQG Product Specialist Jim Stavros demonstrates the effectiveness of using our backtesting and trade system tools. View now Compare Products 2-Week Free Trial Contact Us Compare Products 2-Week Free Trial Contact Us


No comments:

Post a Comment