Le RabbitMQ ne prend pas en charge nativement les messages retardés. Actuellement, les principales implémentations incluent l'utilisation d'un échange de lettres mortes + un schéma de temps de vie des messages ou du plugin rabbitmq-delayed-message-exchange.
Cas d'utilisation des files d'attente retardées
- Scénarios où des exigences temporelles existent pour la production et la consommation de messages. Par exemple, dans des transactions de commerce électronique, il existe un scénario où les commandes sont closes si le paiement n'est pas effectué dans un délai imparti. Dans ce cas, un message retardé est envoyé lors de la création de la commande. Ce message sera livré au consommateur 30 minutes plus tard, et le consommateur doit vérifier si la commande correspondante a été payée. Si le paiement n'est pas effectué, la commande est close ; si le paiement est effectué, le message est ignoré.
- Scénarios où des tâches retardées sont déclenchées par des messages. Par exemple, l'envoi de messages de rappel aux utilisateurs après un certain laps de temps.
Solution avec échange de lettres mortes + schéma TTL des messages
L'idée principale de cette approche est de créer une file d'attente sans consommateurs et d'utiliser le temps d'expiration des messages (TTL). Lorsqu'un message expire, il devient une lettre morte, est routé vers un échange de lettres mortes, puis vers une file d'attente de lettres mortes, qui peut être consommée.
Dans cette approche, le temps d'expiration du message sert de délai de message. Par exemple, si le TTL du message est défini à 30 secondes et qu'il n'y a pas de consommateurs pour la file d'attente, le message expirera après 30 secondes et deviendra une lettre morte, qui sera traitée par la file d'attente de lettres mortes.
Pour mettre en œuvre cette approche, les propriétés doivent être définies comme décrit dans les deux tutoriels suivants :
Solution avec plugin de messages retardés
1. Installation du plugin
Dépôt GitHub rabbitmq-delayed-message-exchange :
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
Téléchargez le fichier rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez depuis la section des ressources de la page de publication sur GitHub et placez le fichier dans le répertoire des plugins RabbitMQ (répertoire des plugins).
Remarque : Le numéro de version peut différer de celui indiqué dans ce tutoriel. Si votre RabbitMQ est la dernière version, choisissez simplement la dernière version du plugin.
2. Activation du plugin
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
3. Définition de l'échange
Définissez les propriétés d'échange personnalisées en utilisant x-delayed-type pour prendre en charge l'envoi de messages retardés.
props := make(map[string]interface{})
// Paramètre clé pour prendre en charge l'envoi de messages retardés
props["x-delayed-type"] = "direct"
// Déclarez l'échange
err = ch.ExchangeDeclare(
"file.attente.retard", // Nom de l'échange
"fanout", // Type d'échange
true, // Durable
false,
false,
false,
props, // Définir les propriétés
)
4. Envoi de messages retardés
Définissez le temps de retard du message en utilisant l'en-tête du message (x-delay).
msgHeaders := make(map[string]interface{})
// Définir le temps de retard du message en utilisant l'en-tête du message, en millisecondes
msgHeaders["x-delay"] = 6000
err = ch.Publish(
"file.attente.retard", // Nom de l'échange
"", // Paramètre de routage
false,
false,
amqp.Publishing{
Headers: msgHeaders, // Définir les en-têtes du message
ContentType: "text/plain",
Body: []byte(body),
})
Remarque : Si vous utilisez le service de file d'attente de message RabbitMQ d'Alibaba Cloud directement, vous pouvez définir le temps de retard en utilisant l'attribut de l'en-tête de message (retard) sans installer le plugin. Alibaba Cloud a déjà étendu RabbitMQ à cette fin.