Topic-режим RabbitMQ в Golang похож на режим маршрутизации (Direct), с наибольшим различием в том, что параметры маршрутизации в режиме topic поддерживают нечеткое сопоставление. Тип обмена для режима topic - 'topic'.

Архитектура режима topic выглядит следующим образом: RabbitMQ Topic Mode

Примечание: Если вы не знакомы с режимом topic в RabbitMQ, пожалуйста, сначала прочитайте раздел RabbitMQ topic mode.

1. Обзор пошагового руководства

Пожалуйста, ознакомьтесь с следующими разделами по порядку:

Примечание: Поскольку раздел "Реализация шаблона публикации/подписки в 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)
    }