36 votes

Méthode recommandée pour mettre en œuvre un flux de données financières en temps réel à faible temps de latence avec WCF?

J'ai un .NET service qui doivent nourrir le vivre données financières de ses clients. Le taux de sortie pour ce flux pourrait obtenir intense et je suis à la recherche de la meilleure architecture pour mettre en œuvre ce type de service avec une faible latence et haute performance.

Je pensais à l'aide d'une sorte de flux de données fournisseur, celui qui est utilisé pour l'audio ou la vidéo, mais envoyer les flux de mises à jour à la place.

Apprécie les de la pensée sur ce sujet, ou de l'un quelconque des exemples du monde réel

Mise à jour:

Je n'ai pas à utiliser WCF, qui ne fut ma première approche car elle est la technologie actuelle. Toute autre mise en œuvre en C# est la bienvenue.

38voto

strangelydim Points 521

La Divulgation complète: je travaille pour Informatica (anciennement 29West) et je suis sur l'équipe d'ingénierie responsable de leurs produits de messagerie. Je suis partial. Je ne, cependant, ont une assez bonne compréhension de la faible latence de messagerie dans le marché financier.

Si vous message les tarifs sont d'environ 60 messages/sec. (comme indiqué dans un commentaire sur la Volonté du Doyen de réponse), et ils sont livrés à une interface graphique avec un homme assis en face de lui et à faire réagir le marché de l'homme-vitesse, honnêtement il n'est pas question beaucoup ce logiciel que vous utilisez à partir d'un temps de latence point de vue. Vous pourriez même être en mesure de s'en tirer avec l'aide de la WCF (même si je serais encore recommandons contre elle; on envisage d'appuyer une fois et prototypé un adaptateur pour elle et il pléthorique des latences par un ordre de grandeur - nous avons décidé de ne pas s'embêter avec ça à l'époque).

Maintenant, Informatica logiciel de messagerie peuvent passer des messages entre processus sur la même machine en moins d'une microseconde, et si vous voulez acheter quelques belles 10 gig-E Nic avec un noyau de dérivation ou InfiniBand du matériel, vous pouvez passer des millions de messages par seconde entre les machines avec un seul chiffre microsecondes de la latence. Nous allons également bientôt sortir un nouveau sérialisation de données de la bibliothèque pris en charge en C/C++, Java et .NET dans le cadre de la messagerie produit que, dans certains cas, c'est effectivement plus rapide que le Protocole Tampons (même si le Protocole Tampons sont largement utilisés et également un très bon choix). Notre .NET et Java Api les deux ont une fonctionnalité appelée "ZOD" pour "Zéro de l'Objet de Livraison", ce qui est plutôt une drôle de façon de dire qu'elles ne génèrent pas de nouveaux objets lors de la livraison du message, ce qui signifie pas de collecte des ordures pauses & associés des pics de latence/valeurs aberrantes. Nous avons un autre produit appelé UMD qui est conçu spécialement pour fan de base à haut débit de circulation plus lente des applications de bureau sans ralentir la colonne vertébrale ou d'autres clients.

Je pourrais continuer encore et encore sur la façon dont grand d'Informatica logiciel de messagerie est et je ne pense qu'il vaut la peine de vérifier, mais cela ressemble déjà à un straight-up ad, et je suis ingénieur, pas une personne de vente. Voici donc quelques morceaux de plus de conseils généraux:

  • Si vous avez beaucoup de clients qui reçoivent les mêmes données, vous aurez envie certaine saveur de multidiffusion UDP. Vous voudrez souvent un fiable multidiffusion le transport de quelque nature: le bien-connus (et gratuit) fiable protocole de multidiffusion est PGM. Windows inclut une implémentation de PGM qui est utilisable en C#; je vais vous référer à Mike Rettig de l' excellent billet de blog sur la façon de l'utiliser si vous voulez l'essayer. (Je sais, Mike - il est un gars intelligent.) Le choix du protocole est une zone dans laquelle vous obtenez ce que vous payez; Informatica de messagerie comprend un support fiable protocole de multidiffusion vaguement basé sur des PGM (notre architecte qui l'a conçu a co-écrit le PGM RFC longtemps à l'arrière), mais avec beaucoup d'améliorations majeures. Plaine PGM peut être très bien pour ce que vous avez besoin, cependant.

  • Vous voulez aller avec une brokerless/sans serveur de l'architecture. Avoir les applications de communiquer d'égal à égal avec rien dans le milieu. Éviter supplémentaire de houblon dans le chemin de message (ce qui signifie en général d'éviter la plupart des JMS implémentations, à éviter presque rien avec "file d'attente" dans le nom quelque part, etc.).

  • Être conscient de la façon dont votre système se comporte lorsqu'un client se comporte mal. Peut-on ralentir la consommation de ralentir tout le monde?

  • Il y a beaucoup d'OS de paramétrage du BIOS et des options de paramétrage qui peut profiter à toute sorte de faible latence de messagerie, fait maison ou acheté - des choses comme l' interruption de la coalescence, en les liant NIC interruptions à un cœur de PROCESSEUR, l'échelle côté réception (qui a toujours été terrible, lorsqu'il est utilisé avec UDP sur Windows, mais devrait être d'obtenir beaucoup mieux à l'avenir), la désactivation de certaines de puissance CPU unis, etc.

  • Résister à la tentation d'utiliser les haut-sérialisation d'un objet dans .NET pour envoyer l'ensemble des objets sur le fil - c'est un ordre de grandeur plus lent que la simple utilisation d'un format binaire (comme le Protocole de Tampons, ou la sérialisation de la bibliothèque ou de votre propre format binaire, etc.).

Si vous avez des questions plus spécifiques ou besoin de plus de détails sur aucun de mes conseils, faites le moi savoir!

6voto

Will Dean Points 25866

Comment bas "faible latence" et comment occupé est "intense"? Vous devez avoir une idée de ce que vous visez à choisir la bonne approche.

Je pourrais vous fournir certains matériels qui permettraient de répondre à 100% de toutes les demandes dans les, disons, 20us jusqu'à la pleine capacité de votre matériel réseau, mais il ne serait pas utiliser WCF beaucoup à tous les.

Pour une très large approximation, je dirais que des choses comme WCF sont de très haut niveau et les échanges, la facilité d'utilisation et l'abstraction-pour-les-avantages-de-la-programmeur à l'encontre de la performance (temps de latence/débit). Si ils font le commerce il trop grand pour les besoins de votre application de nombres réels.

Le plus faible temps de latence, et les plus bas frais généraux IP basée sur le protocole d'usage courant, est de l'UDP - c'est pourquoi il est utilisé pour des choses comme le DNS et NTP. Il est très évolutive sur le serveur, car le serveur n'a pas besoin de tout état, et il est très simple à mettre en œuvre sur presque n'importe quelle plateforme. Mais vous avez besoin de penser en termes de réseau de paquets plutôt que .NET des objets. Arrivez-vous à fournir au client le bout de logiciels trop?

3voto

Teoman Soygul Points 17544

Vivre données financières? Ne jamais compter sur WCF sur que. Au lieu de cela, aller avec ce que les autres industries utilisent. c'est à dire NASDAQ utilise en Temps Réel des Innovations - Service de Distribution de Données pour fournir du stock de tiques pour les utilisateurs. Ils fournissent des C/C++/C# api pour leurs communications, les bibliothèques, ce qui est extrêmement facile à installer et à utiliser (par rapport à la WCF).

En général, ce type de données en temps réel des flux d'utiliser publier/souscrire paradigme qui permet de s'assurer que la communication se fait avec un minimum de frais généraux. Ce type d'approche est l'idée principale dans le message orienté milieu de la vaisselle et c'est exactement ce que les services financiers d'utilisation en temps réel des choses.

Sur un côté du nœud, vous pouvez diffuser en temps réel audio-vidéo paquets à l'aide de la RTI-DDS bibliothèque, autant que je sache, les véhicules aériens sans pilote comme MQ-9 utilise à nouveau cette bibliothèque pour fournir de la vidéo en direct et geo-information d'emplacement au sol, les postes de contrôle.

Il y a aussi libre service de distribution de données des bibliothèques, mais j'ai aucune expérience dans les. Vous avez juste besoin de google pour cela.

Edit: je suis en train de prototypage certains IHM (interface homme machine) logiciel qui utilise susmentionnés RTI-DDS bibliothèques ainsi que deux autres bibliothèques qui ont ce message d'architectures orientées, qui a fait un travail un fil jusqu'à maintenant pour tous mes temps réel les besoins de communication. Voici une démo: http://epics.codeplex.com/ (Il sera utilisé dans le contrôle à distance de l'équipement dans notre nouvelle marque de recherche nucléaire de l'installation)

3voto

hifier Points 262

Le plus d'hypothèses que vous faites et les caractéristiques de couper le plus vite vous pouvez le faire à votre système. Le plus robuste et souple à vous essayer de faire des choses, plus vos performances s'en ressentiront. Je vous suggère un peu de base indispensables:

  1. De données binaire format de sérialisation. Ne pas utiliser des fichiers XML ou tout autre humain lisible méthode de transmission de votre les données.
  2. Un robuste suffisamment de données format de sérialisation qu'il peut support multi-architecture, la croix-langue des points de terminaison. BER vient à l'esprit - C# semble avoir le soutien
  3. Un protocole de transport qui a la garantie de livraison et données de l'intégrité. Si n'importe quel type de financiers algorithme à l'aide de ces données, même pas un tick pourrait signifier la différence entre et afin d'être déclenchée ou manquant sur un prix. Même si vous êtes va agréger les tiques dans votre serveur vous voulez encore plus de contrôle comment l'information est présentée à de vos clients. TCP fonctionne sur les systèmes distribués. Cependant, il existe beaucoup plus rapide de solutions de rechange si vos clients sont sur la même machine que votre serveur. UDP n'a même pas de garauntee ordre, ce qui peut être problématique (mais pas insurmontable).

À l'égard du traitement interne:

  1. Éviter de chaînes et d'autres classes qui ajouter une surcharge importante de simple les tâches. Utilisation de base des tableaux de caractères au lieu de cela. Je ne suis pas sûr de ce que les options de vous avez en C# ou même si vous avez léger alternatives. Si oui, utiliser eux. Cela s'applique aux données-structures.
  2. Être conscient de la double/float comparaison des erreurs. Utilisez la comparaison que seulement vérifier le niveau de précision nécessaire. Si cela est possible de convertir tout entiers à l'interne et de fournir suffisamment de métadonnées pour revenir sur l'autre extrémité.
  3. Utiliser quelque chose de similaire à mis en commun allocateurs en C++. Mon manque de connaissance de C# qui m'empêche d'être plus précis. De nouveau, C# n'est probablement pas le meilleur choix ici. Ligne de fond est que vous allez être de la création et de la destruction d'un lot de cocher les objets et il n'y a pas de raison de demander au système d'exploitation pour la mémoire de tous les temps.
  4. Seulement envoyer des deltas, ne pas envoyer des informations que vos clients ont déjà. Cela suppose l'utilisation d'un transport avec une garantie de livraison. Sinon, vous pourriez vous retrouver l'affichage des données périmées depuis longtemps.

1voto

Jonathan Points 1011

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X