Les meilleures pratiques à mettre en œuvre une faible latence en direct de flux de données financières en utilisant 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 de 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.
Serais reconnaissant de toute pensée sur ce sujet, ou tout 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.
- Je ne suis pas sûr que WCF est sutable pour que. Il est trop épais. Je recommande les sockets raw + Protocole de Tampons. Pratique et très rapide.
- c'est exactement comment j'allais le faire; il y a plusieurs protocole de tampons de bibliothèques disponibles pour c#
- Gravel♦ je suis devenu un grand fan de Tampons de Protocole. Btw je utiliser votre application (protobuf-net) et c'est super! Merci pour elle! 🙂
- merci, pouvez-vous m'indiquer quelques études de cas ou de la documentation pour cette approche avec C#?
- Avez-vous eu un coup d'oeil à Node.js et sa mise en œuvre pour pub-sub tels que howtonode.org/redis-pubsub
- J'ai pensé que si vous sont à la poursuite de performances, vous ne devriez pas regarder .net, en premier lieu, l'ensemble du cadre est épaisse. Mais encore une fois, cela dépend de la vitesse est rapide.
- Je peux donc supposer que protobuf-net est compatible avec l'ordinaire de la proto-buf? (comme si un client C# est en train de parler avec un serveur C++).
- oui, le protocole binaire est le protocole binaire. Certaines fonctionnalités peuvent être plus facile ou plus difficile sur les différentes implémentations, bien sûr.
- TY. Peuvent-ils être pilotées par la même .proto fichier (en supposant que nous sommes seulement à faire des choses simples....)? Merci encore.
- oui, mais pour cela, vous pouvez trouver plus facile de travailler à partir de protobuf-csharp-port à la place.
- Nous avons réalisé plus de 14 millions de messages par seconde à l'aide de l'extérieur .Net port d'Aeron qui peut être trouvé ici : github.com/AdaptiveConsulting/Aeron.NET
Vous devez vous connecter pour publier un commentaire.
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 peut 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 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 excellent post 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, si.
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 interrompre la coalescence, 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!
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.
À 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 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?
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 de livrer 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 & 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.
Modifier: 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)
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:
Ne pas utiliser des fichiers XML ou tout autre humain
lisible méthode de transmission de votre
les 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
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:
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.
Cela pourrait être d'intérêt, bien que son spécifique pour le jeu ... La Latence la plus faible de petite taille Internet de données de protocole de transfert? c#
Voici un tutoriel sur la connexion UDP http://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8r.html
Un autre Article sur UDP
http://msdn.microsoft.com/en-us/magazine/cc163648.aspx
Vous demandez spécifiquement sur une "faible latence Utilisateur Nourrir". Que voulez-vous vraiment avec une faible latence, pour "Nourrir Seule" (et surtout si elle ne génère pas de revenus), les Utilisateurs attendez une seconde, ce n'est pas une faible latence.
Si vous voulez faire du commerce RAPIDE, alors vous devez vous déplacer à travers la rue de la Bourse (ou à proximité, avec un Lien Optique). Ensuite, vous devez Commerce sur la Carte; la Carte Ethernet est "intelligent" et est "nourri" le Commerce des Formules " que le programme de la Carte Réseau pour faire une sélection commerce basés sur les Données reçues (sans importuner votre Ordinateur).
Voir: http://intelligenttradingtechnology.com/article/groundbreaking-results-high-performance-trading-fpga-and-x86-technologies
Apprendre à manipuler que l'Environnement va acheter de vous plus que de réinventer la roue.
Ultra faible latence est coûteux, mais des milliards de dollars sont en jeu; vos enjeux (et de la poursuite de la baisse des temps de latence) à être étranglé par un $.
Dans le passé, j'ai utilisé Tibco rv ou les sockets raw pour le streaming des prix/tarifs, où la haute fréquence des mises à jour sont attendus. Dans cette situation, il est souvent le client (ou en fait l'utilisateur) qui est la limitation (car il ya seulement donc beaucoup de mises à jour d'un utilisateur peut traiter), et c'est donc un exemple de ce qu'on peut "perdre" des données. Dans cette situation, un service de courtier en douane peut être utilisé pour limiter les mises à jour.
Si le système est utilisé pour le trading automatique ou DFT, puis des produits comme 29West LatencyBuster a été prouvée à travailler bien et offre une garantie de messagerie.