coldwa.st
All guidesProgrammingWebDataToolsDatabasesHaskellConceptsCabal & buildsToolchainCompilerPerformanceEditor & HLS

Programmation · Architecture · Backend

C’est quoi une file de messages ?

Par ColdwastMis à jour le 9 juil. 20268 min de lecture#filedemessages#architecture#backend
Un convoyeur automatisé transportant des articles dans une usine
Un convoyeur automatisé transportant des articles dans une usine - une file fait avancer le travail dans l’ordre, un élément à la fois, comme une file de messages.

Quand une partie de votre app doit confier du travail à une autre - envoyer un e-mail, redimensionner une image, débiter une carte - le faire en ligne fait attendre l’utilisateur et lie fortement les deux parties. Une file de messages est la solution standard : un tampon au milieu où un service dépose une tâche et un autre la récupère plus tard. Ce guide explique ce qu’est une file de messages, comment producteurs et consommateurs l’utilisent, et quand vous en avez vraiment besoin.

L’idée centrale : producteur, file, consommateur

Une file de messages se place entre le code qui crée le travail et celui qui l’exécute. Un producteur met un message - une petite unité de données décrivant une tâche - dans la file. Un consommateur retire les messages et les traite. La file conserve chaque message jusqu’à son traitement, en général dans l’ordre premier entré, premier sorti. Point clé : le producteur n’attend pas le consommateur et n’a même pas besoin de savoir qui il est.

Un convoyeur automatisé transportant des packs de bouteilles d’eau dans une usine
Un convoyeur automatisé transportant des articles dans une usine - une file fait avancer le travail dans l’ordre, un élément à la fois, comme une file de messages.

Pourquoi en utiliser une : découplage, tampon, résilience

Une file apporte plusieurs choses à la fois. Elle découple producteur et consommateur, que vous pouvez construire, déployer et faire évoluer séparément. Elle tamponne les pics : si 10 000 inscriptions arrivent d’un coup, elles font la queue au lieu de saturer le worker. Elle ajoute de la résilience, car si un consommateur est en panne, les messages attendent au lieu d’être perdus. Et elle rend le travail asynchrone - vous rendez la main à l’utilisateur immédiatement et faites la partie lente en arrière-plan.

File vs publication/abonnement

Il existe deux motifs courants. Dans une simple file de travail, chaque message est livré à exactement un consommateur - idéal pour répartir des tâches sur un pool de workers. En publication/abonnement (pub/sub), un message est diffusé à chaque abonné intéressé - idéal pour des événements auxquels plusieurs parties du système réagissent. Beaucoup de brokers gèrent les deux, via la notion d’échanges ou de topics pour décider qui reçoit une copie.

Une rangée de tuyaux blancs équipés de débitmètres dans un collecteur industriel
Un collecteur de tuyaux avec des débitmètres - un broker route chaque message vers le bon canal, comme des vannes dirigent le flux.

Les garanties de livraison, honnêtement

Les files décrivent l’effort qu’elles font pour livrer un message : au plus une fois (rapide, peut perdre), au moins une fois (peut livrer deux fois) et exactement une fois (le plus dur, souvent nuancé en pratique). La plupart des systèmes réels offrent l’au-moins-une-fois, ce qui veut dire que vos consommateurs doivent être idempotents - traiter deux fois le même message ne doit pas nuire. Les consommateurs acquittent en général un message seulement après l’avoir fini ; si l’un plante avant l’acquittement, le message est relivré. Les messages qui échouent sans cesse partent dans une file de lettres mortes pour inspection.

Brokers courants : RabbitMQ, Kafka, Redis

Quelques outils dominent. RabbitMQ est un broker classique au routage flexible (il parle AMQP). Apache Kafka est un journal durable à haut débit : il conserve les messages pour que les consommateurs puissent rejouer un flux, ce qui convient aux pipelines d’événements et à l’analytique. Redis propose des files et des streams légers et très rapides, mais moins durables par défaut. Dans le cloud, des options managées comme AWS SQS et Google Pub/Sub retirent la charge d’exploitation. Choisissez selon le besoin : RabbitMQ pour le routage, Kafka pour les flux rejouables à gros volume, Redis pour le simple et rapide.

Quand vous n’en avez pas besoin

Une file est une pièce mobile à faire tourner et surveiller. Si le travail est rapide et que l’appelant a vraiment besoin du résultat tout de suite, un appel de fonction direct ou une écriture en base de données est plus simple. Optez pour une file de messages quand vous avez besoin de tâches d’arrière-plan asynchrones, de tamponner des pics de charge, ou de découpler des services qui ne devraient pas dépendre directement l’un de l’autre - les mêmes raisons qui vous font déjà placer des services derrière un reverse proxy ou un load balancer.

En résumé

Une file de messages est un tampon entre services : les producteurs déposent du travail, les consommateurs le récupèrent, et les deux sont découplés tandis que la charge est lissée. Utilisez une simple file de travail pour répartir des tâches, le pub/sub pour diffuser des événements, attendez-vous à une livraison au-moins-une-fois (rendez donc vos consommateurs idempotents), et optez pour RabbitMQ, Kafka, Redis ou une file cloud managée quand il vous faut un traitement asynchrone fiable.