Drools et les moteurs de règles

40,818 views

Published on

Cette présentation aborde plusieurs points :

* Qu'est-ce qu'un moteur de règles ?
* Drools, les alternatives et son historique.
* Résumé d'un comparatif de moteur de règles.
* Première règle, une règle simple !
* Règles lisibles pour un humain (DSL et Table de décision).
* Drools Guvnor (BRMS/BPMS, système de gestion de régles métiers).
* Drools Flow (Flow/WorkFlow).
* Drools Fusion (Event Processing).
* Performance :
o Algorithme de Rete

La présentation fut dense. En effet, le focus a été mis sur la dernière version de Drools, la version 5, qui propose énormément de fonctionnalités.

Published in: Technology, Education

Drools et les moteurs de règles

  1. 1. www.xebia.fr / blog.xebia.fr
  2. 2. Nicolas LE COZ - XKE de décembre 2009 Business Logic integration Platform (BLiP) www.xebia.fr / blog.xebia.fr
  3. 3. Programme du XKE Drools <ul><li>Qu’est ce qu’un moteur de règles </li></ul><ul><li>Drools, les alternatives et son historique </li></ul><ul><li>Résumé d’un comparatif de moteurs de règles </li></ul><ul><li>Première règle, une règle simple ! </li></ul><ul><li>Règle lisible pour un humain </li></ul><ul><ul><li>DSL ( Domain Specific Language) </li></ul></ul><ul><ul><li>Table de décision </li></ul></ul><ul><li>Drools Guvnor (BRMS/BPMS) </li></ul><ul><li>Drools Expert (Moteur de règles) </li></ul><ul><li>Drools Flow (Flow/Workflow) </li></ul><ul><li>Drools Fusion (Event Processing) </li></ul><ul><li>Performance </li></ul>
  4. 4. Présentation inspirée de … <ul><li>Livres disponibles à la bibliothèque de Xebia </li></ul>
  5. 5. Qu’est ce qu’un moteur de règles (1/2) <ul><li>Pourquoi utiliser un moteur de règles </li></ul><ul><ul><li>Séparer les traitements et les données (règles et faits) </li></ul></ul><ul><ul><li>Faire de la programmation déclarative ( Qu’est ce que je fais plutôt que comment je le fais ) </li></ul></ul><ul><ul><li>Rapidité et dimensionnement </li></ul></ul><ul><ul><ul><li>L’agorithme Rete pour trouver les règles en fonction de vos objets métiers </li></ul></ul></ul><ul><ul><li>Centralisation et gestion de la connaissance </li></ul></ul><ul><ul><ul><li>Règles compréhensibles par les humains </li></ul></ul></ul>
  6. 6. Qu’est ce qu’un moteur de règles (2/2) <ul><li>Quand utiliser un moteur de règles </li></ul><ul><ul><li>Pour un problème simple qui sera résolu avec de la “cuisine” / “bricolage” algorithmique </li></ul></ul><ul><ul><li>Un problème trop difficile à résoudre avec des algorithmes traditionnels </li></ul></ul><ul><ul><li>La logique métier change fréquemment </li></ul></ul><ul><ul><ul><li>Ex : une solution e-commerce qui a une stratégie commerciale de vente </li></ul></ul></ul><ul><ul><li>Les experts fonctionnels doivent modifier les règles dynamiquement </li></ul></ul><ul><ul><ul><li>Qui est convaincu ? </li></ul></ul></ul><ul><li>Quand ne pas utiliser un moteur de règles </li></ul><ul><ul><li>Petit projet ( > 20 règles) => sur conception </li></ul></ul><ul><ul><li>Logique métier est bien défini et change rarement </li></ul></ul><ul><ul><li>Les règles sont simples et peuvent être contenu dans un même objet </li></ul></ul><ul><ul><ul><li>Ex : Vérifier que l’âge d’un utilisateur est inférieur à 18 ans </li></ul></ul></ul><ul><ul><li>La performance est votre principale inquiétude (règles et faits sont en mémoire!) </li></ul></ul><ul><ul><li>Vous n’avez pas de temps et d’argent pour former les développeurs </li></ul></ul>
  7. 7. Qu’est ce que Drools ? <ul><li>Drools est une plateforme d’intégration de logique métier Business Logic Integration Platform (BLiP) </li></ul><ul><ul><li>Écrit en Java sous licence Apache license 2.0 </li></ul></ul><ul><ul><li>Support est assuré par JBoss et Red Hat </li></ul></ul><ul><ul><li>Depuis mai 2009, Drools a été livré en version 5.0 </li></ul></ul><ul><ul><li>Se repose sur l’algorithme de Rete, pour l’amélioration des performances </li></ul></ul><ul><li>Les alternatives </li></ul><ul><ul><li>Commerciales : </li></ul></ul><ul><ul><ul><li>JRules (ILOG maintenant IBM) </li></ul></ul></ul><ul><ul><ul><li>Baze Advisor, Corticon’s BRMS (Fair Isaac) </li></ul></ul></ul><ul><ul><ul><li>PegaRules (Pegasystems) </li></ul></ul></ul><ul><ul><ul><li>OPSJ (Product Systems Technologies) </li></ul></ul></ul><ul><ul><li>.Net : MS BizTalk Server, InRule de WWF Windows Workflow Foundation </li></ul></ul><ul><ul><li>Open Source : OpenRules, Jess </li></ul></ul><ul><ul><li>Le design pattern Specification (Martin Fowler, Eric Evans) </li></ul></ul>
  8. 8. Historique de Drools <ul><li>Version 1 : 2001 </li></ul><ul><ul><li>A commencer avec une recherche linéaire “brute de force” </li></ul></ul><ul><li>Version 2 : </li></ul><ul><ul><li>Réécrit avec l’algorthime de Rete => boost les performances </li></ul></ul><ul><ul><li>Règle en XML => pas forcement le meilleur choix </li></ul></ul><ul><li>Version 3 : </li></ul><ul><ul><li>Introduction d’un nouveau format de règle .drl </li></ul></ul><ul><li>Version 4 : </li></ul><ul><ul><li>Plusieurs améliorations majeures des performances </li></ul></ul><ul><ul><li>Première livraison d’un système de gestion de règles (via une IHM) Business Rules Management System (BRMS) </li></ul></ul><ul><li>Version 5 : 2009 </li></ul><ul><ul><li>Devient Business Logic integration Platform , et est découpé en 4 modules : </li></ul></ul><ul><ul><ul><li>Drools Expert, Drools Fusion, Drools Flow, Drools Guvnor </li></ul></ul></ul>
  9. 9. Résumé d’une étude comparative (1/8) <ul><li>Solutions envisagées : </li></ul><ul><li>Solutions écartées </li></ul><ul><ul><li>Jess </li></ul></ul><ul><ul><ul><li>Licence commerciale, par utilisable pour un site eCommerce commerciale </li></ul></ul></ul><ul><ul><li>Groovy Rules v1.0rc1 </li></ul></ul><ul><ul><ul><li>Pas prêt pour la production </li></ul></ul></ul>
  10. 10. Résumé d’une étude comparative (2/8) <ul><li>Drools – superstar mais trop complexe </li></ul>
  11. 11. Résumé d’une étude comparative (3/8) <ul><li>Java Rules Engines, exemple de règle : </li></ul><ul><li>Dommage de faire du XML pour faire des if/then/else !!! </li></ul>
  12. 12. Résumé d’une étude comparative (4/8) <ul><li>Java Rules Engines : </li></ul>
  13. 13. Résumé d’une étude comparative (5/8) <ul><li>Solution reposant sur Groovy : </li></ul>
  14. 14. Résumé d’une étude comparative (6/8) <ul><li>Solution développée avec du java “à l’ancienne” </li></ul>
  15. 15. Résumé d’une étude comparative (7/8) <ul><li>Résultat final : </li></ul><ul><ul><li>Drools : 28/50 => puissant mais trop complexe </li></ul></ul><ul><ul><li>Java Rules Engines : 17/50 => JSR-94 => rien d’intéressant </li></ul></ul><ul><ul><li>Groovy : 30/50 => la syntaxe groovy </li></ul></ul><ul><ul><li>Java à l’ancienne : 35/50 => simplicité </li></ul></ul><ul><li>Solution retenue </li></ul><ul><ul><li>Groovy + Java à l’ancienne (design pattern Specification) </li></ul></ul><ul><ul><ul><li>Respect du besoin initial </li></ul></ul></ul><ul><ul><ul><li>Simplicité </li></ul></ul></ul><ul><ul><ul><li>Puissance grâce à la syntaxe et dynamisme des Groovy Spring Bean </li></ul></ul></ul><ul><ul><ul><li>Rapidement opérationnel </li></ul></ul></ul><ul><ul><li>Retour d’expérience après 6 mois d’utilisation </li></ul></ul><ul><ul><ul><li>Très simple et puissant (assez bluffant même) </li></ul></ul></ul><ul><ul><ul><li>Nécessite un peu de code technique pour améliorer l’exploitabilité de la solution (supervision, gestion des règles – activation / déactivation) </li></ul></ul></ul>
  16. 16. Résumé d’une étude comparative (8/8) <ul><li>Cas d’utilisation sur un grand site d’eCommerce en France : </li></ul><ul><ul><li>Promotion </li></ul></ul><ul><ul><ul><li>En fonction du panier, de la commande </li></ul></ul></ul><ul><ul><li>Choix des modes de livraison </li></ul></ul><ul><ul><ul><li>Client, historique des commandes, panier </li></ul></ul></ul><ul><ul><li>Choix des moyens de paiement </li></ul></ul><ul><ul><ul><li>Idem </li></ul></ul></ul><ul><ul><li>Routage de la commande dans le workflow de commande </li></ul></ul><ul><ul><ul><li>Tout le modèle </li></ul></ul></ul><ul><ul><li>Table de décision </li></ul></ul><ul><ul><ul><li>Combinatoire d’une matrice de fraude en fonction des réponses de plusieurs organismes spécialisés </li></ul></ul></ul><ul><ul><li>Règles techniques </li></ul></ul><ul><ul><ul><li>Selon moi une erreur ! </li></ul></ul></ul>
  17. 17. Drools Expert (moteur de règles) <ul><li>Issu du site officiel de Drools : Engine </li></ul><ul><ul><li>Rete algorithm </li></ul></ul><ul><ul><li>Truth maintenance with logical assertions. </li></ul></ul><ul><ul><li>Dynamic KnowledgeBases (add/remove rules at runtime) </li></ul></ul><ul><ul><li>Stateful and Stateless Execution Modes & Knowledge Agent </li></ul></ul><ul><ul><li>Rule inheritence (RHS) & Rule meta-data </li></ul></ul><ul><ul><li>Pipeline data automation with handling for JMS, JAXB, Smooks, XStream, Jxls (Excel). </li></ul></ul><ul><li>Author </li></ul><ul><ul><li>Eclipse (code completing and line debugger) </li></ul></ul><ul><ul><li>DSL, Rule Flow authoring, Eclipse Guided Editor, Excel Decision Tables </li></ul></ul><ul><li>Predicate Logic </li></ul><ul><ul><li>Restrictions & inline-Eval </li></ul></ul><ul><ul><li>Jointed and dis-jointed Connectives allowed - '&&' '||’ </li></ul></ul><ul><li>First Order Logic </li></ul><ul><ul><li>Quantifiers (And, Or, Exists, …) </li></ul></ul><ul><li>Execution Control </li></ul><ul><ul><li>Conflict Resolution </li></ul></ul><ul><ul><li>Agenda Filters </li></ul></ul><ul><ul><li>Agenda Groups </li></ul></ul><ul><ul><li>Activation Groups </li></ul></ul><ul><ul><li>Rule Flow (with Eclipse tooling) </li></ul></ul><ul><ul><li>Attributes ( no-loop, lock-on-active, etc ) </li></ul></ul><ul><li>Event Model (With Audit Listener) </li></ul><ul><ul><li>Working Memory, Agenda </li></ul></ul>
  18. 18. Règle simple (1/2) <ul><li>Avec le dialecte mvel : BasicRule01.drl </li></ul>package fr.xebia.sandbox.drools.v5_0_1.basicRule01 import fr.xebia.sandbox.drools.domain.Customer rule &quot;Is of valid age&quot; when // Conditions $c : Customer(age >= 18) then // Actions $c.setValid(true); end
  19. 19. Règle simple (2/2) <ul><li>Lancement de Drools : DroolsLauncher.java </li></ul>public void launch(List<Customer> facts) { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource( &quot;basicRule01.drl&quot;, getClass()), ResourceType.DRL); if (kbuilder.hasErrors()) { throw new RuntimeException(kbuilder.getErrors().toString()); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase (); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession(); ksession.execute(CommandFactory.newInsertElements(facts)); }
  20. 20. Syntaxe d’une règle (1/7) <ul><li>Variables : </li></ul><ul><ul><li>$account : Account($type : type) </li></ul></ul><ul><ul><ul><li>Declaration de variables account et type </li></ul></ul></ul><ul><ul><li>Customer(account == $account) </li></ul></ul><ul><ul><ul><li>Vérifie que le client a un compte </li></ul></ul></ul><ul><ul><li>Customer($account == account) => ERREUR !!! </li></ul></ul><ul><ul><ul><li>Drools essaye de faire ça en java Customer.get$account() </li></ul></ul></ul><ul><li>Types : </li></ul><ul><ul><li>String : Customer( name == &quot;John&quot;) </li></ul></ul><ul><ul><li>Regexp: Customer( name matches &quot;[A-Z][a-z]+&quot; ) </li></ul></ul><ul><ul><li>Date : Account( dateCreated > &quot;01-Jan-2008&quot; ) </li></ul></ul><ul><ul><li>Boolean : Transaction( isApproved == true ) </li></ul></ul><ul><ul><li>Enum : Account( type == Account.Type.SAVINGS ) </li></ul></ul>
  21. 21. Syntaxe d’une règle (2/7) <ul><li>Variables globales : </li></ul><ul><ul><li>Déclaration dans la règle : </li></ul></ul><ul><ul><ul><li>global AccountService accountService </li></ul></ul></ul><ul><ul><li>Déclaration dans la session (bonne pratique) : </li></ul></ul><ul><ul><ul><li>AccountService accountService = //.. </li></ul></ul></ul><ul><ul><ul><li>StatefulKnowledgeSession session = </li></ul></ul></ul><ul><ul><ul><li>knowledgeBase.newStatefulKnowledgeSession(); </li></ul></ul></ul><ul><ul><ul><li>session.setGlobal(&quot;accountService&quot;, accountService); </li></ul></ul></ul><ul><li>Comment utiliser cette variable globale : </li></ul><ul><ul><li>accountService.saveAccount($account); </li></ul></ul>
  22. 22. Syntaxe d’une règle (3/7) <ul><li>Conditions : </li></ul><ul><ul><li>ET : </li></ul></ul><ul><ul><ul><li>Customer( name == &quot;John&quot;, age < 26 ) </li></ul></ul></ul><ul><ul><li>OU : </li></ul></ul><ul><ul><ul><li>Customer( name == &quot;John&quot; || age < 26 ) </li></ul></ul></ul><ul><ul><ul><li>Customer( age < 26 || > 70 ) </li></ul></ul></ul><ul><ul><li>Conditions avancées : </li></ul></ul><ul><ul><ul><li>Customer( ( name == &quot;John&quot; && age < 26 ) || </li></ul></ul></ul><ul><ul><ul><li>( name == &quot;Peter&quot; && age < 30 ) ) </li></ul></ul></ul><ul><ul><ul><li>$customer : ( </li></ul></ul></ul><ul><ul><ul><li>Customer( name == &quot;John&quot;, age < 26 ) or </li></ul></ul></ul><ul><ul><ul><li>Customer( name == &quot;Peter&quot;, age < 30 ) </li></ul></ul></ul><ul><ul><ul><li>) </li></ul></ul></ul>
  23. 23. Syntaxe d’une règle (4/7) <ul><li>Conditions: </li></ul><ul><ul><li>NON : </li></ul></ul><ul><ul><ul><li>not Account( type == Account.Type.SAVINGS ) </li></ul></ul></ul><ul><ul><li>EXISTE : </li></ul></ul><ul><ul><ul><li>L’inverse de NON </li></ul></ul></ul><ul><ul><ul><li>exists Account( type == Account.Type.SAVINGS ) </li></ul></ul></ul><ul><ul><li>EVALUATION : </li></ul></ul><ul><ul><ul><li>On peut exécuter du code Java/MVEL (selon le dialecte selectionné) </li></ul></ul></ul><ul><ul><ul><li>/! pas d’optimisation par le moteur de règles </li></ul></ul></ul><ul><ul><ul><li>$account : Account( ) </li></ul></ul></ul><ul><ul><ul><li>eval(accountService.isUniqueAccountNumber($account)) </li></ul></ul></ul>
  24. 24. Syntaxe d’une règle (5/7) <ul><li>Collection: </li></ul><ul><ul><li>Contains : </li></ul></ul><ul><ul><ul><li>Customer( accounts contains $account ) </li></ul></ul></ul><ul><ul><ul><li>Customer( accounts not contains $account ) </li></ul></ul></ul><ul><ul><li>Member of : </li></ul></ul><ul><ul><ul><li>$customer : Customer( $accounts : account ) </li></ul></ul></ul><ul><ul><ul><li>Account( this memberOf $accounts ) </li></ul></ul></ul><ul><ul><li>From : </li></ul></ul><ul><ul><ul><li>$customer : Customer( ) </li></ul></ul></ul><ul><ul><ul><li>Account( ) from $customer.accounts </li></ul></ul></ul>
  25. 25. Syntaxe d’une règle (6/7) <ul><li>Conséquences : </li></ul><ul><ul><li>Mettre à jour un fait de la session (mémoire) </li></ul></ul><ul><ul><li>insert : Insérer un nouveau fait dans la session </li></ul></ul><ul><ul><li>retract : Supprimer un fait de la session </li></ul></ul>rule &quot;interest calculation&quot; no-loop when $account : Account( ) then modify($account) { setBalance((long)($account.getBalance() * 1.03) ) }; end
  26. 26. Syntaxe d’une règle (7/7) <ul><li>Attributs : </li></ul><ul><ul><li>salience : i.e. priorité pour la stratégie de résolution des conflits </li></ul></ul><ul><ul><ul><li>salience ($account.balance * 5) </li></ul></ul></ul><ul><ul><li>no-loop : Règle jouée seulement une fois par fait qui répond aux conditions </li></ul></ul><ul><ul><li>dialect : dialecte, par défaut le mvel </li></ul></ul>rule &quot;rule attributes&quot; salience 100 dialect &quot;mvel&quot; no-loop when // conditions then // consequence end
  27. 27. Règle lisible par un humain – DSL (1/3) <ul><li>DSLR : exemple, règle utilisant un DSL personnalisé </li></ul>package droolsbook.dsl; import droolsbook.bank.model.*; expander simple.dsl rule &quot;hello rule&quot; when There is a Customer with firstName &quot;David&quot; then Greet Customer end
  28. 28. Règle lisible par un humain – DSL (2/3) <ul><li>DSL : exemple, definition du DSL </li></ul><ul><li>DSL + DSLR = </li></ul>[condition][]There is a Customer with firstName {name}=$customer : Customer(firstName == {name}) [consequence][]Greet Customer=System.out.println(&quot;Hello &quot; + $customer.getFirstName()); package droolsbook.dsl; import droolsbook.bank.model.*; rule &quot;kikou&quot; when $customer : Customer then System.out.println(&quot;kikou &quot; + $customer.getFirstName(()); end
  29. 29. Règle lisible par un humain – DSL (3/3) <ul><li>Lancement Drools avec les fichiers .dsl et .dslr files </li></ul>private KnowledgeBase createKnowledgeBaseFromDSL() throws Exception { KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); builder.add(ResourceFactory.newClassPathResource( &quot;simple.dsl&quot;), ResourceType.DSL ); builder.add(ResourceFactory.newClassPathResource( &quot;simple.dslr&quot;), ResourceType.DSLR ); if (builder.hasErrors()) { throw new RuntimeException(builder.getErrors().toString()); } KnowledgeBase knowledgeBase = KnowledgeBaseFactoryknowledgeBase. addKnowledgePackages ( builder .getKnowledgePackages()); return knowledgeBase; }
  30. 30. Règle lisible par un humain – Table de décision (1/2)
  31. 31. Règle lisible par un humain – Table de décision (2/2) <ul><li>Défauts </li></ul><ul><ul><li>Versionnement des règles </li></ul></ul><ul><ul><li>Debugging </li></ul></ul><ul><ul><li>Environnement de développement </li></ul></ul><ul><ul><ul><li>Excel comme code source … pas de commentaire ;-) </li></ul></ul></ul><ul><li>Avantages </li></ul><ul><ul><li>Table de décision est simple et lisible </li></ul></ul><ul><ul><ul><li>Avec une approche classique, l’implémentation correspondante n’est pas “jolie” </li></ul></ul></ul><ul><ul><li>Les experts fonctionnels aiment Excel </li></ul></ul><ul><ul><li>Les experts fonctionnels peuvent fixer eux mêmes les valeurs des algortihmes sans l’assistance à plein temps d’un développeur </li></ul></ul><ul><ul><li>L’implémentation (en Excel) est proche de la spécification fonctionnelle (aussi en Excel) </li></ul></ul>
  32. 32. Drools Guvnor (BRMS/BPMS) (1/2) <ul><li>BRMS = Business Rules Management System </li></ul><ul><ul><li>Gérer les règles dans différents environnements </li></ul></ul><ul><ul><li>Avec une interface graphique </li></ul></ul><ul><ul><li>Se repose sur le coeur du Drools (Drools Expert) </li></ul></ul><ul><li>Qui peux utiliser Guvnor </li></ul><ul><ul><li>Expert fonctionnel </li></ul></ul><ul><ul><li>Les experts ou les administrateurs des règles </li></ul></ul><ul><ul><li>Développeurs </li></ul></ul>
  33. 33. Drools Guvnor (BRMS/BPMS) (2/2) <ul><li>Quand utiliser Guvnor </li></ul><ul><ul><li>Gérer les versions et le déploiements des règles </li></ul></ul><ul><ul><li>Gérer les règles fonctionnels </li></ul></ul><ul><ul><li>Pas de développeurs pour gérer les règles </li></ul></ul><ul><ul><li>+ les raisons de Drools </li></ul></ul><ul><li>Fonctionnalités </li></ul><ul><ul><li>Les différents IDE d’édition de règle (GUI, text) </li></ul></ul><ul><ul><li>Versionnement des contrôles </li></ul></ul><ul><ul><li>Hiérarchisation et classification des règles </li></ul></ul><ul><ul><li>Compilation et déploiement </li></ul></ul>
  34. 34. Drools Flow (Flow/Workflow) (1/2)
  35. 35. Drools Flow (Flow/Workflow) (2/2) <ul><li>Drools Flow vs jBPM </li></ul><ul><ul><li>Politique officielle de JBoss </li></ul></ul><ul><ul><ul><li>jBPM est encore l’implémentation de réference pour les workflows </li></ul></ul></ul><ul><ul><ul><li>Drools Flow et jBPM sont deux projets indépendants => Pourquoi 2 projets? </li></ul></ul></ul><ul><ul><li>jBPM </li></ul></ul><ul><ul><ul><li>Orienté processus </li></ul></ul></ul><ul><ul><ul><li>Règle statique (cf conception en BAM) </li></ul></ul></ul><ul><ul><ul><li>Eprouvé et plus fonctionnel </li></ul></ul></ul><ul><ul><ul><ul><li>Workfow versionnable, transactionel, persistant </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Orchestration de service </li></ul></ul></ul></ul><ul><ul><li>Drools flow </li></ul></ul><ul><ul><ul><li>Orienté règle </li></ul></ul></ul><ul><ul><ul><li>Règle dynamique </li></ul></ul></ul><ul><ul><ul><li>Adapté aux changements </li></ul></ul></ul><ul><ul><ul><li>Attention aux performances, car le graphe de Rete est divisé (cf performance) </li></ul></ul></ul>
  36. 36. Drools Fusion (CEP/Temporal Reasoning) (1/3) <ul><li>Cf La présentation de Michael sur le CEP </li></ul><ul><li>Souvenez vous … </li></ul><ul><ul><li>Evènement </li></ul></ul><ul><ul><li>Fenêtre de temps </li></ul></ul>
  37. 37. Drools Fusion (CEP/Temporal Reasoning) (2/3)
  38. 38. Drools Fusion (CEP/Temporal Reasoning) (3/3)
  39. 39. Performance – Algorithme de Rete (1/3) <ul><li>Algorithme pour le pattern matching règle/fait </li></ul><ul><ul><li>Vient du latin, signifie réseau </li></ul></ul><ul><li>Consommation mémoire + élevée pour une rapidité supérieure de calcul </li></ul><ul><li>Approche naïve </li></ul><ul><ul><li>Pour chaque règle, éliminer les règles qui ne sont pas applicables aux faits </li></ul></ul><ul><ul><li>Passer à la règle suivante </li></ul></ul><ul><ul><li>Pour chaque règle restante, exécuter la règle aux faits </li></ul></ul><ul><ul><li>=> TROP LONG </li></ul></ul><ul><li>Le réseau de l’algorithme Rete algorithme est un graphe </li></ul><ul><ul><li>Treillis (une entrée dans le graphe) </li></ul></ul><ul><ul><li>Acyclique </li></ul></ul><ul><ul><li>Orienté </li></ul></ul>
  40. 40. Performance – Algorithme de Rete (2/3) <ul><li>Exemple simple : </li></ul>rule &quot;accountBalanceAtLeast&quot; when $account : Account( balance < 100 ) then warning(drools, $account); end
  41. 41. Performance – Algorithme de Rete (3/3) <ul><li>Autre exemple : </li></ul>rule studentWithLowAccountBalance when $account : Account( balance < 100, type == Account.Type.STUDENT ) $customer : Customer(accounts contains $account) then System.out.println(&quot;Customer &quot; + $customer + &quot; has student account with low balance&quot;); end
  42. 42. Conclusion & Retour d’expérience www.xebia.fr / blog.xebia.fr
  43. 43. Conclusion (1/3)
  44. 44. Conclusion (2/3) <ul><li>Beaucoup de fonctionnalités mais frameworks complexes </li></ul><ul><li>Résout des problèmes non communs, surtout des problèmes algorithmiques </li></ul><ul><li>Le choix de Drools demande du courage </li></ul><ul><ul><li>Performance (comprendre comment faire du tuning) </li></ul></ul><ul><ul><li>Compexité (est ce qu’il resout plus de problème qu’il n’en crée?) </li></ul></ul><ul><ul><li>Comprendre le fonctionnement interne du framework </li></ul></ul><ul><ul><ul><li>Comment fonctionne l’algorithme de Rete algorithm afin d’optimiser l’exécution des règles </li></ul></ul></ul><ul><li>La courbe d’apprentissage est importante </li></ul><ul><ul><li>Formation </li></ul></ul><ul><ul><li>Prototypage </li></ul></ul><ul><ul><li>Selon moi , 1 ou 2 mois avant de commencer et 6 mois pour être autonome </li></ul></ul><ul><li>Communauté professionnelle et très active </li></ul><ul><ul><li>Les outils sont bien finalisés (Eclipse & Guvnor) </li></ul></ul>
  45. 45. Conclusion (3/3) <ul><li>Beaucoup d’extensions </li></ul><ul><ul><li>Drools.net, </li></ul></ul><ul><ul><li>Module sématique en groovy, python, … </li></ul></ul><ul><ul><li>Console GWT </li></ul></ul><ul><ul><li>Transformation de données (Smooks, CVS/Excel with JXLT) </li></ul></ul><ul><ul><li>Agent/serveur drools (en REST) </li></ul></ul><ul><ul><li>Exemples (Drools example & Drools solver) </li></ul></ul><ul><ul><li>Analyse </li></ul></ul><ul><ul><li>Integration à Spring, JTA </li></ul></ul><ul><ul><li>Intégration à Ant (Drools compiler) </li></ul></ul><ul><ul><li>Standardisé avec la JSR 94 </li></ul></ul><ul><ul><li>Plugin Grails </li></ul></ul><ul><ul><li>… </li></ul></ul>
  46. 46. Merci … Des questions ??? <ul><li>A voir aussi sur un sujet connexe l’article sur le blog de Xebia : </li></ul><ul><ul><li>Le pattern Specification pour la gestion de vos règles métier </li></ul></ul><ul><ul><li>Comment gérer ces règles métiers sans que ce soit le foutoir, règle perdu dans le code, règle qui devient des règles après le développement, … </li></ul></ul>
  47. 47. Annexes www.xebia.fr / blog.xebia.fr
  48. 48. Bibliographie (1/2) <ul><li>Site officiel de Drools </li></ul><ul><ul><li>http://www.jboss.org/drools/ </li></ul></ul><ul><li>Performance de Drools </li></ul><ul><ul><li>http://blogs.illation.com.au/2009/09/rule-engine-benchmarking-what-does-it-mean/ </li></ul></ul><ul><ul><li>http://blogs.illation.com.au/2009/09/miss-manners-benchmark-performance-opsj-vs-drools/ </li></ul></ul><ul><ul><li>http://blogs.illation.com.au/2009/08/drools-performance-miss-manners/ </li></ul></ul><ul><li>Livres </li></ul><ul><ul><li>http://www.packtpub.com/jboss-drools-business-rules/book </li></ul></ul><ul><ul><li>http://www.packtpub.com/drools-jboss-rules-5-0-developers-guide/book </li></ul></ul><ul><ul><li>http://www.amazon.fr/Build-Business-Rules-Engine-Functionality/dp/1558609180 </li></ul></ul>
  49. 49. Bibliographie (2/2) <ul><li>Algorithme de Rete </li></ul><ul><ul><li>Wikipedia (fr) : http://fr.wikipedia.org/wiki/Algorithme_de_Rete </li></ul></ul><ul><ul><li>Wikipedia (en) : http://en.wikipedia.org/wiki/Rete_algorithm </li></ul></ul>

×