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)
}