SlideShare a Scribd company logo
1 of 88
Download to read offline
BreizhCamp 2016 #BzhCmp
#confquidéchire
BreizhCamp 2017 #breizhcamp
Condensé de MOM illustré
Safa Mabrouk - @MABROUKSafa
Antonio Gomes Rodrigues - @ra0077
Qui on est
Antonio Gomes RodriguesSafa Mabrouk
AGENDA
3
01
02
03
> L’histoire des MoMs
> Les patterns d’utilisation d’un MoM
> Démo
WARNING
>01 L’histoire des MoMs
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
Point à point ou direct exchange
Publish/subscribe ou Topic exchange
Broadcast ou Fanout exchange
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
>02 Les patterns d’utilisation d’un MoM
Découplage
Qualité de service
Supervision et gestion des logs
Performance
Routage
Divers
Six catégories pour mieux s’y retrouver
Découplage
Découplage technologique
Connecter différentes technologies dans votre SI
Découplage géographique et location transparency
Plus besoin de se soucier de la localisation géographique des consommateurs
Découplage temporel
Plus besoin que le consommateur soit toujours présent
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);
Qualité de service
Garantir la réception et le traitement du message
Merci de ne perdre aucun message
Garantir la réception et le traitement du message
Partie 1 de la solution : Persistance des messages
Garantir la réception et le traitement du message
Partie 1 de la solution : Persistance des messages
Garantir la réception et le traitement du message
Partie 1 de la solution : Persistance des messages
FlushACK
Garantir la réception et le traitement du message
Partie 1 de la solution : Persistance des messages
ACK
Garantir la réception et le traitement du message
Partie 1 de la solution : Persistance des messages
Garantir la réception et le traitement du message
Partie 2 de la solution : utilisation d’un Durable Subscriber
Garantir la réception et le traitement du message
Partie 2 de la solution : utilisation d’un Durable Subscriber
Garantir la réception et le traitement du message
Partie 2 de la solution : utilisation d’un Durable Subscriber
Garantir la réception et le traitement du message
Partie 2 de la solution : utilisation d’un Durable Subscriber
Garantir la réception et le traitement du message
Partie 2 de la solution : utilisation d’un Durable Subscriber
Message 2 perdu
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");
Garantir la réception et le traitement du message
Partie 2 de la solution : utilisation d’un Durable Subscriber
Garantir la réception et le traitement du message
Partie 2 de la solution : utilisation d’un Durable Subscriber
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
Favoriser un type de message particulier
Les clients premium avant tout
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);
Garantir l’ordre d'arrivée des messages
Ne jamais faire confiance au réseau/….
Garantir l’ordre d'arrivée des messages
Ne jamais faire confiance au réseau/….
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);
Garantir l’ordre d'arrivée des messages
Et je fais comment lorsque j’ai plusieurs producteurs/consommateurs ?
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>
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" />
Mode dégradé sous forte charge
Comment ralentir avec le Producer Flow Control
Mode dégradé sous forte charge
Comment ralentir avec le Producer Flow Control
Mode dégradé sous forte charge
Comment ralentir avec le Producer Flow Control
Mode dégradé sous forte charge
Comment ralentir avec le Producer Flow Control
Lire des vieux messages
Retour vers le futur
Lire des vieux messages
Retour vers le futur
Lire des vieux messages
Retour vers le futur
topic = new ActiveMQTopic("MonTopic.Topic?consumer.retroactive=true");
consumer = session.createConsumer(topic);
Lire des vieux messages
Retour vers le futur
Supporter plusieurs versions de messages et de consommateurs
Une montée de version sans trop de douleurs
Supporter plusieurs versions de messages et de consommateurs
Une montée de version sans trop de douleurs
Supporter plusieurs versions de messages et de consommateurs
Une montée de version sans trop de douleurs
Dédoublonner des messages
Évitons les doublons
Dédoublonner des messages
Évitons les doublons
Dédoublonner des messages
Évitons les doublons
Dédoublonner des messages
Évitons les doublons
Message monMessage = session.createMessage();
String monID = "Je suis unique";
monMessage.setStringProperty( HDR_DUPLICATE_DETECTION_ID.toString(), monID);
Dédoublonner des messages
Évitons les doublons
Gérer les problèmes de latence réseau entre deux services
Laisser le MOM s’occuper des problèmes réseau
Gérer les problèmes de latence réseau entre deux services
Laisser le MOM s’occuper des problèmes réseau
Supervision et gestion des logs
Centralisation des logs
En complément à la solution Elastic
Centralisation des logs
En complément à la solution Elastic
Tracking dans un workflow
Où est mon colis ?
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>
Performance
Gérer les traitements lourds en asynchrone et en tâche de fond
Laisser les traitements lourds à notre MOM
Gérer les traitements lourds en asynchrone et en tâche de fond
Laisser les traitements lourds à notre MOM
Gérer les traitements lourds en asynchrone et en tâche de fond
Laisser les traitements lourds à notre MOM
Ne lire que la dernière version du message et éviter du travail inutile par
la même occasion
Less is more
Ne lire que la dernière version du message et éviter du travail inutile par
la même occasion
Less is more
Ne lire que la dernière version du message et éviter du travail inutile par
la même occasion
Less is more
Ne lire que la dernière version du message et éviter du travail inutile par
la même occasion
Less is more
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");
Ne lire que la dernière version du message et éviter du travail inutile par
la même occasion
Less is more
Ne lire que la dernière version du message et éviter du travail inutile par
la même occasion
Less is more
Avoir plusieurs millions de messages dans la file avec peu de mémoire
Toujours plus
Avoir plusieurs millions de messages dans la file avec peu de mémoire
Toujours plus
Avoir plusieurs millions de messages dans la file avec peu de mémoire
Toujours plus
<max-size-bytes>104857600</max-size-bytes>
Avoir plusieurs millions de messages dans la file avec peu de mémoire
Toujours plus
Routage
MessageConsumer messageConsumer1 = session.createConsumer(topic, "Montant > 100000");
Implémentation du pattern Content Based Router
Cela va devenir compliqué de frauder
€
€
Divers
Architecture Lambda et MOM
Deux vitesses pour un meilleur résultat
Implémentation du pattern Event sourcing
Capturer tous les changements de statut d’un objet dans une séquence
d'événement
€
€
€
€
€
€
€
€€
€€ €
De l’action pour chaque changement en base
Merci Debezium
Binary log
Purge/update
Update index
Envoi
Synchro
Vue
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
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
>03 Démo

