Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Condensé de mom illustré

583 views

Published on

Vous avez surement déjà rencontré un RabbitMQ ou un Apache Kafka dans vos projets sans trop savoir ce que vous pourriez en faire de plus, à part ce qui avait été prévu au départ , déplacer un message d'une application A vers une Application B. Sachez que ces serveurs de messages ou MOM sont capables de remplir plus de fonctionnalités et de fournir des solutions distribuées, résiliente et scalable répondant à plusieurs types de besoins. Vous serez étonné des uses cases que vous arrivez à résoudre avec un simple RabbitMQ et la bonne configuration. C'est ce que nous verrons ensemble durant cette présentation, nous finirons avec des REX tirées de nos missions.

Speakers : Antonio Gomes Rodrigues, safa mabrouk

Published in: Software
  • Be the first to comment

Condensé de mom illustré

  1. 1. BreizhCamp 2016 #BzhCmp #confquidéchire BreizhCamp 2017 #breizhcamp Condensé de MOM illustré Safa Mabrouk - @MABROUKSafa Antonio Gomes Rodrigues - @ra0077
  2. 2. Qui on est Antonio Gomes RodriguesSafa Mabrouk
  3. 3. AGENDA 3 01 02 03 > L’histoire des MoMs > Les patterns d’utilisation d’un MoM > Démo
  4. 4. WARNING
  5. 5. >01 L’histoire des MoMs
  6. 6. Timeline 1993 2001 M Q Series JM S 2006 AM Q P 2012 STO M P v1.2 Apache Kafka 2011 Kafka 2007 M Q TT
  7. 7. Point à point ou direct exchange
  8. 8. Publish/subscribe ou Topic exchange
  9. 9. Broadcast ou Fanout exchange
  10. 10. Comparaison entre spécifications JMS AMQP STOMP Interopérab ilité Pas possible. Il faut avoir un client JMS pour le producteur et le consommateur et il faut avoir un broker qui est compatible JMS Complètement possible. Le broker, le producteur et le consommateur peuvent utiliser différents implémentation Complètement possible. Le broker, le producteur et le consommateur peuvent utiliser différents implémentation Formats d’ échanges Point to Point Publish Subscribe Direct exchange Fanout Exchange Topic Exchange Headers Exchange System Exchange Point to Point Publish Subscribe Formats de messages Object - Map - Text - Bytes - Stream Bytes Text Structure de messages Header section - Properties section - message body Header section - Properties section - message Body libre Routing Généralement fait via un module de routing applicatif. Le MessageSelector peut être une forme de routing Le routing est fait par le broker en utilisant la routing key ou les propriétés des messages et les tables de binding Ne fournit pas des fonctionnalité de routing
  11. 11. >02 Les patterns d’utilisation d’un MoM
  12. 12. Découplage Qualité de service Supervision et gestion des logs Performance Routage Divers Six catégories pour mieux s’y retrouver
  13. 13. Découplage
  14. 14. Découplage technologique Connecter différentes technologies dans votre SI
  15. 15. Découplage géographique et location transparency Plus besoin de se soucier de la localisation géographique des consommateurs
  16. 16. Découplage temporel Plus besoin que le consommateur soit toujours présent
  17. 17. Traitement différé Nostalgie des traitements la nuit MessageProducer producer = session.createProducer(destination); TextMessage message = session.createTextMessage("Message pour 22h"); message.setStringProperty(ScheduledMessage. AMQ_SCHEDULED_CRON, "0 22 * * *"); producer.send(message);
  18. 18. Qualité de service
  19. 19. Garantir la réception et le traitement du message Merci de ne perdre aucun message
  20. 20. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages
  21. 21. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages
  22. 22. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages FlushACK
  23. 23. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages ACK
  24. 24. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages
  25. 25. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  26. 26. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  27. 27. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  28. 28. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  29. 29. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber Message 2 perdu
  30. 30. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber TopicSubscriber subscriber = session. createDurableSubscriber(topic, "subscriber");
  31. 31. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  32. 32. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  33. 33. Garantir la réception et le traitement du message Pas de compromis Client ACK Plusieurs consommateurs Client Failover Durable Subscriber Persistance des messages Dead Letter Queue HA/Cluster Transaction ACK Envoyer à nouveau le message perdu
  34. 34. Favoriser un type de message particulier Les clients premium avant tout
  35. 35. Favoriser un type de message particulier Les clients premium avant tout QueueSender clientPayant = QueueSession.createSender(someQueue); clientPayant.setPriority(9); clientPayant.send(message, DeliveryMode.NON_PERSISTENT, 9, 0);
  36. 36. Garantir l’ordre d'arrivée des messages Ne jamais faire confiance au réseau/….
  37. 37. Garantir l’ordre d'arrivée des messages Ne jamais faire confiance au réseau/….
  38. 38. Garantir l’ordre de consommation des messages Solution 1 : Regrouper les messages Message message = session.createTextMessage("Mon super message"); message.setStringProperty(" JMSXGroupID", "Mon groupe"); producer.send(message);
  39. 39. Garantir l’ordre d'arrivée des messages Et je fais comment lorsque j’ai plusieurs producteurs/consommateurs ?
  40. 40. Garantir l’ordre de consommation des messages Solution 2 : Avoir le même ordre de consommation de message pour plusieurs consommateurs <destinationPolicy> <policyMap> <policyEntries> <policyEntry topic="MonTopic.>"> <dispatchPolicy> <strictOrderDispatchPolicy/> </dispatchPolicy>
  41. 41. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control <systemUsage> <systemUsage> <memoryUsage> <memoryUsage limit="64 mb" /> </memoryUsage> <storeUsage> <storeUsage limit="100 gb" />
  42. 42. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control
  43. 43. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control
  44. 44. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control
  45. 45. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control
  46. 46. Lire des vieux messages Retour vers le futur
  47. 47. Lire des vieux messages Retour vers le futur
  48. 48. Lire des vieux messages Retour vers le futur topic = new ActiveMQTopic("MonTopic.Topic?consumer.retroactive=true"); consumer = session.createConsumer(topic);
  49. 49. Lire des vieux messages Retour vers le futur
  50. 50. Supporter plusieurs versions de messages et de consommateurs Une montée de version sans trop de douleurs
  51. 51. Supporter plusieurs versions de messages et de consommateurs Une montée de version sans trop de douleurs
  52. 52. Supporter plusieurs versions de messages et de consommateurs Une montée de version sans trop de douleurs
  53. 53. Dédoublonner des messages Évitons les doublons
  54. 54. Dédoublonner des messages Évitons les doublons
  55. 55. Dédoublonner des messages Évitons les doublons
  56. 56. Dédoublonner des messages Évitons les doublons Message monMessage = session.createMessage(); String monID = "Je suis unique"; monMessage.setStringProperty( HDR_DUPLICATE_DETECTION_ID.toString(), monID);
  57. 57. Dédoublonner des messages Évitons les doublons
  58. 58. Gérer les problèmes de latence réseau entre deux services Laisser le MOM s’occuper des problèmes réseau
  59. 59. Gérer les problèmes de latence réseau entre deux services Laisser le MOM s’occuper des problèmes réseau
  60. 60. Supervision et gestion des logs
  61. 61. Centralisation des logs En complément à la solution Elastic
  62. 62. Centralisation des logs En complément à la solution Elastic
  63. 63. Tracking dans un workflow Où est mon colis ?
  64. 64. Dupliquer le flux ou comment implémenter le pattern Wire Tap Double run, piste d’audit… tout est possible <destinationInterceptors> <mirroredQueue copyMessage = "true" postfix=".mirror" prefix=""/> </destinationInterceptors>
  65. 65. Performance
  66. 66. Gérer les traitements lourds en asynchrone et en tâche de fond Laisser les traitements lourds à notre MOM
  67. 67. Gérer les traitements lourds en asynchrone et en tâche de fond Laisser les traitements lourds à notre MOM
  68. 68. Gérer les traitements lourds en asynchrone et en tâche de fond Laisser les traitements lourds à notre MOM
  69. 69. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  70. 70. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  71. 71. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  72. 72. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  73. 73. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more TextMessage message = session.createTextMessage("7"); message.setStringProperty("_AMQ_LVQ_NAME", "X");
  74. 74. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  75. 75. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  76. 76. Avoir plusieurs millions de messages dans la file avec peu de mémoire Toujours plus
  77. 77. Avoir plusieurs millions de messages dans la file avec peu de mémoire Toujours plus
  78. 78. Avoir plusieurs millions de messages dans la file avec peu de mémoire Toujours plus <max-size-bytes>104857600</max-size-bytes>
  79. 79. Avoir plusieurs millions de messages dans la file avec peu de mémoire Toujours plus
  80. 80. Routage
  81. 81. MessageConsumer messageConsumer1 = session.createConsumer(topic, "Montant > 100000"); Implémentation du pattern Content Based Router Cela va devenir compliqué de frauder € €
  82. 82. Divers
  83. 83. Architecture Lambda et MOM Deux vitesses pour un meilleur résultat
  84. 84. Implémentation du pattern Event sourcing Capturer tous les changements de statut d’un objet dans une séquence d'événement € € € € € € € €€ €€ €
  85. 85. De l’action pour chaque changement en base Merci Debezium Binary log Purge/update Update index Envoi Synchro Vue
  86. 86. Vers l'infini et au delà <remoting-incoming-interceptors> <class-name>MonInterceptor</class-name> </remoting-incoming-interceptors> <remoting-outgoing-interceptors> <class-name>MonInterceptor2</class-name> </remoting-outgoing-interceptors> remoting-incoming- interceptors BAM Remoting-output- interceptors
  87. 87. Si on a encore un peu de temps pour... Rate limited flow control Delayed Redelivery Message TTL Queue TTL Consummer priorities Bridge Synchrone (Request Reply) Sinon faudra chercher sur Internet
  88. 88. >03 Démo

×