Golang RabbitMQ-Routenmuster

Das Routenmuster in RabbitMQ erweitert die Austausch-Routingmethode auf der Grundlage des Publish-Subscribe-Musters. Der Austauschtyp für das Routenmuster ist direkt, was auch der Standardaustausch für RabbitMQ ist. In den vorherigen Abschnitten wurde kein expliziter Austausch verwendet, aber der zugrunde liegende Austausch war tatsächlich ein direkter Austausch.

Tipp: Wenn Sie mit den Regeln des Routenmusters nicht vertraut sind, lesen Sie bitte RabbitMQ-Routenmuster.

1. Voraussetzung Tutorial

Bitte lesen Sie zuerst das Kapitel über das Golang RabbitMQ-Publish-Subscribe-Muster. Im Wesentlichen werden die verschiedenen Arbeitsmodi von RabbitMQ durch verschiedene Arten von Austauschen implementiert. Der Code ist fast gleich, der Hauptunterschied liegt in der Definition des Austauschs. Sobald das Publish-Subscribe-Muster verstanden ist, sind andere Muster recht einfach.

2. Deklaration eines direkten Austauschs

err = ch.ExchangeDeclare(
  "tizi365_direct", // Austauschname, muss eindeutig sein
  "direct",         // Austauschtyp
  true,             // Haltbar
  false,            // Auto-gelöscht
  false,            // Intern
  false,            // Kein Warten
  nil,              // Argumente
)

3. Senden von Nachrichten

	// Nachrichteninhalt
	body := "Hallo Tizi365.com!"
	
	// Nachricht senden
	err = ch.Publish(
		"tizi365_direct",     // Austausch (Austauschname)
		"blog",               // Routing-Schlüssel, ein entscheidender Parameter, der bestimmt, an welche Warteschlange Ihre Nachricht gesendet wird
		false,                // Obligatorisch
		false,                // Sofort
		amqp.Publishing {
			ContentType: "text/plain",   // Nachrichteninhaltstyp, in diesem Fall einfacher Text
			Body:        []byte(body),    // Nachrichteninhalt
		})

4. Empfangen von Nachrichten durch den Verbraucher

4.1. Binden des Austauschs

// Deklarieren der zu bearbeitenden Warteschlange
q, err := ch.QueueDeclare(
  "",     // Warteschlangenname, wenn nicht angegeben, wird eine zufällige generiert
  false,  // Dauerhafte Warteschlange
  false,  // Löschen bei Nichtbenutzung
  true,   // Exklusiv
  false,  // Kein Warten
  nil,    // Argumente
)

// Die Warteschlange an den angegebenen Austausch binden
err = ch.QueueBind(
  q.Name,             // Warteschlangenname
  "blog",             // Routing-Schlüssel, wenn er mit dem beim Senden einer Nachricht angegebenen Routing-Parameter übereinstimmt, wird die Nachricht an die aktuelle Warteschlange gesendet
  "tizi365_direct",   // Austauschname, der mit dem Austausch am Ende des Nachrichtensenders übereinstimmen muss
  false,
  nil)

4.2. Nachrichtenkonsumierung

// Einen Verbraucher erstellen
msgs, err := ch.Consume(
  q.Name, // Verweis auf den früheren Warteschlangennamen
  "",     // Verbrauchername, wenn nicht ausgefüllt, wird einer zufällig generiert
  true,   // Automatische Bestätigung von Nachrichten, die von der Warteschlange verarbeitet wurden
  false,  // Exklusiv
  false,  // Nicht lokal
  false,  // Kein Warten
  nil,    // Argumente
)

// Schleife zum Konsumieren von Nachrichten in der Warteschlange
for d := range msgs {
  log.Printf("Nachricht erhalten=%s", d.Body)
}