Введение в RabbitMQ

Введение в RabbitMQ

1. обзор

Разделение компонентов программного обеспечения является одной из наиболее важных частей разработки программного обеспечения. Одним из способов достижения этого является использование систем обмена сообщениями, которые обеспечивают асинхронный способ связи между компонентами (службами). В этой статье мы рассмотрим одну из таких систем: RabbitMQ.

RabbitMQ - это брокер сообщений, который реализует протокол расширенной очереди сообщений (AMQP). Он предоставляет клиентские библиотеки для основных языков программирования.

Помимо использования для развязки программных компонентов RabbitMQ может использоваться для:

  • Выполнение фоновых операций

  • Выполнение асинхронной операции

2. Модель обмена сообщениями

Во-первых, давайте кратко рассмотрим, как работает обмен сообщениями.

Проще говоря, есть два вида приложений, взаимодействующих с системой обмена сообщениями: производители и потребители. Производители - это те, кто отправляет (публикует) сообщения брокеру, и потребители, которые получают сообщения от брокера. Обычно эти программы (программные компоненты) работают на разных машинах, а RabbitMQ выступает в качестве связующего программного обеспечения между ними.

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

3. Настроить

Для начала запустим RabbitMQ, используя официальное руководство по установкеhere.

Естественно, мы будем использовать клиент Java для взаимодействия с сервером RabbitMQ; Maven dependency для этого клиента:


    com.rabbitmq
    amqp-client
    4.0.0

После запуска брокера RabbitMQ с использованием официального руководства нам необходимо подключиться к нему с помощью Java-клиента:

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

Мы используемConnectionFactory для установки соединения с сервером, он также заботится о протоколе (AMQP) и аутентификации. Здесь мы подключаемся к серверу наlocalhost, мы можем изменить имя хоста с помощью функцииsetHost.

Мы можем использоватьsetPort для установки порта, если порт по умолчанию не используется RabbitMQ Server; порт по умолчанию для RabbitMQ -15672:

factory.setPort(15678);

Мы можем установить имя пользователя и пароль:

factory.setUsername("user1");
factory.setPassword("MyPassword");

Далее, мы будем использовать это соединение для публикации и использования сообщений.

4. Режиссер

Consider a simple scenario, где веб-приложение позволяет пользователям добавлять новые продукты на веб-сайт. Каждый раз, когда добавляется новый продукт, нам нужно отправить электронное письмо клиентам.

Сначала давайте определим очередь:

channel.queueDeclare("products_queue", false, false, false, null);

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

String message = "product details";
channel.basicPublish("", "products_queue", null, message.getBytes());

Наконец, мы закрываем канал и соединение:

channel.close();
connection.close();

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

5. потребитель

Давайте посмотрим, что мы можем реализовать на стороне потребителя. мы собираемся объявить ту же очередь:

channel.queueDeclare("products_queue", false, false, false, null);

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

Consumer consumer = new DefaultConsumer(channel) {
    @Override
     public void handleDelivery(
        String consumerTag,
        Envelope envelope,
        AMQP.BasicProperties properties,
        byte[] body) throws IOException {

            String message = new String(body, "UTF-8");
            // process the message
     }
};
channel.basicConsume("products_queue", true, consumer);

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

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

Полную реализацию этого руководства можно найти вthe GitHub project.