Wzorzec routingu w RabbitMQ dla Golang

Wzorzec routingu w RabbitMQ rozszerza metodę routingu wymiany na podstawie wzorca publikuj-prenumeruj. Typ wymiany dla wzorca routingu to bezpośredni, który jest także domyślną wymianą dla RabbitMQ. W poprzednich sekcjach nie użyto jawnie określonej wymiany, ale używana była faktycznie wymiana bezpośrednia.

Wskazówka: Jeśli nie jesteś zaznajomiony z zasadami wzorca routingu, przeczytaj Wzorce routingu w RabbitMQ.

1. Samouczek Wymagany

Proszę najpierw przeczytać rozdział o Wzorcu publikuj-prenumeruj w Golang RabbitMQ. W zasadzie różne tryby pracy RabbitMQ są implementowane przez różne rodzaje wymian. Kod jest prawie taki sam, a główna różnica polega na definicji wymiany. Dlatego, gdy zrozumiesz wzorzec publikuj-prenumeruj, inne wzorce są dość proste.

2. Deklarowanie Wymiany Bezpośredniej

err = ch.ExchangeDeclare(
  "tizi365_direct", // Nazwa wymiany, musi być unikalna
  "direct",         // Typ wymiany
  true,             // Trwała
  false,            // Auto-usuwana
  false,            // Wewnętrzna
  false,            // Bez oczekiwania
  nil,              // Argumenty
)

3. Wysyłanie Wiadomości

	// Zawartość wiadomości
	body := "Cześć Tizi365.com!"
	
	// Wysyłanie wiadomości
	err = ch.Publish(
		"tizi365_direct",     // Wymiana (nazwa wymiany)
		"blog",               // Klucz routowania, istotny parametr określający, do jakiej kolejki zostanie wysłana twoja wiadomość
		false,                // Obowiązkowa
		false,                // Natychmiastowa
		amqp.Publishing {
			ContentType: "text/plain",   // Typ zawartości wiadomości, w tym przypadku zwykły tekst
			Body:        []byte(body),    // Zawartość wiadomości
		})

4. Odbieranie Wiadomości przez Konsumenta

4.1. Wiązanie Wymiany

// Deklarowanie kolejki, na której będzie operowane
q, err := ch.QueueDeclare(
  "",     // Nazwa kolejki, jeśli nie jest określona, zostanie wygenerowana losowa
  false,  // Trwała kolejka
  false,  // Usuń po nieużywaniu
  true,   // Wyłączna
  false,  // Bez oczekiwania
  nil,    // Argumenty
)

// Wiązanie kolejki do określonej wymiany
err = ch.QueueBind(
  q.Name,             // Nazwa kolejki
  "blog",             // Klucz routowania, jeśli pasuje do parametru routowania określonego podczas wysyłania wiadomości, wiadomość jest dostarczana do bieżącej kolejki
  "tizi365_direct",   // Nazwa wymiany, która musi być zgodna z wymianą zdefiniowaną na końcu wysyłającej wiadomość
  false,
  nil)

4.2. Konsumowanie Wiadomości

// Tworzenie konsumenta
msgs, err := ch.Consume(
  q.Name, // Odwołanie do wcześniejszej nazwy kolejki
  "",     // Nazwa konsumenta, jeśli nie jest wypełniona, zostanie wygenerowana losowa
  true,   // Automatyczne potwierdzanie wiadomości przetworzonych przez kolejkę
  false,  // Wyłączne
  false,  // Bez lokalnego
  false,  // Bez oczekiwania
  nil,    // Argumenty
)

// Pętla konsumująca wiadomości w kolejce
for d := range msgs {
  log.Printf("Otrzymano wiadomość=%s", d.Body)
}