web-dev-qa-db-fra.com

Programmation à faible latence

J'ai beaucoup lu sur les systèmes financiers à faible latence (en particulier depuis le célèbre cas d'espionnage d'entreprise) et l'idée de systèmes à faible latence est dans mon esprit depuis. Il y a un million d'applications qui peuvent utiliser ce que font ces gars, donc j'aimerais en savoir plus sur le sujet. Le fait est que je ne trouve rien de valable sur le sujet. Quelqu'un peut-il recommander des livres, des sites, des exemples sur les systèmes à faible latence?

44
Sambatyon

Je travaille pour une société financière qui produit des logiciels à faible latence pour communiquer directement avec les bourses (pour soumettre des transactions et des prix de streaming). Nous développons actuellement principalement en Java. Bien que le côté à faible latence ne soit pas un domaine dans lequel je travaille directement, j'ai une bonne idée des compétences requises, ce qui comprendrait à mon avis les éléments suivants:

  • Connaissance détaillée du Java et techniques pour éviter le ramasse-miettes inutile (par exemple le regroupement d'objets). Certaines des techniques utilisées peuvent généralement être considérées comme des "anti-modèles" dans un environnement OO traditionnel .
  • Connaissance détaillée de la multidiffusion TCP/IP et UDP, y compris des utilitaires pour le débogage et la mesure de la latence (par exemple DTrace sur Solaris).
  • Expérience avec les applications de profilage.
  • Connaissance du package Java.nio, 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 évitons généralement d'utiliser des frameworks et des bibliothèques externes (par exemple, Google Protobuf), préférant écrire beaucoup de code sur mesure.
  • Connaissance de FIX et des bibliothèques FIX commerciales (par exemple Cameron FIX).

Malheureusement, de nombreuses compétences ne peuvent être développées que "sur le tas", car rien ne peut remplacer l'expérience acquise lors de la mise en œuvre d'un serveur de prix ou d'un moteur de trading basé sur une spécification. d'un échange ou d'un vendeur. Cependant, il convient également de mentionner que notre entreprise a au moins tendance à ne pas rechercher d'expérience spécifique dans ce (ou autre) créneau, préférant plutôt embaucher des personnes ayant de bonnes compétences analytiques et de résolution de problèmes.

45
Adamski

La faible latence est fonction de nombreuses choses, les deux plus importantes étant:

  • latence du réseau - c'est-à-dire le temps mis sur le réseau pour transmettre/recevoir des messages.
  • latence de traitement - c'est-à-dire le temps mis par votre application pour agir sur un message/événement.

Donc, si vous dites que vous écrivez un système de correspondance des commandes, la latence du réseau représenterait la rapidité avec laquelle au sein de votre réseau avez-vous pu recevoir la demande de correspondance des commandes. Et la latence de traitement représenterait le temps pris par votre application pour faire correspondre la commande avec les commandes ouvertes existantes.

La multidiffusion, l'UDP, la multidiffusion fiable, le contournement du noyau (pris en charge par Java 7, Informatica Ultra Messaging et bien d'autres) sur les réseaux Infiniband sont quelques technologies courantes 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 implémentent des modèles de conception pour gérer les applications à faible latence. Ce qui pourrait vous tuer, c'est d'avoir à écrire dans une base de données ou des fichiers journaux dans le cadre de votre flux de travail principal. Vous devrez trouver des solutions uniques qui répondent aux exigences du problème que vous essayez de résoudre.

Dans des langages comme Java, l'implémentation de votre application de telle sorte qu'elle crée (presque) zéro ordure devient extrêmement importante pour la latence. Comme le dit Adamski, avoir une connaissance de Java modèle de mémoire est extrêmement important. Comprendre les différentes implémentations JVM et leurs limites. Typique Java modèles de conception autour de la création de petits objets) sont les premières choses que vous jeterez par la fenêtre - on ne peut jamais réparer le Java Garbage Collector assez pour atteindre une faible latence - la seule chose qui peut être corrigée est la poubelle.

Bonne chance!

24
inder

Il y a beaucoup de bonnes réponses dans ce post. Je voudrais également ajouter mon expérience

  • Pour obtenir une faible latence dans Java vous devez prendre le contrôle de GC en Java, il existe de nombreuses façons de le faire, par exemple pour pré-allouer des objets (c'est-à-dire utiliser un modèle de conception à poids variable), utiliser des objets primitifs - trove est très bon pour cela, toutes les structures de données sont basées sur une instance d'objet primitive, par exemple pour créer un dictionnaire à l'échelle du système pour réduire la création de nouveaux objets, très bonne option lors de la lecture de données à partir de stream/socket/db

    • Essayez d'utiliser l'algo sans attente (ce qui est un peu difficile), verrouillez l'algo libre. Vous pouvez trouver des tonnes d'exemples pour cela

    • Utilisez l'informatique en mémoire. La mémoire est bon marché, vous pouvez avoir un téra octet de données en mémoire.

    • Si vous pouvez maîtriser l'algo bit à bit, cela donne de très bonnes performances.

    • Utilisez la sympathie technique - Référez le perturbateur lmax, excellent cadre

8
Ashkrit Sharma

Je voudrais 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.

Faut-il comprendre ce qu'est la latence?

La latence signifie qu'il faut du temps pour terminer votre processus. Cela ne dépend pas nécessairement des outils de développement que vous utilisez, comme Java, c ++ ,. net, etc., cela dépend de vos compétences en programmation et de votre 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, à chaque rafraîchissement de prix, 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 entraîner un retard dans le processus. La même application développée dans .net peut être plus performante que la Java si le développeur se souciait des erreurs ci-dessus.

Cela dépend également de votre système de serveur, comme le système multiprocesseur peut bien fonctionner si votre application est multithread.

7
harshad lakkad

Jetez un œil à ZeroMQ. http://www.zeromq.org

Lisez les livres blancs sur ce site et vous aurez un aperçu de ce qui est requis pour une programmation à faible latence.

6
Ed James

Eh bien, ce n'est pas seulement une programmation en temps réel "traditionnelle", c'est tout. je travaille pour une bourse - la vitesse est roi. un problème typique est quel est le moyen le plus rapide d'écrire dans un fichier? le moyen le plus rapide de sérialiser un objet? etc.

5
alex lerner

Si vous êtes intéressé par Java développement à faible latence, vous devez savoir que cela peut être fait sans JVM RTSJ (temps réel) à condition de garder le Garbage Collector sous contrôle. Je vous suggère jetez un oeil sur cet article qui parle de Java Développement sans surcharge du GC. Nous avons aussi beaucoup d'autres articles dans notre site qui parlent de faible latence Java.

4
rdalmeida

Tout ce qui concernait la programmation en temps réel conviendrait parfaitement. Ce n'est pas précisément ce que vous recherchez, je suppose, mais c'est un très bon point de départ.

4
Paul Sonier

Si vous parlez de conception de serveur à faible latence, voici quelques bons conseils: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/ servers.html

2
sunil

http://g-wan.com/ fait tout cela en 200 Ko avec des scripts C ANSI.

1
Michel

Si je me souviens bien en temps réel Java ( RTSJ ) est utilisé dans cette zone, bien que je n'aie pas pu trouver un bon article vers un lien vers maintenant.

1
starblue

Généralement, travailler dans des environnements à faible latence signifie avoir une compréhension des dépendances d'appels et comment les réduire pour 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 pouvant être mises en cache souhaitées ainsi que la refactorisation des ressources existantes pour réduire les interdépendances.

1
Paul Sonier