Маршрутизация шаблона в 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)
}