Try to keep the translation concise and easy to understand.
Golang RabbitMQ w trybie tematycznym jest podobny do trybu routingu (Direct), z największą różnicą polegającą na tym, że parametry routingu w trybie tematycznym obsługują dopasowanie rozmyte. Typ wymiany dla trybu tematycznego to „topic”.
Architektura trybu tematycznego przedstawia się następująco:
Uwaga: Jeśli nie jesteś zaznajomiony z trybem tematycznym RabbitMQ, prosimy przeczytać najpierw sekcję Tryb tematyczny RabbitMQ.
1. Samouczek Wstępny
Prosimy zapoznać się z poniższymi sekcjami w kolejności:
- Sekcja Podstawowe koncepcje RabbitMQ
- Sekcja Tryb tematyczny RabbitMQ
- Sekcja Implementacja wzorca publikuj/subskrybuj w Golang RabbitMQ
Uwaga: Ponieważ sekcja dotycząca wzorca publikuj/subskrybuj w Golang RabbitMQ zawiera już kompletne przykłady kodu, różnice dotyczą jedynie definicji wymiany i parametrów routingu dla innych trybów RabbitMQ. Dlatego pokazany jest tylko kluczowy kod.
2. Deklaracja Wymiany Tematycznej
err = ch.ExchangeDeclare(
"tizi365_topic", // Nazwa wymiany, musi być unikalna
"topic", // Typ wymiany
true, // Trwała
false, // Auto-usunięcie
false, // Wewnętrzna
false, // Bez oczekiwania
nil, // Argumenty
)
3. Wysyłanie Wiadomości
// Treść wiadomości
body := "Witaj Tizi365.com!"
// Wysłanie wiadomości
err = ch.Publish(
"tizi365_topic", // Nazwa wymiany
"www.tizi365.com", // Parametr routingu, kluczowy parametr decydujący, do jakiej kolejki zostanie wysłana twoja wiadomość
false, // Obowiązkowa
false, // Natychmiastowa
amqp.Publishing {
ContentType: "text/plain", // Typ zawartości wiadomości, tutaj jest to zwykły tekst
Body: []byte(body), // Treść wiadomości
})
4. Konsumowanie Wiadomości
4.1. Wiązanie Wymiany
// Deklaracja kolejki, na której będzie wykonywana operacja
q, err := ch.QueueDeclare(
"", // Nazwa kolejki, zostanie losowo wygenerowana, jeśli nie zostanie uzupełniona
false, // Trwała kolejka
false, // Usunięcie, gdy nieużywana
true, // Wyłączna
false, // Bez oczekiwania
nil, // Argumenty
)
// Wiązanie kolejki z określoną wymianą
err = ch.QueueBind(
q.Name, // Nazwa kolejki
"*.tizi365.com", // Parametr routingu, kluczowy parametr, używając symbolu * do dopasowania jednego słowa, jeśli użyty zostanie #, można dopasować kilka słów
"tizi365_topic", // Nazwa wymiany, musi pasować do wymiany zdefiniowanej przez nadawcę wiadomości
false,
nil)
4.2. Obsługa Wiadomości
// Utworzenie konsumenta
msgs, err := ch.Consume(
q.Name, // Odniesienie do nazwy kolejki powyżej
"", // Nazwa konsumenta, automatycznie generowana, jeśli nie zostanie uzupełniona
true, // Automatyczne potwierdzenie kolejce, że wiadomość została obsłużona
false, // Wyłączna
false, // Brak lokalnej
false, // Bez oczekiwania
nil, // Argumenty
)
// Przejście przez konsumowanie wiadomości w kolejce
for d := range msgs {
log.Printf("Otrzymano wiadomość=%s", d.Body)
}