Programmation À Faible Latence
j'ai beaucoup lu sur les systèmes financiers à faible latence (surtout depuis le célèbre cas de l'espionnage industriel) et l'idée de systèmes à faible latence est dans mon esprit depuis. Il ya un million d'applications qui peuvent utiliser ce que ces gars font, donc je voudrais en savoir plus sur le sujet. Le truc c'est que je ne trouve rien de valable sur le sujet. Est-ce que quelqu'un peut recommander des livres, des sites, des exemples sur les systèmes de faible latence?
12 réponses
je travaille pour une compagnie financière qui produit un logiciel de faible latence pour communiquer directement avec les bourses (pour soumettre les transactions et les prix de diffusion en continu). Nous développons actuellement principalement en Java. Bien que le côté de faible latence ne soit pas un domaine dans lequel je travaille directement, j'ai une idée juste des compétences requises, qui inclurait ce qui suit à mon avis:
- connaissance détaillée du modèle de mémoire Java et des techniques pour éviter le ramassage inutile des ordures (par exemple, objet mise en commun). Certaines des techniques utilisées peuvent généralement être considérées comme "anti-patterns" dans un environnement OO traditionnel.
- connaissance détaillée de TCP / IP et UDP multicast, y compris les utilitaires de débogage et de mesure de la latence (par exemple DTrace sur Solaris).
- expérience des applications de profilage.
- connaissance du java.NIO package, expérience dans le développement D'applications serveur évolutives basées sur NIO, expérience dans la conception de protocoles de câblage. Notez également que nous avons généralement évitez d'utiliser des cadres et des bibliothèques externes (par exemple Google Protobuf), préférant écrire beaucoup de code sur mesure.
- connaissance des bibliothèques de fixations et de fixations commerciales (par exemple Cameron FIX).
malheureusement, beaucoup de compétences ne peuvent être développées que "sur le tas" car il n'y a pas de substitut à l'expérience acquise dans la mise en place d'un serveur de prix ou d'un moteur de trading basé sur une spécification. à partir d'un échange ou d'un vendeur. Cependant, il est également intéressant de mentionner que notre société au moins tendent pas spécifiques de l'expérience dans ce créneau (ou dans d'autres), préférant embaucher des personnes ayant de bonnes compétences en analyse et en résolution de problèmes.
une faible latence est une fonction de beaucoup de choses, les deux plus importantes étant:
- latence du réseau-c.-à-d. le temps pris sur le réseau pour transmettre/recevoir des messages.
- traitement de la latence-c.-à-d. le temps que prend votre demande pour agir sur un message ou un événement.
donc, si vous écrivez un système de correspondance des commandes, la latence du réseau indiquerait combien de temps dans votre réseau vous avez été en mesure de recevoir la demande de correspondance des commandes. Et la latence de traitement représente le temps que prend votre application pour faire correspondre l'ordre avec les ordres existants, ouverts.
Multidiffusion, UDP multicast fiable, Noyau de dérivation (pris en charge par Java 7, Informatica Ultra de Messagerie, et bien d'autres) sur Infiniband réseaux sont les technologies utilisées par toutes les entreprises dans ce domaine.
de plus, il existe des cadres de programmation À Faible latence comme disruptor (http://code.google.com/p/disruptor/) qui mettent en œuvre la conception modèles pour le traitement avec une faible latence des applications. Ce qui pourrait vous tuer est d'avoir à écrire dans un DB ou des fichiers journaux dans le cadre de votre flux principal. Vous aurez à venir avec des solutions uniques qui répondent aux exigences du problème que vous essayez de résoudre.
dans des langages comme Java, implémenter votre application de telle sorte qu'elle crée (presque) zéro corbeille devient extrêmement important pour la latence. Comme le dit Adamski, avoir une connaissance du modèle de mémoire Java est extrêmement important. Comprendre différentes implémentations de JVM, et leurs limites. Les modèles de conception Java typiques autour de la création de petits objets sont les premières choses que vous allez jeter par la fenêtre - on ne peut jamais réparer le collecteur D'ordures Java assez pour atteindre une faible latence - la seule chose qui peut être réparé est les ordures.
Bonne chance!
Il y a beaucoup de bonne réponse dans ce post. Je voudrais ajouter mon expérience aussi
pour obtenir une faible latence en java, vous devez prendre le contrôle de GC en java, il y a plusieurs façons de le faire pour pré-allouer des objets(par ex. e utiliser flyweight design pattern), utiliser des objets primitifs-trove est très bon pour cela, toutes les structures de données sont basées sur primitif, Réutiliser l'exemple d'objet pour par exemple créer un dictionnaire à l'échelle du système pour réduire la création de nouveaux objets, très bonne option quand lecture des données de stream / socket / db
essayez d'utiliser l'algo sans attente (ce qui est un peu difficile), lock free algo. Vous pouvez trouver des tonnes d'exemple pour que
utiliser l'informatique en mémoire. La mémoire est bon marché, vous pouvez avoir tera byte de données en mémoire.
si vous pouvez maîtriser algo bit-wise alors il donne de très bonnes performances.
utiliser la sympathie technique - se référer disrupteur lmax, excellent cadre
Eh bien, ce n'est pas seulement la programmation en temps réel "traditionnelle", c'est tout. je travaille pour une bourse de vitesse est roi. un problème typique est quoi le moyen le plus rapide pour écrire dans un fichier? le moyen le plus rapide pour sérialiser un objet? etc.
N'importe quoi sur la programmation en temps réel pourrait convenir à la facture. Ce n'est pas exactement ce que vous cherchez, je suppose, mais c'est un très bon endroit pour commencer.
jetez un oeil à ZeroMQ. http://www.zeromq.org
lisez les livres blancs sur ce site et vous aurez un aperçu de ce qui est requis pour la programmation de faible latence.
si vous êtes intéressé par le développement de Java low-latency, vous devez savoir que cela peut être fait sans JVM RTSJ (temps réel) à condition de garder le collecteur d'ordures sous contrôle. Je vous suggère de prendre un coup d'oeil sur cet article cela parle de développement Java sans frais généraux de GC. Nous avons aussi beaucoup d'autres articles dans notre site qui parlent de composants Java à faible latence.
j'aimerais faire quelques commentaires sur la programmation À Faible Latence. Actuellement, j'ai plus de 5 ans d'expérience dans le développement de moteurs à faible latence et à haute exécution dans les logiciels financiers.
est-il nécessaire de comprendre ce qu'est la latence?
la latence signifie qu'il faut du temps pour terminer votre processus. Il ne dépend pas nécessairement les outils de développement que vous utilisez, comme java,c++,.etc net. il dépend de vos compétences en programmation, et système.
supposons que vous utilisez java, mais une erreur de votre part peut retarder le processus. Par exemple, vous avez développé une application de trading dans laquelle sur chaque prix rafraîchir vous appelez certaines fonctions et ainsi de suite. Cela peut entraîner des variables supplémentaires, une utilisation inutile de la mémoire, des boucles inutiles qui peuvent causer des retards dans le processus. Même application développée dans .net peut effectuer mieux que le java si le développeur s'est soucié des erreurs ci-dessus.
Cela dépend aussi de votre système de serveur, comme multi processeur système peut bien fonctionner si votre application est multithreaded.
si vous parlez de la conception de serveur à faible latence, voici quelques bons pointeurs: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/servers.html
généralement, travailler dans des environnements à faible latence signifie avoir une compréhension des dépendances d'appel et comment les réduire afin de minimiser la chaîne de dépendances. Cela comprend l'utilisation de structures de données et de bibliothèques pour stocker les données disponibles ainsi que le remaniement des ressources existantes afin de réduire les interdépendances.
http://g-wan.com/ fait tout dans les 200 KO avec le C ANSI scripts.