← Назад ко всем вопросам

RabbitMQ: в чем разница между direct exchange и topic exchange?

1️⃣ Как кратко ответить

Direct exchange в RabbitMQ направляет сообщения в очереди, основываясь на точном соответствии ключа маршрутизации. Topic exchange позволяет более гибкую маршрутизацию, используя шаблоны ключей маршрутизации с поддержкой подстановочных знаков, что позволяет направлять сообщения в зависимости от совпадения с определенными шаблонами.

2️⃣ Подробное объяснение темы

RabbitMQ — это система обмена сообщениями, которая позволяет приложениям обмениваться данными и сообщениями. В RabbitMQ используются различные типы обменников (exchanges) для маршрутизации сообщений в очереди. Два из таких типов — это direct exchange и topic exchange.

Direct Exchange

Direct exchange — это тип обменника, который направляет сообщения в очереди, основываясь на точном соответствии ключа маршрутизации (routing key). Когда сообщение отправляется в direct exchange, оно сопровождается ключом маршрутизации. Очереди, которые привязаны к этому обменнику, также имеют свои ключи маршрутизации. Сообщение будет направлено в очередь только в том случае, если ключ маршрутизации сообщения точно совпадает с ключом маршрутизации очереди.

Пример:

  • Обменник: direct exchange
  • Очередь A привязана с ключом "info"
  • Очередь B привязана с ключом "error"

Если сообщение отправляется с ключом "info", оно попадет в очередь A. Сообщение с ключом "error" попадет в очередь B. Сообщение с ключом "warning" не будет направлено ни в одну из очередей, так как нет точного совпадения.

Topic Exchange

Topic exchange позволяет более сложную маршрутизацию, используя шаблоны ключей маршрутизации. В этом случае ключ маршрутизации может содержать подстановочные знаки:

  • * (звездочка) заменяет одно слово.
  • # (решетка) заменяет ноль или более слов.

Пример:

  • Обменник: topic exchange
  • Очередь A привязана с шаблоном "logs.*"
  • Очередь B привязана с шаблоном "logs.#"

Если сообщение отправляется с ключом "logs.info", оно попадет в обе очереди, так как "logs." соответствует "logs.info" (одно слово после "logs"), и "logs.#" также соответствует (ноль или более слов после "logs"). Сообщение с ключом "logs.error.critical" попадет только в очередь B, так как "logs.#" соответствует (два слова после "logs"), а "logs." не соответствует (только одно слово после "logs").

Практическое применение

Direct exchange используется, когда требуется простая маршрутизация с точным соответствием. Это полезно для систем, где сообщения должны быть направлены в строго определенные очереди.

Topic exchange подходит для более сложных сценариев, где требуется гибкость в маршрутизации. Это полезно в системах, где сообщения могут быть классифицированы по нескольким критериям, и требуется направлять их в зависимости от различных условий.

Пример кода

import pika
​
# Устанавливаем соединение с RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
​
# Объявляем direct exchange
channel.exchange_declare(exchange='direct_logs', exchange_type='direct')
​
# Объявляем topic exchange
channel.exchange_declare(exchange='topic_logs', exchange_type='topic')
​
# Отправляем сообщение в direct exchange
channel.basic_publish(exchange='direct_logs', routing_key='info', body='Direct message with info key')
​
# Отправляем сообщение в topic exchange
channel.basic_publish(exchange='topic_logs', routing_key='logs.info', body='Topic message with logs.info key')
​
# Закрываем соединение
connection.close()
  • Устанавливается соединение с RabbitMQ.
  • Объявляются два обменника: direct_logs с типом direct и topic_logs с типом topic.
  • Сообщение отправляется в direct_logs с ключом маршрутизации info.
  • Сообщение отправляется в topic_logs с ключом маршрутизации logs.info.
  • Соединение закрывается.

Тема: Tools / DevOps / Linux
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки