RabbitMQ на Ubuntu

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 офи­ци­аль­но­го сайта.

Тер­ми­но­ло­гия:

  1. Того, кто отправ­ля­ет сооб­ще­ния бро­ке­ру назы­ва­ют про­дю­се­ром (Producer).
  2. Тому, кому RabbitMQ отправ­ля­ет сооб­ще­ния назы­ва­ют кон­су­ме­ром (Consumer).
  3. Сооб­ще­ния отправ­ля­ют­ся в обмен­ник (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

При­мер скрипта:

* где:

  • стро­ки 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

С содер­жи­мым:

* где:

  • стро­ки 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

Она долж­на стать пустой.