More Related Content

Similar to Condensé de mom illustré

gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !David Caramelo
 
Paris Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureParis Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureFlorian Hussonnois
 
Etat de l’art des communications basées sur Mach (1995)
Etat de l’art des communications basées sur Mach (1995)Etat de l’art des communications basées sur Mach (1995)
Etat de l’art des communications basées sur Mach (1995)Julien SIMON
 
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQAMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQMicrosoft
 
Wm664 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
Wm664 g formation-ibm-websphere-message-broker-v8-developpement-d-application...Wm664 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
Wm664 g formation-ibm-websphere-message-broker-v8-developpement-d-application...CERTyou Formation
 
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018Carles Sistare
 
Mise en place d'un serveur de mail complet linux server wiki
Mise en place d'un serveur de mail complet   linux server wikiMise en place d'un serveur de mail complet   linux server wiki
Mise en place d'un serveur de mail complet linux server wikidebaros
 
Wm674 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
Wm674 g formation-ibm-websphere-message-broker-v8-developpement-d-application...Wm674 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
Wm674 g formation-ibm-websphere-message-broker-v8-developpement-d-application...CERTyou Formation
 
Java Message Services
Java Message ServicesJava Message Services
Java Message ServicesLorraine JUG
 
13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdfPatiento Del Mar
 
Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Heithem Abbes
 
CTT La suite Collaborative Zimbra
CTT La suite Collaborative ZimbraCTT La suite Collaborative Zimbra
CTT La suite Collaborative ZimbraChiheb Ouaghlani
 
Cours 4 intergiciels orientes messages jms
Cours 4 intergiciels orientes messages  jmsCours 4 intergiciels orientes messages  jms
Cours 4 intergiciels orientes messages jmsMariem ZAOUALI
 

Similar to Condensé de mom illustré (20)

gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !
 
Introduction à Apache Pulsar
 Introduction à Apache Pulsar Introduction à Apache Pulsar
