RabbitMQ - это система очереди сообщений. Очередь сообщений в свою очередь предоставляет способ асинхронного взаимодействия между различными компонентами системы. RabbitMQ реализована на протоколе AMQP.
AMQP - это открытый протокол, который определяет, как система должна обмениваться сообщениями. Он устанавливает правила, которыми должны следовать системы, которые собираются взаимодействовать друг с другом. В дополнении к описанию способа взаимодействия между системами и брокером, он также стандартизирует команды и сообщения, которыми обмениваются системы. Так как AMQP написано на открытом коде, его сообщество довольно большое и на нём реаливаны брокеры и клиентские части на многих языках программирования.
Ниже я приведу концепции AMQP:
- Брокер сообщений - это часть приложения, которое получает сообщений от одного приложеня и доставляет другому.
- Виртуальный хост - это часть брокера. Является способом разделения приложений, которые используют один RabbitMQ. Например, вы можете разделить по виртуальным хостам dev и staging окружение, чтобы они были изолированными друг от друга. Пользователи, обмен сообщениями, очереди - всё это изолировано на виртуальном хосте. Пользователь, подсоединённый к определённому хосту, не может видеть данные в другом хосте.
- Соединение - это физическое соединение по протоколу TCP между приложениями и брокером. Когда клиент отсоединяется или система вылетает с ошибкой, соединение закрывается.
- Канал - это виртуальное соединение внутри соединения. Он переиспользует существующее соединение, чтобы сэкономить на ресурсах и не заствлять системы устанавливать новое соединение. Когда происходит публикация или запрос нового сообщения, весь процесс происходит внутри существующего соединения.
- Обмен - это применение таких правил к сообщеням, по которым они достигают места назначения. Другими словами, процесс обмена удостоверяется, что полученное сообщение приходит в конкретную очередь. В какую очередь попадает сообщение зависит от правил, определённых для этого типа сообщений. Очередь должна быть привязана как минимум к одному обмену, чтобы получать сообщения.
- Очередь - это упорядоченный список сообщений. Очередь существует внутри брокера.
- Связь - это виртуальное соединение между обменом и очередью внутри брокера. Она позволяет сообщениям перетекать из обмена в очередь.
RabbitMQ - это реализация AMQP на языке Erlang. Этот язык был выбран не случайно, он позволяет создавать распределённые и устойчивые приложения. Приложение может запускаться на любых операционных системах. Но в этой статье мы будем устанавливать RabbitMQ на Ubuntu.
В качестве хранения данных RabbitMQ использует Mnesia - это база данных, которая производит обработку данных как в памяти, так и на диске, тоже написана на Erlang. Mnesia хранит информацию о пользователях, обмене, очередят, связях и т.д. Индекс очереди хранит положение сообщения и информацию о том, было ли оно доставлено или нет.
Сценарии использования RabbitMQ
Очереди сообщений часто используются в микросервисной архитектуре. Но что это означает?
Микросервисная архитектура разделяет приложение на мелкие сервисы и само приложение является суммой всех микросервисов. Сервисы не соединены друг с другом напряму. Вместо этого они используют очередь сообщений. Один сервис в асинхронном режиме отправляет сообщение в очередь, а другой его получает.
Другой пример использования RabbitMQ - это события и задачи.
События, задачи, уведомления говорят приложению, что что-то произошло. Одно приложение может подписаться на события от другого и делать необходимые операции.
Например, представьте обычную социальную сеть. Если один пользователь публикует пост, то его друзья, у которых включено уведомление, должны увидеть этот пост в своей ленте. Эта операция является довольно ресурсоёмкой, поэтому имеет смысл событие о публикации поста вынести в очередь. И затем обработать его в асинхронном режиме, распределив пост между друзьями пользователя.
Установка RabbitMQ.
Для начала работы, вам понадобится пройти три этапа:
- Установить брокер
- Установить плагин управления брокером
- Настроить хост и пользователя.
Установка брокера.
Процесс установки довольно простой:
- Обновить Ubuntu.
- Скачать и установить ключ репозитория.
- Проверить ключ в репозитории.
- Установить RabbitMQ.
Итак, давайте для начала обновим систему. Запустим по очереди две команды:
sudo apt-get update
sudo apt-get dist-upgrade
RabbitMQ требует несколько пакетов. Проверьте, что все они установлены:
sudo apt install curl, gnupg -y
sudo apt install apt-reansport-https
Опция -y принимает лицензионное соглашение и устанавливает дополнительные зависимости.
Проверьте название операционной системы, запустив любую из следующих команд:
cat /etc/os-release
lsb_release -a
hostnamectl
Теперь давайте добавим ключ:
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor > /usr/share/keyrings/com.rabbitmq.team.gpg
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
deb [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.E495BB49CC4BBE5B.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main
deb-src [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.E495BB49CC4BBE5B.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main
deb [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.9F4587F226208342.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main
deb-src [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.9F4587F226208342.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main
EOF
sudo apt-get update -y
Не забываем, что RabbitMQ написан на Erlang, поэтому нам понадобится установить дополнительные зависимости:
sudo apt-get install -y erlang-base \
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
erlang-runtime-tools erlang-snmp erlang-ssl \
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
Теперь пакет готов к установки, можно приступать:
sudo apt install -y rabbitmq-server
sudo apt install librabbitmq-dev
Последний пакет включает в себя клиента для взаимодействия с брокером.
После установки запустить rabbitMQ можно следующим образом:
rabbitmq-server start
Сервер будет запущен в фоне. Чтобы запустить брокер как сервис, используйте следующие команды:
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
sudo systemctl status rabbitmq-server
Команда systemctl может также использоваться для управления сервисами в операционной системе.
Проверить статус rabbitMQ можно следующей командой:
sudo service rabbitmq-server status
Теперь пришла очередь установки плагина управления RabbitMQ. Он нужен, чтобы у нас был визуальный интерфейс управления очередями.
Пакет во время установки устанавливает несколько скриптов. Один из них - rabbitmq-plugins. Его задача - установки и удаление дополнительных плагинов. Используйте его, чтобы установить панель управления:
sudo rabbitmq-plugins enable rabbitmq_management
Да, это очень просто!
Теперь вы можете открыть браузер и зайти в панель управления по адресу:
http://127.0.0.1:15672
При открытии страницы у вас запросят логин и пароль. Но пользователей мы не создавали. Давайте сделаем это. Для этого используем команду rabbitmqctl:
sudo rabbitmqctl add_user cc-admin admin123
sudo rabbitmqctl set_user_tags cc-admin administrator
По умолчанию вам доступен гость с паролем по умолчанию. Для безопасности измените его пароль:
sudo rabbitmqctl change_password guest guest123
Теперь вы можете зайти в панель управления по логину cc-admin и паролю admin123
Но мы создали только администратора, у него нет возможности мониторить обмен или очередь или управлять виртуальными хостами. Для процесса разработки нужно создать пользователя с правами разработки.
sudo rabbitmqctl add_user cc-dev dev123
Как обсуждалось ранее, RabbitMQ всё складывает в своеобразные папки, которые изолированы друг от друга. Они называются виртуальными хостами. Нам нужно создать первый виртуальный хост, в котором и будут храниться наши очереди:
sudo rabbitmqctl add_vhost cc-dev-vhost
Эта команда создаст виртуальный хост для разработки.
Теперь нам нужно привязать пользователей к нашему хосту:
sudo rabbitmqctl set_permissions -p cc-dev-vhost cc-dev ".*" ".*" ".*"
Эта команда даёт полные права на запись, чтение и изменение.
Теперь можно сказать, что RabbitMQ брокер и панель управления успешно установлены, можно приступать к работе!