Architecture de services Orientée Messages, Implémentation

Introduction

Ce document présente une réalisation de l’Architecture Orientée Message présentée dans un autre article. Pour mémoire cette architecture est composée de 2 familles d’applications (producteur de messages et consommateur) qui échangent des messages par l’intermédiaire d’un broker. Dans ce modèle, le broker joue le rôle de gestionnaire de message. Il sait comment orienter les messages entre le producteur et le/les destinataires sans que les applications connectées aient besoin de le savoir.

L’outil, le broker de messages sélectionné est RabbitMQ.

ZeroMQ est réputé pour être plus performant mais pas pour son interface de gestion. Cette solution est populaire pour la performance brute ce qui n’est pas le but recherché pour le moment.

Quelques tests menés sur un ordinateur portable montrent que RabbitMQ peut supporter un flux de 20k messages par secondes de manière soutenue (3h) ce qui est largement suffisant pour le cahier des charges.

Pour ceux qui veulent directement le schéma d’implémentation, c’est par là .

Notions de routage de message

Pour une explication globale des concept de routage de message, c’est par ici.

Pour simplifier au maximum, le service assurant le dispatch des messages est composé d’un point d’échange auquel un producteur envoie des messages, ainsi que de files d’attente qui stockent les messages devant être récupérés par des consommateurs. Selon la configuration (type de point d’échange, “binding”) un message peut être remis à 0, 1 ou plusieurs consommateurs.

L’intérêt d’utiliser un outil pour faire cette fonction est multiple :

  • séparer les producteur des consommateurs (= ils n’ont pas besoin de pouvoir communiquer directement ni de manière synchrone. Pas de dépendance logicielle entre le consommateur et le producteur, seulement être d’accord sur le format de message)
  • réaliser l’inversion de contrôle (IoC) permettant de pouvoir lancer les applications dans le sens que l’on souhaite sans s’occuper de l’ordre des traitements (en terme réseau, les applications sont clientes. Le broker est serveur).
  • pas besoin de réinventer la roue de la communication réseau avec les problèmes associés (outil de supervision, ré-émission des messages, sauvegarde sur disque …)

La spécification d’AMQP définie plusieurs façon de router les messages, comme indiqué dans les concepts.

Dans le cas présent un routage basé sur la clef de routage est utilisé.

  • Exemple d’utilisation de la clef de routage

Le routage par motif permet de router un message dans plusieurs files d’attentes.

Dans cet exemple, la clef de routage associée aux messages est composée d’une partie géographique (europe, …) et une autre partie qui indique la nature (news, ….) du message.

