Introduction au protocole AMQP
AMQP (Advanced Message Queuing Protocol) est un protocole standard au niveau applicatif qui fournit des services de messagerie unifiée, et constitue une norme ouverte pour les protocoles de niveau applicatif conçus pour les middlewares orientés message. AMQP est un protocole réseau permettant de transmettre des messages asynchrones entre processus.
Les clients et middlewares de messages basés sur ce protocole peuvent livrer des messages sans être limités par différents produits clients/middleware, langages de développement différents, etc.
Les principales caractéristiques de l’AMQP sont orientées messages, en file d’attente, routage (y compris pair-à-pair et publication/abonnement), fiabilité et sécurité. AMQP impose le comportement des fournisseurs de messages et des clients, permettant une véritable interopérabilité entre différents fournisseurs.
AMQP et JMS
JMS était une tentative de standardiser les premiers middleware de messagerie, il n’était standardisé qu’au niveau de l’API, et il était loin de créer une interopérabilité.
Contrairement au JMS, l’AMQP est un protocole au niveau du fil qui décrit le format des données transmises sur un réseau, s’écoulant en octets. En conséquence, tout outil qui respecte ce format de données, créant et interprétant des messages, est interopérable avec d’autres outils compatibles.
Composition du noyau AMQP
Producteur
Actualités de production.
ConnectionFactory
L’usine qui fabrique Connection.
Connexion
Connexion, connexion réseau applicatif avec Broker TCP/IP/Triple Handshake et Quad Wave.
Les connexions AMQP sont généralement de longues connexions. AMQP est un protocole de couche application qui utilise TCP pour assurer une livraison fiable. L’AMQP utilise des mécanismes d’authentification et offre une protection TLS (SSL). Lorsqu’une application n’a plus besoin de se connecter au proxy AMQP, elle doit libérer la connexion AMQP de manière élégante au lieu de simplement couper la connexion TCP.
Canal
Le canal réseau est une connexion légère construite au-dessus de la connexion. Presque toutes les opérations sont effectuées dans des canaux, qui sont des canaux pour lire et écrire des messages, et les clients peuvent établir des paires pour chaque canal, chacun représentant une tâche de session.
Si la connexion est comparée à un câble à fibre optique, alors le canal du canal est comparé à l’une des fibres d’un câble à fibre optique. Un nombre quelconque de canaux peut être créé sur une connexion.
La plupart de nos opérations commerciales se déroulent dans l’interface Channel, notamment :
- queueDéclare
- Le ExchangeDeclare pour le commutateur
- queueBind queueBind
- Publiez le message de base
- Actualités consommateursbasicConsume, etc.
Courtier
Accepter la connexion du client pour implémenter des services d’entité AMQP, tels que rabbitmq.
VirtualHost (hébergement web)
L’hébergement virtuel, utilisé pour l’isolation logique, peut avoir plusieurs échanges et files d’attente, et le même hôte virtuel ne peut pas avoir d’échanges portant le même nom.
Pour implémenter plusieurs environnements isolés (utilisateurs, groupes d’utilisateurs, commutateurs, files d’attente, etc.) sur un seul proxy, AMQP fournit le concept d’hôtes virtuels (hôtes virtuels - vhosts). Cela est très similaire au concept d’hébergement web des serveurs Web, qui offre un environnement complètement isolé pour les entités AMQP. Lorsque la connexion est établie, le client AMQP spécifie quel hôte virtuel utiliser.
Échanger
Le commutateur accepte les messages et envoie des messages à la file liée selon la clé de routage (sans capacité de stockage de messages).
Un commutateur est une entité AMQP utilisée pour envoyer des messages. Après que le commutateur reçoit un message, il le dirige vers une ou zéro file d’attente. L’algorithme de routage qu’il utilise est déterminé par le type de commutateur et les règles de liaison.
Type d’interrupteur :
- Échange direct
- Échange de fanouts
- Échange de sujets
- Échange de têtes
Propriétés de l’interrupteur :
- Nom : Le nom de l’interrupteur
- Durabilité : Un indicateur de persistance indiquant si ce commutateur est maintenu ou non
- Suppression automatique : drapeau Suppression, indiquantLorsque toutes les files d’attente sont terminées via cet échange, qu’elles soient supprimées ou non
- Arguments : Dépendant de l’agent lui-même
Statut du changement :
Les commutateurs persistants existeront après le redémarrage du courtier, tandis que les commutateurs de staging ne le seront pas (ils devront être redéclarés une fois que le courtier sera de nouveau en ligne).
Commutateur par défaut
L’échange par défaut est en réalité un échange direct pré-déclaré par le courtier de messages et sans nom (le nom est une chaîne vide).
Vous pouvez considérer l’interrupteur par défaut comme un commutateur spécial à attachement direct. Nom du commutateur par défaut : Null string (AMQP par défaut) Type d’interrupteur par défaut : Interrupteur à attachement direct
Lors de la création d’une file d’attente, tant que le commutateur à lier à être lié n’est pas spécifié, il sera automatiquement lié au commutateur par défaut, et le nom de la clé de routage de la liaison sera le même que celui de la file d’attente.
Connexion directe à l’interrupteur
Un commutateur attaché directement transmet des messages à une file de clés de liaison correspondantes en fonction de la clé de routage portée par le message. Le routage unicast utilisé par le commutateur direct pour traiter le message.
Lors de la création d’une file d’attente, si elle est liée à un commutateur direct, elle n’a pas besoin de spécifier le nom de la clé de routage, car elle aura un nom de clé de routage par défaut, qui est le même que le nom de la file d’attente.
Une file d’attente de commutateurs connectés directement distribue généralement les tâches à plusieurs consommateurs dans une boucle (on appelle cela un polling).
Flux de travail :
- Lors de la liaison d’une file d’attente à un switch, on lui attribue une clé de liaison, en supposant R ;
- Lorsqu’un message avec une clé de routage est envoyé à un commutateur connecté directement, le commutateur le dirige vers une file d’attente avec une clé de routage.
Interrupteurs de ventilateur
Le commutateur ventilateur aligne les messages vers toutes les files d’attente qui lui sont liées, quel que soit le code de routage lié.
Si N files d’attente sont liées à un commutateur de secteur, lorsqu’un message est envoyé à ce commutateur de secteur, le commutateur envoie une copie du message à toutes les N files séparément. Les commutateurs à ventilateur sont généralement utilisés pour gérer le routage diffusé des messages.
Scénarios d’application :
diffusion de messages ; Fonction de chat de groupe.
Changement de thème
Le changement de sujet envoie des messages à une ou plusieurs files d’attente selon la clé de routage et le type d’Exchange, et nous l’utilisons souvent pour implémenter divers abonnements publish/subscribe, c’est-à-dire publier.
Les règles de routage pour les commutateurs à attachement direct sont strictement correspondantes, ce qui signifie que la clé de routage doit correspondre à la clé de liaison avant d’envoyer un message à la file d’attente. Les règles de routage du changement de sujet sont des parties floues qui peuvent être livrées en satisfayant certaines règles via des jokers.
Elle stipule :
- Il peut y avoir deux caractères spéciaux * et # dans la touche de liaison pour le jumelage flou. où * est utilisé pour correspondre un mot, #用于匹配多个单词 (peut être zéro)
- Une clé de routage est une chaîne séparée par des points (nous appelons chaque chaîne individuelle séparée par un point un mot)
- Lorsque le producteur envoie le message Route Key=A.A.A, seul A.*.* est satisfait, et il ne sera routé qu’à la file d’attente1.
- Lorsque le producteur envoie le message Routier Key=A.B.A, satisfaisant A.*.* et *.B.* seront routés vers les files d’attente1 et 2.
- Lorsque le producteur envoie le message Route Key=A.B.C, alors A.*.* et *.B.* et *.* sont satisfaits. C est dirigé vers la file d’attente1, la file 2, la file d’attente3.
Scénarios d’application :
- des mises à jour d’actualité impliquant des catégories ou des tags ;
- Tâches en arrière-plan réalisées par plusieurs travailleurs, chacun étant responsable de la gestion de certaines tâches spécifiques.
Interrupteur de tête
Les commutateurs d’en-tête ne reposent pas sur les règles de correspondance de la clé de routage pour lier les clés de routage afin de router les messages, mais correspondent plutôt à l’attribut des en-têtes dans le contenu du message envoyé.
Les interrupteurs de tête peuvent être considérés comme une autre manifestation d’un interrupteur à attachement direct. Cependant, la clé de routage d’un commutateur direct doit être une chaîne, et les valeurs d’attribut de l’en-tête ne sont pas contraintes par cela, elles peuvent même être des entiers ou des valeurs de hachage (dictionnaires), etc. Plus de flexibilité (mais en pratique, nous utilisons rarement des interrupteurs de tête).
Flux de travail :
- Lorsqu’une file d’attente est liée à un commutateur d’en-tête, plusieurs en-têtes sont liées simultanément pour l’appariement.
- Les messages entrants portent un en-tête et un paramètre « x-match ». Lorsque « x-match » est défini sur « any », n’importe quelle valeur de l’en-tête peut être associée, et lorsque « x-match » est fixé à « all », toutes les valeurs de l’en-tête doivent être associées.
Résumé de la commutation
Reliure
Connexion virtuelle entre Exchange et Queue.
BindingKey est une description de règle pour les liaisons Exchange et Queue. La clé de liaison spécifie quel type de clé de routage sera attribué à la file d’attente actuellement liée dans l’échange courant.
Clé de routage
Règles de routage, que la machine virtuelle peut utiliser pour déterminer comment router un message particulier.
Clé de liaison vs. clé de routage
- La clé de liaison est la clé de liaison entre la file d’attente et le commutateur ;
- La clé de routage est une information envoyée par le producteur au commutateur ;
- Lorsque la clé de liaison et la clé de routage correspondent, placez le message dans la file correspondante.
La clé de liaison est la description de la règle d’Exchange et de liaison de files d’attente, utilisée pour analyser lorsque Exchange reçoit un message, le message reçu par Exchange aura un champ de clé de routage, et Exchange associe cette clé de routage à toutes les clés de liaison de l’Exchange actuel, et si les exigences sont remplies, elle sera envoyée en liaison La clé est liée à la file d’attente pour envoyer le message.
Clé de liaison vs. clé de routage dans divers commutateurs
Commutateur par défaut : La clé de liaison correspond au nom de la file d’attente, qui ne peut pas être personnalisé. La clé de routage est également le nom de la file avant qu’elle ne puisse être acheminée avec succès vers la file d’attente Commutateur de connexion directe : Binding Key est le nom de la file d’attente, qui peut être personnalisé. Les clés de routage ne peuvent être acheminées avec succès vers la file d’attente que lorsque la clé de liaison est la même Interrupteur ventilateur : Pas de clé de liaison ; Bien sûr, il n’y a pas de Clé de Routage. Automatiquement acheminé vers toutes les files d’attente liées au commutateur Changement de thème : clé de liaison personnalisée ; Personnalisez la clé de routage. Clé de routage==Clé de liaison, et la correspondance floue doit être routée avec succès vers la file d’attente Interrupteur de tête : pas de clé de connexion ; Bien sûr, il n’y a pas de Clé de Routage. Les correspondances se basent sur l’attribut des en-têtes dans le contenu du message envoyé
Queue
Stocke les messages qui vont être consommés par l’application.
Propriétés de la file d’attente :
- Nom : Le nom de la file d’attente
- Durable : La file d’attente existe toujours après le redémarrage du broker de messages
- Exclusif : Utilisé par une seule connexion, et la file d’attente est supprimée lorsque la connexion est fermée
- Suppression automatique : supprimé lorsque le dernier consommateur se désabonnement
- Arguments : Certains brokers de messages l’utilisent pour effectuer des fonctions supplémentaires similaires à TTL
Création de files d’attente : Les files d’attente ne peuvent être utilisées qu’après leur déclaration. Si une file d’attente n’existe pas déjà, déclarer une file la crée. Si la file d’attente déclarée existe déjà et que les attributs sont identiques, la déclaration n’a aucun effet sur la file d’attente d’origine. Si les attributs dans la déclaration diffèrent de ceux de la file d’attente existante, une exception au niveau du canal avec un code d’erreur 406 est lancée.
Persistance de la file d’attente : La file de persistance est stockée sur le disque et y reste lorsque le courtier est redémarré. Les files d’attente qui ne sont pas persistées sont appelées files d’attente transitoires. Tous les scénarios et cas ne nécessitent pas la persistance de la file d’attente.
Une file persistante ne rend pas les messages qui lui sont renvoyés persistants. Si l’agent de messages raccroche et est redémarré, la file de persistance sera redéclarée lors du redémarrage, et dans tous les cas, seuls les messages persistants peuvent être restaurés.
Consommateur
Actualités sur la consommation des consommateurs. Dans AMQP, il existe deux façons pour les consommateurs de recevoir des messages en attente :
Le middleware de messages transmet les messages aux consommateurs (API push) Les consommateurs reçoivent activement des messages (pull API) Remarque : Lorsque plusieurs consommateurs écoutent la même file, les messages dans la file ne seront consommés que par un seul consommateur (pas une fois pour chaque consommateur)
Message
Les données transmises entre messages, services et applications se composent de propriétés et de corps.
Les attributs modifient les messages, tels que la priorité du message, le délai et d’autres fonctionnalités avancées, et le corps principal est le contenu du corps du message.
Propriétés du message :
- Type de contenu
- Encodage de contenu
- Clé de routage
- Mode de diffusion (persistant ou non)
- Mode de livraison (persistant ou non persistant)
- Priorité des messages
- Horodatage de publication des messages
- Période d’expiration
- Identifiant d’application de l’éditeur
Corps du message : En plus des attributs, les messages AMQP contiennent également une charge utile (les données que le message transporte réellement), qui est traitée par le proxy AMQP comme un tableau opaque d’octets.
Le courtier de messages n’inspecte ni ne modifie la charge utile. Les messages ne peuvent contenir que des attributs sans porter de charge utile. Il utilise généralement des données en format sérialisé comme le JSON, et pour économiser de l’argent, les tampons de protocole et les MessagePacks sérialisent les données structurées pour publication sous forme de charge utile de messages. AMQP et ses pairs utilisent généralement les champs « type de contenu » et « encodage de contenu » pour communiquer avec les messages afin d’identifier les charges utiles, mais cela ne se base que sur des conventions.
Persistance du message : Les messages sont publiés de manière persistante, et l’agent AMQP stocke ce message sur disque. Si le serveur est redémarré, le système confirme que le message de persistance reçu n’est pas perdu.
Le simple fait d’envoyer un message à un commutateur persistant ou de le renvoyer vers une file persistante ne rend pas le message persistant : la persistance du message dépend entièrement du mode de persistance du message lui-même.
Publier des messages de manière persistante peut avoir un impact sur la performance.
Processus de travail AMQP
L’éditeur publie un message via l’Échange.
Le commutateur distribue les messages entrants à la file d’attente liée au commutateur selon les règles de routage.
Enfin, l’agent AMQP transmettra le message au consommateur qui s’est abonné à cette file, ou le consommateur le recevra lui-même selon les besoins.
Mécanisme de messagerie AMQP
Confirmation du message
Les consommateurs échouent parfois à traiter les messages ou plantent directement. Et des raisons liées au réseau peuvent aussi causer divers problèmes. Cela nous pose la question de savoir quand est le bon moment pour les agents AMQP de supprimer les messages.
Les deux modes d’accusé de réception des messages de l’AMQP :
Mode de confirmation automatique : Supprimez le message dès qu’il est envoyé au consommateur par le middleware du message. (En utilisant la méthode AMQP : basic.deliver ou basic.get-ok) Mode de confirmation explicite : Attendez que le consommateur envoie un accusé de réception avant de supprimer le message. (En utilisant la méthode AMQP : basic.ack) Si un consommateur raccroche sans envoyer de confirmation reçue, l’agent AMQP renvoie le message à un autre consommateur. S’il n’y a pas de consommateurs disponibles à ce moment-là, le courtier à messages attend que le prochain consommateur s’enregistre dans cette file d’attente puis tente de livrer à nouveau.
Refuser les messages
Lorsqu’un consommateur reçoit un message, le processus de traitement peut réussir ou échouer. Le consommateur peut indiquer au broker de messages (middleware de messages) que le message n’a pas été traité (ou n’a pas été complété à ce stade) en raison d’un « message rejeté ». Lorsqu’un message est rejeté, le consommateur peut dire au courtier de messages quoi en faire – le détruire ou le remettre en file d’attente.
Lorsqu’il n’y a qu’un seul consommateur dans cette file, assurez-vous de ne pas rejeter le message et de choisir de le remettre dans la file, ce qui fera boucler indéfiniment le message sur le même consommateur.
En AMQP, la méthode de base .reject est utilisée pour effectuer l’opération de rejet des messages. Cependant, basic.reject a une limitation : vous ne pouvez pas l’utiliser pour rejeter plusieurs messages avec accusés de réception. Mais si vous utilisez RabbitMQ, vous pouvez utiliser l’extension AMQP 0-9-1 appelée accusés de réception négative (également appelés nacks) pour résoudre ce problème.
Langue source:La connexion hyperlientérée est visible.
|