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 .