J'ai récemment eu l’occasion d'implémenter l'intégration d'un flux assez conséquent : environ 4Go pour une initialisation (1 par an) puis plusieurs centaines de Mo pour les deltas hebdomadaires. Pendant les développements j'ai vu et j'ai pensé à certains trucs qu'il est bon de respecter lorsque l'on génère ou traite un si gros flux de données.

Tout d'abord il faut choisir son format. Pour ma part c'était du XML (imposé par le producteur). Il existe une multitude de format existant lisibles par une panoplie de librairies pour à peu près tous les langages. Le choix du format est fonction de ce que vous voulez (de ce que vous avez) à faire. Pour par part il fallait un format qui puisse être "lu" par un humain pour des questions d'analyse si jamais un jour l'algorithme d'intégration du flux décidait d'intégrer les choses à l'envers... ... (et de toutes façons le choix a été fait côté producteur)

Le XML est un format qui reste "humain", si ce n'est pas un de vos pré-requis optez pour des formats plus compacts, votre administrateur réseau vous remerciera sûrement et vous pourrez faire passer plus de données si jamais vous avec un très gros débit temps réel.

Un fois le format choisi il faut y mettre vos données, c'est là où il faut le plus faire attention. En effet vous aller créer un flux qui sera potentiellement consommé par n'importe qui utilisant n'importe quel langage/système donc faites attentions aux formats des données et typez les le plus fortement possible si votre format le permet (ie : ne déclarez pas tout en String dans votre XSD).

Si vous typez correctement vos données et que vous utilisez un format standard il y a de fortes chances que vous n'ayez pas à vous occuper de la sérialisation/de-sérialisation de vos données parce que la librairie que vous aurez choisie le fera très probablement à votre place (XStream en Java pour le XML par exemple). Cela à l'avantage de vous fournir à directement objets avec des champs typés et directement exploitable sans passer des heures à parser des Strings avec tous les risques que cela comporte. Cela évite donc les sorties non conformes parce que votre (dé)sérialiseur maison n'a pas lu/formaté la donnée correctement.

On pourrait parler encore des heures des flux mais ceci est le résultat de ma dernière expérience qui aurait être plus rapide à concrétiser si tout ceci avait été pris en compte. Je n'ai donc pas tout détailler mais voici d'autres point à prendre en compte :

  • Si vous êtes producteur :
    • Evitez tous les caractères inutiles comme les retours chariots (\r), les tabulations pour mettre en forme, les espaces multiples qui ne servent à rien...
    • Offrez la possibilité de compresser votre flux (avec un algo adapté comme GZip, BZip2)
    • Offrez la possibilité de ré émettre un flux
    • Prévoyez des tonnes d'exemples pour les développeurs qui consommeront votre flux.
  • Si vous êtes consommateur :
    • Faites attention à la charge que génèrera l'intégration de votre flux (insertions en base, moteur de calcul...) et décalez peut être l'intégration à des moments de la journée où la charge est plus faible.
    • Stockez l'original du flux ! Si jamais un problème arrive pendant l'intégration vous serez content d'avoir les données. Si votre flux est temps réel il serait sûrement intéressant d'avoir un 'recorder/replayer' de flux différent du système qui consomme le flux afin de pouvoir tester/développer/debugger
    • Mesurez, re mesurez, et encore... il est important de savoir qu'elle quantité de données vous recevez, combien de temps vous mettez à les lire puis à les traiter.
    • Ne faites jamais confiance au producteur s'il vous fourni des chiffres, revérifiez les ! Le flux a pu grossir depuis sa conception et les chiffres n'ont pas été remis à jour
    • Ne prenez pas pour argent comptant les dire du producteurs sur les contraintes 'fonctionnelles', 'techniques', 'sûres', 'sur la vie d'ma mère'. S'il vous garanti qu'un champs n'est jamais null ajoutez quand même le test dans votre code, s'il vous dit qu'il y a une clé unique faites quand même la votre ou vérifiez l'unicité à chaque traitement, ... bref soyez paranoïaque...