Introduction à Apache Pulsar
 
SSL/TSL Protocols
SSL/TSL ProtocolsSSL/TSL Protocols
SSL/TSL Protocols
 
Paris Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureParis Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & Architecture
 
Etat de l’art des communications basées sur Mach (1995)
Etat de l’art des communications basées sur Mach (1995)Etat de l’art des communications basées sur Mach (1995)
Etat de l’art des communications basées sur Mach (1995)
 
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQAMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
 
Wm664 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
Wm664 g formation-ibm-websphere-message-broker-v8-developpement-d-application...Wm664 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
Wm664 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
 
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
 
Mise en place d'un serveur de mail complet linux server wiki
Mise en place d'un serveur de mail complet   linux server wikiMise en place d'un serveur de mail complet   linux server wiki
Mise en place d'un serveur de mail complet linux server wiki
 
Wm674 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
Wm674 g formation-ibm-websphere-message-broker-v8-developpement-d-application...Wm674 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
Wm674 g formation-ibm-websphere-message-broker-v8-developpement-d-application...
 
Java Message Services
Java Message ServicesJava Message Services
Java Message Services
 
13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf
 
Pourquoi migrer vers exchange 2010
Pourquoi migrer vers exchange 2010Pourquoi migrer vers exchange 2010
Pourquoi migrer vers exchange 2010
 
Jms.back.to.basic
Jms.back.to.basicJms.back.to.basic
Jms.back.to.basic
 
Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Appels de procédures distants (RPC)
Appels de procédures distants (RPC)
 
Informatique Mobile d'Entreprise
Informatique Mobile d'EntrepriseInformatique Mobile d'Entreprise
Informatique Mobile d'Entreprise
 
Mieux acheminer les emails avec salesforce
Mieux acheminer les emails avec salesforceMieux acheminer les emails avec salesforce
Mieux acheminer les emails avec salesforce
 
Protocoles SSL/TLS
Protocoles SSL/TLSProtocoles SSL/TLS
Protocoles SSL/TLS
 
CTT La suite Collaborative Zimbra
CTT La suite Collaborative ZimbraCTT La suite Collaborative Zimbra
CTT La suite Collaborative Zimbra
 
Cours 4 intergiciels orientes messages jms
Cours 4 intergiciels orientes messages  jmsCours 4 intergiciels orientes messages  jms
Cours 4 intergiciels orientes messages jms
 

More from Antonio Gomes Rodrigues

We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...Antonio Gomes Rodrigues
 
BreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseBreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseAntonio Gomes Rodrigues
 
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUGAntonio Gomes Rodrigues
 
Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaAntonio Gomes Rodrigues
 
Tests de performances d'une application Java EE
Tests de performances d'une application Java EETests de performances d'une application Java EE
Tests de performances d'une application Java EEAntonio Gomes Rodrigues
 

More from Antonio Gomes Rodrigues (8)

We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
 
BreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseBreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesse
 
PerfUG : présentation de Dynatrace APM
PerfUG : présentation de Dynatrace APMPerfUG : présentation de Dynatrace APM
PerfUG : présentation de Dynatrace APM
 
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
 
Gestion des index SQL : Soyez AWARE !
Gestion des index SQL : Soyez  AWARE !Gestion des index SQL : Soyez  AWARE !
Gestion des index SQL : Soyez AWARE !
 
Test de charge avec Apache JMeter
Test de charge avec Apache JMeterTest de charge avec Apache JMeter
Test de charge avec Apache JMeter
 
Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement Java
 
Tests de performances d'une application Java EE
Tests de performances d'une application Java EETests de performances d'une application Java EE
Tests de performances d'une application Java EE
 

