RabbitMQ unterstützt nativ keine verzögerten Nachrichten. Derzeit umfassen die Hauptimplementierungen die Verwendung eines Dead-Letter-Exchange + Message-TTL-Schemas oder des RabbitMQ-Delayed-Message-Exchange-Plugins.

Anwendungsfälle für verzögerte Queues

  • Szenarien, in denen Zeitfensteranforderungen für die Nachrichtenerzeugung und -konsumierung bestehen. Zum Beispiel gibt es in E-Commerce-Transaktionen ein Szenario, in dem Bestellungen geschlossen werden, wenn die Zahlung innerhalb einer Timeout-Periode nicht abgeschlossen wird. In diesem Fall wird eine verzögerte Nachricht gesendet, wenn die Bestellung erstellt wird. Diese Nachricht wird 30 Minuten später an den Verbraucher geliefert, und der Verbraucher muss überprüfen, ob die entsprechende Bestellung bezahlt wurde. Wenn die Zahlung nicht abgeschlossen ist, wird die Bestellung geschlossen; wenn die Zahlung abgeschlossen ist, wird die Nachricht ignoriert.
  • Szenarien, in denen verzögerte Aufgaben durch Nachrichten ausgelöst werden. Zum Beispiel das Senden von Erinnerungsnachrichten an Benutzer nach einer festgelegten Zeitspanne.

Dead-Letter-Exchange + Message-TTL-Schema

Die Kernidee dieses Ansatzes besteht darin, eine Queue ohne Verbraucher zu erstellen und die Ablaufzeit der Nachricht (TTL) zu nutzen. Wenn eine Nachricht abläuft, wird sie zu einem Dead Letter, der an einen Dead-Letter-Exchange geroutet und dann an eine Dead-Letter-Queue gesendet wird, die konsumiert werden kann.

In diesem Ansatz dient die Ablaufzeit der Nachricht als Verzögerungszeit der Nachricht. Wenn beispielsweise die Nachrichtenttl auf 30 Sekunden eingestellt ist und es keine Verbraucher für die Queue gibt, läuft die Nachricht nach 30 Sekunden ab und wird zu einem Dead Letter, der von der Dead-Letter-Queue behandelt wird.

Um diesen Ansatz umzusetzen, müssen die Eigenschaften wie in den folgenden zwei Anleitungen beschrieben standardmäßig sein:

Lösung mit dem verzögerten Nachrichten-Plugin

1. Installation des Plugins

GitHub-Repository für RabbitMQ-Delayed-Message-Exchange:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

Laden Sie die rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez-Datei aus dem Asset-Bereich der Release-Seite auf GitHub herunter und platzieren Sie die Datei im RabbitMQ-Plugin-Verzeichnis (Plugins-Verzeichnis).

Hinweis: Die Versionsnummer kann von der in diesem Tutorial abweichen. Wenn Ihr RabbitMQ die neueste Version ist, wählen Sie einfach die neueste Version des Plugins.

2. Aktivieren des Plugins

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

3. Definieren des Exchanges

Legen Sie benutzerdefinierte Exchange-Eigenschaften fest und verwenden Sie x-delayed-type, um das Senden von verzögerten Nachrichten zu unterstützen.

props := make(map[string]interface{})
// Schlüsselparameter zur Unterstützung des Sendens von verzögerten Nachrichten
props["x-delayed-type"] = "direct"

// Exchange deklarieren
err = ch.ExchangeDeclare(
"delay.queue", // Exchange-Name
"fanout",      // Exchange-Typ
true,          // Dauerhaft
false,
false,
false,
props,         // Eigenschaften setzen
)

4. Senden von verzögerten Nachrichten

Legen Sie die Nachrichtenverzögerungszeit mithilfe des Nachrichtenkopfs (x-delay) fest.

msgHeaders := make(map[string]interface{})
// Legen Sie die Nachrichtenverzögerungszeit mithilfe des Nachrichtenkopfs in Millisekunden fest
msgHeaders["x-delay"] = 6000

err = ch.Publish(
"delay.queue", // Exchange-Name
"",            // Routing-Parameter
false,
false,
amqp.Publishing{
Headers: msgHeaders,   // Nachrichtenkopf setzen
ContentType: "text/plain",
Body: []byte(body),
})

Hinweis: Wenn Sie den RabbitMQ Message Queue-Dienst von Alibaba Cloud direkt verwenden, können Sie die Verzögerungszeit mithilfe des Nachrichtenkopfattributs (delay) ohne Installation des Plugins festlegen. Alibaba Cloud hat RabbitMQ bereits für diesen Zweck erweitert.