Préparez-vous, les messages de ce talk ne vous seront pas délivrés exactly-once – Compte-rendu du talk de Augustin Grimprel à La Duck Conf 2018
Lorsque l’on utilise un bus de message (MOM) la garantie de de livraison est un élément clé. La plupart des bus de messages supportent les modes "At Most One", "At Least One" et "Exactly Once", cela englobe les produits ActiveMQ, RabbitMQ ou très en vogue en ce moment, Kafka !
Les MOM permettent un découplage entre les applications ainsi une application productrice de messages peut envoyer des messages au MOM que le(s) application(s) consommatrice(s) soi(en)t en ligne ou non.
La reception d’un message repose sur 2 notions fondamentales qui ont des comportement différents selon le mode de livraison :
- La distribution : le broker distribue le contenu du message au consommateur
- L’acquittement du message : le consommateur notifie le broker qu’il l’a bien traité le message
L’acquittement du message en particulier est un état distribué entre le consommateur et le broker. Lors d’incidents (panne, partition réseau et retour à la normal) on retombe sur les problématiques des systèmes distribués.
Cette présentation va explorer ce qui se passe lorsqu'un tel incident survient, en fonction du mode de livraison et quand des acquittements ne sont pas reçus par le broker. C’est la lecture d’un post sur Kafka, annonçant qu’il supportait le "Exactly Once", qui a inspiré cette session.
En mode "At Most Once" (AMO)
Le broker s’engage à ne pas livrer plus d’une seule fois un message. Cela signifie que, dans le doute (pas de réception de l’acquittement), si le consommateur redemande le message lors du retour à la normal, le message n’est pas redistribué, ainsi il ne sera peut-être pas traité. Dans ce mode, le broker supprime le message de ses queues dès qu’il est distribué.
Voir la présentation complète sur slideshare.
En mode "At Least Once" (ALO)
Le broker s’engage à livrer le message jusqu’à recevoir un acquittement quitte à s’y reprendre à plusieurs fois (traitement en double ou plus). Les messages ne sont supprimés des queues qu'à la réception de l’acquittement.
En mode ‘Exactly Once’ (EO)
Le message est sensé être supprimé sur le broker au moment exact où le consommateur le marque comme acquitté. Par quelle magie quantique cet état change-t-il simultanément entre ces 2 acteurs ? Il n’y a aucune magie, les éditeurs qui prétendent le faire (dont Kafka) jouent sur une ambiguïté : c’est possible, mais uniquement dans des situations expérimentales qui n’ont aucun intérêt dans un SI dans 99 % des cas. Par exemple, pour Kafka cela ne fonctionne que si les interactions du consommateur se limitent à des messages Kafka… Il faut penser à lire les petits caractères en bas des documentations des MOM... Dans un SI, les messages qui sont consommés ont justement des interactions avec des bases de données ou des services (mail, etc.), donc exit les garanties du ‘Exactly Once' !
Comment gère-t-on alors un état cohérent pour ses systèmes ?
Une première approche consiste à accepter la non distribution (AMO) ou des messages en double (ALO) et de vivre temporairement avec ces désynchronisations. C’est une approche que l’on va, par exemple, retrouver avec des calculs intra-day en journée sur des positions comptables dans un Core Banking Système bancaire. Les erreurs sont résolues la nuit, par batchs.
Un autre approche consiste à mixer le mode ALO avec une déduplication des messages au niveau des consommateurs pour obtenir un mode idempotent : le consommateur maintient une liste des messages qu’il a déjà traitée.