Thank you for reading this post, don't forget to subscribe!
RabbitMQ программный продукт для реализации брокера сообщений на основе протокола AMQP (Advanced Message Queuing Protocol). Простыми словами, программа, которая принимает задания от другой программы или другой части той же программы. Используется для выполнения асинхронных запросов, не заставляя пользователя ждать, пока программа обработает запрос, который можно обработать в фоне.
Установить данный брокер можно локально на все популярные операционные системы — Linux (Debian, Ubuntu, Red Hat, CentOS), Windows, FreeBSD, Solaris, Mac OS. Также RabbitMQ может быть запущен как приложение Docker или в кластере Kubernetes. Скачать программу и получить подробную инструкцию по установке можно на официальном сайте.
Программный брокер сообщений поддерживает большое количество популярных языков программирования, таких как Python, Java, C#, PHP, Golang и так далее. Примеры подключений и сценарии использования можно прочитать на странице RabbitMQ Tutorials официального сайта.
Терминология:
- Того, кто отправляет сообщения брокеру называют продюсером (Producer).
- Тому, кому RabbitMQ отправляет сообщения называют консумером (Consumer).
- Сообщения отправляются в обменник (Exchange). Он распределяет сообщения по нескольким очередям.
Популярные аналоги:
- Kafka
- ActiveMQ
- ZeroMQ
- MQTT
- Redis
- NATS
- Mosquitto
- IBM MQ
Установка
Сервер RabbitMQ есть в стандартном репозитории Ubuntu, поэтому можно сразу выполнить установку с помощью apt. Однако, версия в репозитории может быть не самой актуальной. Поэтому мы рассмотрим процесс с настройкой официального репозитория для установки RabbitMQ.
Для начала установим curl:
apt install curl
После выполныем две команды:
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.deb.sh | sudo bash
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.deb.sh | sudo bash
В нашу систему будут добавлены репозитории для установки RabbitMQ и erlang.
Теперь можно устанавливать брокер:
apt install rabbitmq-server
Однако, в моем случае возникла проблема с репозиторием erlang. Если вы столкнетесь с той же проблемой, можно вручную установить необходимые пакеты или отказаться от использования официального репозитория.
После установки брокера на Ubuntu, он автоматически будет запущен и настроен для автозапуска. Проверить можно командой:
systemctl status rabbitmq-server
Переходим к настройке.
Первичная настройка
Нам нужно создать виртуальный хост для изоляции рабочего пространства, а также пользователя, которому дадим полный доступ на созданный виртуальный хост.
Создание последнего выполняется командой:
rabbitmqctl add_vhost test_host
* в данном примере мы создадим тестовый хост test_host.
Список всех хостов можно увидеть командой:
rabbitmqctl list_vhosts
Создаем пользователя:
rabbitmqctl add_user test_user
Система запросит ввод пароля. Придумываем и вводим его.
Поменять пароль мы можем командой:
rabbitmqctl change_password test_user
* в данном примере мы поменяем пароль для пользователя test_user.
Теперь дадим права созданному пользователю к созданному виртуальному хосту:
rabbitmqctl set_permissions -p test_host test_user ".*" ".*" ".*"
Сделаем нашего пользователя администратором:
rabbitmqctl set_user_tags test_user administrator
Разрешаем консольную команду rabbitmqadmin:
rabbitmq-plugins enable rabbitmq_management
Выполним тестовый запрос
rabbitmqadmin -u test_user -p test list vhosts
Мы должны увидеть что-то на подобие:
+-------------+----------+
| name | messages |
+-------------+----------+
| / | |
| test_host | |
+-------------+----------+
Использование по сети
По умолчанию, сервис запускается для работы как на локальном сервере, так и обработки запросов по сети. Но нам нужно убедиться в работоспособности прохождения сетевых запросов.
Если на нашем сервере используется брандмауэр, разрешаем порт 5672:
iptables -I INPUT -p tcp --dport 5672 -j ACCEPT
Для сохранения правила используем утилиту iptables-persistent:
apt-get install iptables-persistent
netfilter-persistent save
Пример подключения с использованием Python
Для простоты, мы запустим скрипт для отправки сообщения в очередь и приемки на одном и том же компьютере, куда установили сервер rabbitmq. Сам пример, в большей степени, взят с официального сайта.
Установим питон и необходимые компоненты:
apt install python3 python3-pip
Обновляем менеджер пакетов pip:
pip3 install --upgrade pip
Устанавливаем библиотеку pika для работы с RabbitMQ:
pip3 install pika
Создадим каталог, в котором мы создадим скрипты:
mkdir /scripts
Создадим скрипт для отправки информации в очередь:
vi /scripts/rabbit_test_send.py
Пример скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/usr/bin/env python3 # -*- encoding: utf-8 -*- import pika credentials = pika.PlainCredentials('test_user', 'test') parameters = pika.ConnectionParameters('localhost', 5672, 'test_host', credentials) connection = pika.BlockingConnection(parameters) channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') connection.close() print("Your message has been sent to the queue.") |
* где:
- строки 6-8: задаем параметры для подключения к нашему серверу сообщений. Обратите внимание, что мы используем логин и пароль для созданного ранее пользователя test_user. Также мы подключаемся к созданному хосту test_host.
- строки 10-12: подключаемся к серверу, создаем очередь с названием hello и отправляем в очередь сообщение Hello World!
Разрешаем запуск скрипта:
chmod +x /scripts/rabbit_test_send.py
И запустим его:
/scripts/rabbit_test_send.py
Теперь мы можем посмотреть состояние очереди из командной строки Linux.
rabbitmqadmin -u test_user -p test list queues
Мы увидим, примерно, такую картину:
+-------+----------+
| name | messages |
+-------+----------+
| hello | 1 |
+-------+----------+
* обратите внимание, что сообщение в очередь могут попадать с задержкой (2-3 секунды). Если мы увидим 0 сообщений, немного подождем.
Теперь создадим скрипт для получения сообщения:
vi /scripts/rabbit_test_recieve.py
С содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/usr/bin/env python3 # -*- encoding: utf-8 -*- import pika credentials = pika.PlainCredentials('test_user', 'test') parameters = pika.ConnectionParameters('localhost', 5672, 'test_host', credentials) connection = pika.BlockingConnection(parameters) channel = connection.channel() channel.queue_declare(queue='hello') def callback(ch, method, properties, body): print("Received %r" % body) channel.basic_consume(queue='hello', auto_ack=True, on_message_callback=callback) channel.start_consuming() print('To exit press CTRL+C') connection.close() |
* где:
- строки 6-8: задаем параметры для подключения к нашему серверу сообщений. Обратите внимание, что мы используем логин и пароль для созданного ранее пользователя test_user. Также мы подключаемся к созданному хосту test_host.
- строки 10-11: подключаемся к серверу, подключаемся к очереди с названием hello.
- строки 13-14: функция для отображения содержимого очереди.
- строка 16: параметры чтения очереди. Обратите внимание, что мы передаем данные очереди в нашу функцию callback, которую определили в строке 13,
- строка 18: запускаем процесс чтения данных в очереди.
Разрешаем запуск скрипта:
chmod +x /scripts/rabbit_test_recieve.py
И запустим его:
/scripts/rabbit_test_recieve.py
На экране должно появиться наше сообщение. Чтобы прервать выполнение скрипта, нажимаем CTRL+C (на экране появится некрасивый вывод, но это не страшно в рамках нашего теста).
Снова смотрим очередь:
rabbitmqadmin -u test_user -p test list queues
Она должна стать пустой.