De 20 000 à 4 millions Khanh Tuong Maudoux @jetoile
2
Qui suis- Khanh Tuong Maudoux Développeur Java indépendant blog : http://blog.jetoile.fr @jetoile khanh.maudoux@jetoile.fr 3
Contexte Collecteur Stockage Lecture Traitement 4
Contexte 5
Contexte Fonctionnel Réception de relevés de compteurs (fichiers xml) Fournir une consolidation (valorisation) des consommations en fonction de différents critères Algorithmes de lissage et de détection à faire sur les données Algorithmes de valorisation à faire sur les données 6
Contexte Volumétrie Avant : 20.0000 clients Cible : 4.000.000 clients Avec un pas de 30 minutes! ~ 3.000.000 fichiers par jours (~156 Go/jour) 7
Contexte État des lieux Algorithmes de lissage et de détection fait au moment de la collecte long» => anomalies «courantes» Algorithmes de consolidation exécutés par batch sur les données stockées 8
Contexte État des lieux Stockage TimeSeries Stockage Collecteur Consolidation Applicatif Stockage 9
Contexte État des lieux 10
Contexte Objectifs Objectif : Remplacer la solution de stockage Ne pas oublier la phase le ré-import totale! (~3 ans de données) 11
Collecteur 12
Collecteur Objectifs Batch de collecte avec stockage dans une solution propriétaire Objectifs : Valider différentes solutions (Cassandra, MySQL Cluster) Valider le modèle de données 13
Transformation JAXB Transformation Objet pivot Routage par xpath Transformation JAXB Transformation Objet pivot Collecteur État des lieux XML Java DTO Stockage XML Java DTO 14
Collecteur Pistes Pistes : Spring Batch EIP Spring Batch + EIP 15
Collecteur Outils / Framework : Spring Integration Metrics JMX / Jolokia Hawt.io Maven! 16
Collecteur Spring Integration Architecture «Pipe and Filters» 17
Transformation JAXB Transformation Objet pivot Routage par xpath Transformation JAXB Transformation Objet pivot Collecteur Spring Integration XML Java DTO Stockage XML Java DTO 18
Collecteur Spring Integration 19
Collecteur Spring Integration 20
Collecteur Spring Integration 21
Collecteur Spring Integration 22
Collecteur Spring Integration 23
Collecteur Spring Integration Message-history Scalabilité horizontale 24
Collecteur Metrics 25
Collecteur Jolokia JMX via HTTP/JSON 26
Collecteur Hawt.io 27
Collecteur Maven maven-jaxb2-plugin (org.jvnet.jaxb2.maven2) appassembler-maven-plugin (org.codehaus.mojo) 28
Collecteur endpoint REST pour injection 29
Stockage 30
Stockage Objectifs Rappels : Remplacer la solution existante de stockage Chaque capteur remonte une donnée toutes les 30 minutes Time series (au plus 50 000 colonnes par ligne) 31
Stockage Cassandra Base de données orientée colonnes Keyspace Column Family Column 32
Stockage Cassandra Time series : 1 ligne avec de multiples colonnes (clé composite) capteur_id event temperature event temperature CREATE TABLE capteur ( capteur_id text, event timestamp, temperature text, PRIMARY KEY (capteur_id, event) ) Ordonnée 33
Stockage Attention longueur/taille de ligne CREATE TABLE capteur ( capteur_id text, event_period text, event timestamp, value text, PRIMARY KEY ((capteur_id, event_period), event) ) Attention modélisation aggrégation 34
Stockage Jolokia Comme agent sur la JVM 35
Lecture 36
Lecture Objectifs Évaluer la pertinence de la solution de stockage Véloce Simple Remonté de métriques => injecteur! 37
Lecture Pistes Pistes : From scratch 38
Lecture Outils / Framework : RestEasy Netty Swagger JMX / Jolokia Hawt.io Maven Gatling / AB 39
Lecture RestEasy Netty : JAX-RS Netty Simple 40
Lecture Swagger : 41
Lecture Jolokia 42
Lecture Gatling 43
Traitement 44
Traitement Rappel Stockage TimeSeries Stockage Collecteur Consolidation Applicatif Stockage 45
Traitement Objectifs Objectif : Collecte Rapide Pas de pertes de données (sécurisation de la données) Détection des données fausses Faite en aval de la collecte Consolidation Faite sur les données «valides» avec stockage des mesures dans des «batch View» Séparation des concepts! 46
Traitement Objectifs Objectif : Lambda architecture Query = function (all data) 47
Transformation Objet pivot C*DAO Traitement Objectifs Objectif : collecte C* transformation C* C* Valo All datas Precompute views Batch views Batch Layer Service Layer Query = function (all data) 48
Traitement Spark / Hadoop 49
Traitement Objectifs? Volumétrie non acceptable pour la production : Duplication de la donnée Souhaite une solution avec calcul à la demande 50
Transformation Objet pivot C*DAO Traitement Objectifs? Traitement collecte C* transformation C* C* Valo All datas Precompute views Batch views Service Layer 51
Traitement Objectifs? Algorithme de lissage en amont 52
Conclusion 53
Merci! 54
Questions? 55
pas le feedback en sortant! ou?