Перейти к основному содержимому

Обмены, очереди и привязки в RabbitMQ

· 3 мин. чтения

1. Обзор

Чтобы лучше понять, как работает RabbitMQ, нам нужно погрузиться в его основные компоненты.

В этой статье мы рассмотрим обмены, очереди и привязки, а также то, как мы можем объявить их программно в приложении Java.

2. Настройка

Как обычно, мы будем использовать клиент Java и официальный клиент для сервера RabbitMQ.

Во-первых, давайте добавим зависимость Maven для клиента RabbitMQ :

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.12.0</version>
</dependency>

Далее объявим подключение к серверу RabbitMQ и откроем канал связи:

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

Также более подробный пример настройки можно найти в нашем Introduction to RabbitMQ .

3. Биржи

В RabbitMQ производитель никогда не отправляет сообщение напрямую в очередь . Вместо этого он использует биржу в качестве посредника маршрутизации.

Таким образом, биржа решает, будет ли сообщение отправлено в одну очередь, в несколько очередей или просто отброшено.

Например, в зависимости от стратегии маршрутизации у нас есть четыре типа обмена на выбор :

  • Прямой — биржа пересылает сообщение в очередь на основе ключа маршрутизации.
  • Разветвление — биржа игнорирует ключ маршрутизации и пересылает сообщение во все ограниченные очереди.
  • Тема — обмен направляет сообщение в ограниченные очереди, используя соответствие между шаблоном, определенным на обмене, и ключами маршрутизации, прикрепленными к очередям.
  • Заголовки — в этом случае атрибуты заголовка сообщения используются вместо ключа маршрутизации для привязки обмена к одной или нескольким очередям.

Более того, нам также необходимо объявить свойства биржи :

  • Имя — название биржи
  • Долговечность — если включено, брокер не удалит биржу в случае перезапуска.
  • Автоудаление — при включении этой опции брокер удаляет биржу, если она не привязана к очереди.
  • Необязательные аргументы

Учитывая все обстоятельства, давайте объявим необязательные аргументы для обмена:

Map<String, Object> exchangeArguments = new HashMap<>();
exchangeArguments.put("alternate-exchange", "orders-alternate-exchange");

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

Далее объявим прямой обмен с включенной устойчивостью и отключенным автоудалением :

channel.exchangeDeclare("orders-direct-exchange", BuiltinExchangeType.DIRECT, true, false, exchangeArguments);

4. Очереди

Подобно другим брокерам обмена сообщениями, очереди RabbitMQ доставляют сообщения потребителям на основе модели FIFO .

Кроме того, при создании очереди мы можем определить несколько свойств очереди :

  • Имя – имя очереди. Если не определено, брокер создаст один
  • Долговечность — если включено, брокер не будет удалять очередь в случае перезапуска.
  • Exclusive — если включено, очередь будет использоваться только одним соединением и будет удалена при закрытии соединения.
  • Автоматическое удаление — если включено, брокер удаляет очередь, когда последний потребитель отписывается.
  • Необязательные аргументы

Далее мы объявим необязательные аргументы для очереди.

Добавим два аргумента, TTL сообщения и максимальное количество приоритетов:

Map<String, Object> queueArguments = new HashMap<>();
queueArguments.put("x-message-ttl", 60000);
queueArguments.put("x-max-priority", 10);

Теперь давайте объявим устойчивую очередь с отключенными свойствами монопольного доступа и автоматического удаления :

channel.queueDeclare("orders-queue", true, false, false, queueArguments);

5. Привязки

Обмены используют привязки для маршрутизации сообщений в определенные очереди.

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

Наконец, давайте привяжем созданную нами очередь к бирже с помощью ключа маршрутизации :

channel.queueBind("orders-queue", "orders-direct-exchange", "orders-routing-key");

6. Заключение

В этой статье мы рассмотрели основные компоненты RabbitMQ — обмены, темы и привязки. Мы также узнали об их роли в доставке сообщений и о том, как мы можем управлять ими из приложения Java.

Как всегда, полный исходный код этого руководства доступен на GitHub .