Les files d’attentes ont la possibilité de choisir :

  • un type d’information particulier pour une zone spécifique (europe.news),
  • tous les messages d’une zone spécifique (europe.#),
  • un type d’information particulier pour toutes les zones (#.news),
  • tous les messages pour toutes les zones (#)

exemple 2

Mise en oeuvre avec RabbitMQ

On découpe la mise en pratique du besoin sur différents points :

  • les messages
  • les acteurs (producteurs et consommateurs)
  • les points d’échange
  • les clefs de routage et les files d’attente

Les messages

On distingue différents types de messages par leur famille d’utilisation :

  1. les messages de log Ce type de message est transformé dans une chaine d’opération pour permettre l’analyse ultérieure d’une situation. Le flux de messages est unidirectionnel. Généralement un traitement des messages en lot est possible.
  2. les messages interactifs Ce type de message est en fait une demande d’action et peut nécessiter une réponse. Le flux de messages est unidirectionnel. Généralement, un traitement le plus rapide possible est souhaité.

Les acteurs

Services produisant des messages :

Type Où ? Nom des services
log Local (machine) dns, mail, postgresql, syslog, ssh, web
log Distant (réseau LAN) relevé de température (arduino)
log Distant (internet) github, jira, twitter

Application consommant des messages :

Type Où ? Nom des services
log Local (machine) logstash
log Distant (réseau LAN) envois de mail
log Distant (internet) visualisation log en temps réel dans navigateur
app Local (machine) zonecheck (vérification config DNS), indexation site web, redimensionnement d’image

Organisation du broker de messages

La présence d’une interface d’administration pour rRabbitMQ permet de voir rapidement l’ensemble des points d’échanges et des files d’attentes. L’interface permet également de configurer les différents éléments ainsi que les relations.

Pour information, la configuration peut être effectuée par programme au travers des commandes AMQP définies dans le standard.

Point d’échange

Plusieurs solutions sont possibles pour faire communiquer tout ce monde :

  1. un point d’échange par type de message = 1 point d’échange “log” + 1 point d’échange “app”
  2. un point d’échange par type de service = plein de point d’échanges
  3. un mélange des autres solutions
Solution Avantage Inconvénient
1 rapide à mettre en place le routage est obligatoire pour différentier les services par la clef de routage
2 voir facilement le traffic par service (graph), routage simple longue liste de point d’échange
3 permet un maximum de souplesse nécessité de vérifier la configuration pour chaque point d’échange car potentiellement spécifique à celui-là

La solution 2 est celle sélectionnée ici.

Files d’attente

Dans l’optique d’uniformiser la configuration voici les propriétés appliquées :

  • pour chaque point d’échange une file d’attente nommée est créée
  • les messages insérés dans une file d’attente nommée expirent automatiquement
  • la durée d’expiration des messages est suffisamment grande pour qu’une maintenance de l’application consommatrice ne pose pas de perte de message
  • les files d’attente sont systématiquement associées à un point d’échange
  • les applications doivent valider la réception du message après leur traitement
  • les applications de visualisation doivent utiliser des files d’attentes anonymes (car elle n’ont pas d’opération à effectuer sur les messages)

Clef de routage

Dans la mesure du possible, il est conseillé de mettre dans la clef :

  • le nom complet de la machine (FQDN) de manière inversée (le TLD en premier).
  • le nom du service

Exemple de clefs :

  • “eu.r6d.machineA.srv_www”
  • “eu.r6d.machineB.srv_mail”
  • “local.mon-pc.srv_mail”

Lors de la récupération des messages dans des files d’attentes spécifiques à des applications, il sera possible de récupérer :

  • les messages du service mail par l’association de #.srv_mail
  • les messages du domaine r6d.eu par l’association de eu.r6d.#

Scalabilité de la solution

La croissance peut intervenir à plusieurs parties du système.

Voici quelques solutions pour arriver à suivre la demande :

Problème Partie concernée Solution
L’app consommatrice est trop lente sortie Ajouter une autre instance de l’application sur la même file d’attente. Les messages seront consommés en rounb robin
L’app consommatrice reçoit des messages qui ne l’interresse pas interne il faut appliquer un filtrage sur la clef de routage pour sélectionner plus finement les messages
Le serveur de message est lent interne N’y a-t-il pas trop de messages dans les files d’attente ? Il est possible d’augmenter les capacités avec une mise en cluster de RabbitMQ.
Le producteur n’envoie pas les messages aussi vite que d’habitude entrée RabbitMQ limite le débit en entrée lorsque les sorties sont saturée afin de limiter le nombre de messages en file d’attente. Essayer de consommer les messages plus rapidement.

Schéma

schéma d'implémentation

Besoin d’un peu plus d’information pour comprendre ? c’est par là

Légende :

  • lien rouge –> indique que le schéma n’est pas terminé
  • lien orange –> protocole STOMP
  • lien jaune –>
  • lien vert –> protocole MQTT
  • lien bleu –> protocole AMQP

En cours

  • différents modes de routage de messages

exemple 1

Liens :

Acronymes :

MQS : Message Queing Service, service de gestion de message en file d’attente

Licence

logo creative common by-sa 3.0 Creative Commons Paternité – Partage à l’Identique 3.0 non transcrit