Маршрутизация шаблона в RabbitMQ

Шаблон маршрутизации в RabbitMQ расширяет метод маршрутизации обмена на основе шаблона издатель-подписчик. Тип обмена для шаблона маршрутизации - direct, который также является типовым обменом для RabbitMQ. В предыдущих разделах явно не использовался обмен, но на самом деле использовался базовый обмен - это и есть прямой обмен.

Совет: Если вы не знакомы с правилами шаблона маршрутизации, пожалуйста, прочитайте Шаблоны маршрутизации RabbitMQ.

1. Учебное руководство по подготовке

Пожалуйста, сначала прочтите главу о Шаблоне издатель-подписчик Golang RabbitMQ. По сути, различные режимы работы RabbitMQ реализуются различными типами обмена. Код почти такой же, основное отличие заключается в определении обмена. Поэтому, после понимания шаблона издатель-подписчик, другие шаблоны становятся достаточно простыми.

2. Объявление прямого обмена

err = ch.ExchangeDeclare(
  "tizi365_direct", // Имя обмена, должно быть уникальным
  "direct",         // Тип обмена
  true,             // Живучий (persist), переживает перезапуск сервера
  false,            // Автоудаление (auto-delete), удаляется, если нет очередей, связанных с обменом
  false,            // Внутренний (internal), используется при соединении с другим обменом
  false,            // No-wait
  nil,              // Аргументы
)

3. Отправка сообщений

	// Содержание сообщения
	body := "Привет Tizi365.com!"
	
	// Отправка сообщения
	err = ch.Publish(
		"tizi365_direct",     // Обмен (имя обмена)
		"blog",               // Маршрутный ключ, определяет, в какую очередь будет отправлено сообщение
		false,                // Обязательный
		false,                // Немедленный
		amqp.Publishing {
			ContentType: "text/plain",   // Тип содержимого сообщения, в данном случае, простой текст
			Body:        []byte(body),    // Содержание сообщения
		})

4. Прием сообщений потребителем

4.1. Привязка обмена

// Объявление очереди для операций
q, err := ch.QueueDeclare(
  "",     // Имя очереди, если не указано, будет сгенерировано случайное имя
  false,  // Живучая очередь
  false,  // Удаляется при неиспользовании
  true,   // Эксклюзивная
  false,  // No-wait
  nil,    // Аргументы
)

// Привязка очереди к указанному обмену
err = ch.QueueBind(
  q.Name,             // Имя очереди
  "blog",             // Маршрутный ключ, если он совпадает с параметром маршрутизации, указанным при отправке сообщения, сообщение доставляется в текущую очередь
  "tizi365_direct",   // Имя обмена, которое должно совпадать с обменом, определенным на конце отправителя сообщения
  false,
  nil)

4.2. Потребление сообщений

// Создание потребителя
msgs, err := ch.Consume(
  q.Name, // Ссылка на предыдущее имя очереди
  "",     // Имя потребителя, если не заполнено, будет сгенерировано случайное имя
  true,   // Автоматически подтверждать сообщения, обработанные очередью
  false,  // Эксклюзивная
  false,  // No-local
  false,  // No-wait
  nil,    // Аргументы
)

// Циклическое потребление сообщений из очереди
for d := range msgs {
  log.Printf("Получено сообщение=%s", d.Body)
}