Améliorez les performances: Parallel processing with Camel & Spring (Partie 1/2)

Ce billet s'inscrit dans la catégorie optimisation des performances.

Il se fixe comme objectif d'illustrer avec démo détaillée comment améliorer significativement les performances de nos projets.

Et cela sans se lancer dans l'aventure d'écrire des kilomètres de code lourd de gestion du 'parallel processing' car nous allons laisser la puissance du framework Camel opérer.

Sachez néanmoins que de nombreux problèmes de mauvaise performance peuvent être traités sans recours aux implémentations complexes de parallélisme.

Voici deux situations où il faudrait réfléchir sur l'apport du parallélisme :

- Si les tâches ou opérations ne prennent que très peu de temps (échelle quelque sec). La gestion/monitoring des threads devient coûteux.

- Si les ressources mémoire, CPU et IO sont déjà fortement utilisées; sachez que le parallélisme consomme davantage de ressources.

Le billet veut s'inspirer (librement) des deux étapes décrites dans la démo du chapitre 10 du livre "Camel in action".

L'essentiel du code source est fourni ici.

Sachez néanmoins que le code présenté ci-après a été largement adapté et pour certaines parties complètement réécrits.

En effet, comme j'utilise Spring, toutes les parties de code sont adaptées ou réécrites en fonction.

En particulier j'utilise l'implémentation spring ThreadPoolTaskExecutor de l'interface TaskExecutor à la place de la méthode statique de Executors de java.

Le billet est organisée en deux parties:

- La première partie permet d'exécuter en séquentiel notre démo,

- La seconde permet adapte la première partie pour une exécution parallèle.

Nous donnons quelques indications sur le temps d'exécution de chacune des parties.

Avec les bons paramètres nous pouvons diviser par quatre le temps d'exécution voire plus.

Le framework Camel offre avec son java DSL des fonctions permettant d'obtenir simplement de meilleurs performances en parallélisant les tâches.

Comme d'habitude nous le combinons avec le framework Spring v3+ car peut-on faire autrement?

Dans le domaine de performance, il est utile d'identifier les deux limites: CPU-bound et IO-bound.

Distinguer ces deux limites permet d'identifier le bon choix pour améliorer les performances.

En guise de conclusion, dans le domaine d'exécution parallèle, Camel simplifie grandement la vie des développeurs.

Néanmoins, il leur reste la responsabilité de la cohésion des données.

Passons à la mise en pratique.

Composant Camel-Bindy: Comment transformer les données non structurées

On s'intéresse ici au composant 'camel-bindy' qui permet de transformer des données non structurées (csv par exemple) en objets java et inversement.

La démo est réalisée en quatre actes: configurer le pom du projet, dessiner et déclarer la route, annoter le bean du model et enfin tester.

la v2.10.2 de camel-bindy est utilisée.

camel-logo.png

Voici les détails de la démo.

Camel: Routing Slip

Pendant le développement, nous rencontrons souvent le problème de routage et de traitement de messages. Par exemple, vous devez créer une application dont le but est de trier les messages dynamiquement et de les traiter selon vos besoins.

Dans un projet récent, nous avons opté pour le pattern : « Routing Slip » comme solution.

Une route Camel v2, Spring & SMTP : Envoi de mail

Apache Camel est un framework open source permettant de faire l'EIP (Entreprise Integration Pattern).
On présente ici une démo concrète un peu avancée sous maven.
On combine Camel v2 et Spring pour réaliser l'envoi de mails.
L'illustration repose sur le protocole SMTP mais d'autres protocoles (POP3,..) peuvent être adaptés.
Spring offre son propre framework d'intégration avec un vocabulaire proche de la littérature EIP.
Prochainement, je présenterai Spring-Integration pour l'envoi de mails via son channel.

Passons à la pratique