Topic-режим RabbitMQ в Golang похож на режим маршрутизации (Direct), с наибольшим различием в том, что параметры маршрутизации в режиме topic поддерживают нечеткое сопоставление. Тип обмена для режима topic - 'topic'.
Архитектура режима topic выглядит следующим образом:
Примечание: Если вы не знакомы с режимом topic в RabbitMQ, пожалуйста, сначала прочитайте раздел RabbitMQ topic mode.
1. Обзор пошагового руководства
Пожалуйста, ознакомьтесь с следующими разделами по порядку:
- Раздел Основные концепции RabbitMQ
- Раздел RabbitMQ topic mode
- Раздел Реализация шаблона публикации/подписки в Golang RabbitMQ
Примечание: Поскольку раздел "Реализация шаблона публикации/подписки в Golang RabbitMQ" уже содержит полные примеры кода, отличаются только определение обмена и параметры маршрутизации для других режимов RabbitMQ. Поэтому показывается только ключевой код.
2. Объявление тематического обмена
err = ch.ExchangeDeclare(
"tizi365_topic", // Имя обмена, должно быть уникальным
"topic", // Тип обмена
true, // Долговечный
false, // Автоматически удаляемый
false, // Внутренний
false, // Без ожидания
nil, // Аргументы
)
3. Отправка сообщений
// Содержание сообщения
body := "Привет, Tizi365.com!"
// Отправка сообщения
err = ch.Publish(
"tizi365_topic", // Имя обмена
"www.tizi365.com", // Параметр маршрутизации, ключевой параметр, определяющий, в какую очередь будет отправлено ваше сообщение
false, // Обязательный
false, // Немедленный
amqp.Publishing {
ContentType: "text/plain", // Тип содержимого сообщения, здесь он является обычным текстом
Body: []byte(body), // Содержание сообщения
})
4. Получение сообщений
4.1. Привязка обмена
// Объявление очереди для операций
q, err := ch.QueueDeclare(
"", // Имя очереди, будет сгенерировано случайным образом, если не заполнено
false, // Долговечная очередь
false, // Удалить при неиспользовании
true, // Исключительная
false, // Без ожидания
nil, // Аргументы
)
// Привязка очереди к указанному обмену
err = ch.QueueBind(
q.Name, // Имя очереди
"*.tizi365.com", // Параметр маршрутизации, ключевой параметр, используя символ * для сопоставления одного слова, если используется #, он может сопоставлять несколько слов
"tizi365_topic", // Имя обмена, должно соответствовать обмену, определенному отправителем сообщения
false,
nil)
4.2. Обработка сообщений
// Создание потребителя
msgs, err := ch.Consume(
q.Name, // Ссылка на имя очереди выше
"", // Имя потребителя, автоматически генерируется, если не заполнено
true, // Автоматическое подтверждение очереди, что сообщение было обработано
false, // Исключительная
false, // Не местное
false, // Без ожидания
nil, // Аргументы
)
// Итерация по потреблению сообщений в очереди
for d := range msgs {
log.Printf("Получено сообщение=%s", d.Body)
}