Dans RabbitMQ, lorsqu'un message devient un message en erreur (un message que les consommateurs ne peuvent pas traiter) dans une file d'attente, il est réacheminé vers un autre échange, que nous appelons un échange de messages en erreur. L'échange de messages en erreur envoie ensuite le message en erreur vers une file d'attente, qui est la file d'attente des messages en erreur.

Illustration de la file d'attente des messages en erreur

File d'attente des messages en erreur

L'illustration ci-dessus décrit l'ensemble du processus, de la génération des messages en erreur à leur traitement.

Génération des messages en erreur

Voici les conditions de génération des messages en erreur :

  • Le message est rejeté manuellement par le consommateur (basic.reject / basic.nack), et requeue = false.
  • Le temps de vie du message (TTL) expire.
  • La file d'attente atteint sa longueur maximale.

Étapes de traitement de la file d'attente des messages en erreur

  1. Définir un échange de messages en erreur (ne vous laissez pas tromper par le nom, c'est simplement un échange régulier, il est appelé ainsi uniquement dans le contexte du traitement des messages en erreur).
  2. Définir une file d'attente à lier à l'échange de messages en erreur (cette file d'attente est appelée file d'attente des messages en erreur, et c'est aussi une file d'attente régulière).
  3. Définir un consommateur de messages en erreur pour consommer la file d'attente des messages en erreur (ne vous laissez pas tromper par le nom, c'est aussi un consommateur régulier).
  4. Lier l'échange de messages en erreur à la file d'attente spécifiée (la file d'attente qui doit gérer les messages en erreur devrait être liée).

Astuce : Reportez-vous à l'illustration ci-dessus pour comprendre le principe. Tous les langages de programmation gèrent les files d'attente des messages en erreur de manière similaire.

Traitement de la file d'attente des messages en erreur en Golang

1. Définir l'échange de messages en erreur

Le définir comme un échange régulier.

// Déclarer l'échange
err = ch.ExchangeDeclare(
    "tizi365.dead",   // Nom de l'échange
    "topic", // Type d'échange
    true,     // Durable
    false,
    false,
    false,
    nil,
)

2. Définir la file d'attente des messages en erreur

La définir comme une file d'attente régulière.

    // Déclarer la file d'attente
    q, err := ch.QueueDeclare(
        "",    // Nom de la file d'attente, laisser vide pour en générer un aléatoire
        false, // File d'attente durable
        false,
        true,
        false,
        nil,
    )

    // Lier la file d'attente à l'échange de messages en erreur
    err = ch.QueueBind(
        q.Name, // Nom de la file d'attente
        "#",     // Clé de routage, # signifie correspondre à toutes les clés de routage, ce qui signifie recevoir tous les messages en erreur
        "tizi365.dead", // Nom de l'échange de messages en erreur
        false,
        nil)

Astuce : Traitez la file d'attente des messages en erreur comme une file d'attente régulière.

3. Définir le consommateur de messages en erreur

// Créer un consommateur
msgs, err := ch.Consume(
    q.Name, // Référence au nom de la file d'attente des messages en erreur précédente
    "",     // Nom du consommateur, s'il n'est pas fourni, un sera généré aléatoirement
    true,   // Acknowledgement automatique du traitement du message
    false, 
    false, 
    false, 
    nil,
)

// Boucler pour consommer des messages de la file d'attente des messages en erreur
for d := range msgs {
    log.Printf("Message en erreur reçu=%s", d.Body)
}

4. Lier l'échange de messages en erreur à une file d'attente spécifique

	// Propriétés de la file d'attente
	props := make(map[string]interface{})
	// Lier l'échange de messages en erreur
	props["x-dead-letter-exchange"] = "tizi365.dead"
	// Optionnel : Définir la clé de routage lorsque le message en erreur est livré à l'échange de messages en erreur. Si elle n'est pas définie, la clé de routage du message d'origine sera utilisée.
	// props["x-dead-letter-routing-key"] = "www.tizi365.com"

	q, err := ch.QueueDeclare(
		"tizi365.demo.hello", // Nom de la file d'attente
		true,   // Durable
		false, 
		false, 
		false,   
		props,     // Définir les propriétés de la file d'attente
	)

De cette manière, si des messages dans la file d'attente tizi365.demo.hello deviennent des messages en erreur, ils seront transférés vers l'échange de messages en erreur tizi365.dead.