Condensé de mom illustré

  • 1. BreizhCamp 2016 #BzhCmp #confquidéchire BreizhCamp 2017 #breizhcamp Condensé de MOM illustré Safa Mabrouk - @MABROUKSafa Antonio Gomes Rodrigues - @ra0077
  • 2. Qui on est Antonio Gomes RodriguesSafa Mabrouk
  • 3. AGENDA 3 01 02 03 > L’histoire des MoMs > Les patterns d’utilisation d’un MoM > Démo
  • 7. Point à point ou direct exchange
  • 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. >02 Les patterns d’utilisation d’un MoM
  • 12. Découplage Qualité de service Supervision et gestion des logs Performance Routage Divers Six catégories pour mieux s’y retrouver
  • 15. Découplage géographique et location transparency Plus besoin de se soucier de la localisation géographique des consommateurs
  • 16. Découplage temporel Plus besoin que le consommateur soit toujours présent
  • 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);
  • 19. Garantir la réception et le traitement du message Merci de ne perdre aucun message
  • 20. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages
  • 21. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages
  • 22. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages FlushACK
  • 23. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages ACK
  • 24. Garantir la réception et le traitement du message Partie 1 de la solution : Persistance des messages
  • 25. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  • 26. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  • 27. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  • 28. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  • 29. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber Message 2 perdu
  • 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. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  • 32. Garantir la réception et le traitement du message Partie 2 de la solution : utilisation d’un Durable Subscriber
  • 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. Favoriser un type de message particulier Les clients premium avant tout
  • 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. Garantir l’ordre d'arrivée des messages Ne jamais faire confiance au réseau/….
  • 37. Garantir l’ordre d'arrivée des messages Ne jamais faire confiance au réseau/….
  • 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. Garantir l’ordre d'arrivée des messages Et je fais comment lorsque j’ai plusieurs producteurs/consommateurs ?
  • 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. 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. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control
  • 43. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control
  • 44. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control
  • 45. Mode dégradé sous forte charge Comment ralentir avec le Producer Flow Control
  • 46. Lire des vieux messages Retour vers le futur
  • 47. Lire des vieux messages Retour vers le futur
  • 48. Lire des vieux messages Retour vers le futur topic = new ActiveMQTopic("MonTopic.Topic?consumer.retroactive=true"); consumer = session.createConsumer(topic);
  • 49. Lire des vieux messages Retour vers le futur
  • 50. Supporter plusieurs versions de messages et de consommateurs Une montée de version sans trop de douleurs
  • 51. Supporter plusieurs versions de messages et de consommateurs Une montée de version sans trop de douleurs
  • 52. Supporter plusieurs versions de messages et de consommateurs Une montée de version sans trop de douleurs
  • 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);
  • 58. Gérer les problèmes de latence réseau entre deux services Laisser le MOM s’occuper des problèmes réseau
  • 59. Gérer les problèmes de latence réseau entre deux services Laisser le MOM s’occuper des problèmes réseau
  • 61. Centralisation des logs En complément à la solution Elastic
  • 62. Centralisation des logs En complément à la solution Elastic
  • 63. Tracking dans un workflow Où est mon colis ?
  • 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>
  • 66. Gérer les traitements lourds en asynchrone et en tâche de fond Laisser les traitements lourds à notre MOM
  • 67. Gérer les traitements lourds en asynchrone et en tâche de fond Laisser les traitements lourds à notre MOM
  • 68. Gérer les traitements lourds en asynchrone et en tâche de fond Laisser les traitements lourds à notre MOM
  • 69. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  • 70. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  • 71. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  • 72. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  • 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. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  • 75. Ne lire que la dernière version du message et éviter du travail inutile par la même occasion Less is more
  • 76. Avoir plusieurs millions de messages dans la file avec peu de mémoire Toujours plus
  • 77. Avoir plusieurs millions de messages dans la file avec peu de mémoire Toujours plus
  • 78. Avoir plusieurs millions de messages dans la file avec peu de mémoire Toujours plus <max-size-bytes>104857600</max-size-bytes>
  • 79. Avoir plusieurs millions de messages dans la file avec peu de mémoire Toujours plus
  • 81. MessageConsumer messageConsumer1 = session.createConsumer(topic, "Montant > 100000"); Implémentation du pattern Content Based Router Cela va devenir compliqué de frauder € €
  • 83. Architecture Lambda et MOM Deux vitesses pour un meilleur résultat
  • 84. Implémentation du pattern Event sourcing Capturer tous les changements de statut d’un objet dans une séquence d'événement € € € € € € € €€ €€ €
  • 85. De l’action pour chaque changement en base Merci Debezium Binary log Purge/update Update index Envoi Synchro Vue
  • 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. 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