КРАТКОЕ ВВЕДЕНИЕ В RABBITMQ
RabbitMQ — это полноценная и щедро удобренная фичами очередь сообщений. В отличие от ZeroMQ, который встраивается в приложения, RabbitMQ — сервис-посредник. Он разграничивает права доступа, поддерживает шифрование, сохранение сообщений на диск (чтобы пережить плановое отключение электричества), работу в кластерах и даже дублирование сервисов для повышенной живучести. К тому же он написан на Erlang, за что автоматически становится неубиваемым и поддерживаемым на большинстве популярных ОС.
В этом посте мы посмотрим, насколько тяжело отправлять и получать сообщения с RabbitMQ, да и вообще, на что он похож вблизи. В качестве платформы будет Убунта (запертая внутри Docker контейнера), но сгодился бы и Mac, и Windows.
Установка
Я не буду фокусироваться на установке слишком сильно, тем более что официльная документация весьма ничего, но самый простой способ получить работающий RabbitMQ на своей машине — через Docker и rabbitmq образ.
RabbitMQ, Брокеры сообщений
$ docker run — ti rabbitmq bash
Внутри получившегося контейнера будет полностью рабочий сервер сообщений, который нужно просто запустить:
$ service rabbitmq — server start
#[ ok ] Starting message broker: rabbitmq-server.
Если с Докером у вас не сложилось, то на настоящей машине установить RabbitMQ тоже не проблема. Вот на что это похоже на Убунте:
echo ‘deb http://www.rabbitmq.com/debian/ testing main’ | sudo tee / etc / apt / sources .list .d / rabbitmq .list
wget — O — https : //www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add —
sudo apt — get update
sudo apt — get install rabbitmq — server
На других системах, возможно, будет даже легче, но я всё равно очень рекомендую потратить немного времени и разобраться с Docker, потому что он идеально подходит для изучения таких вот вещей. Просто берем образ с уже установленным RabbitMQ, Redis, Elasticsearch, Jenkins — да вообще с чем угодно, играемся вволю, а потом удаляем контейнер целиком.
Отправка и получение сообщений с rabbitmqadmin
Отправить и получить сообщение можно не написав ни строчки кода. В комплект с RabbitMQ идёт management plugin, в котором есть милая python-утилитка — rabbitmqadmin . С ней можно создавать и удалять очереди сообщений, проверять их статус, а так же отправлять, собственно, сами сообщения. Management plugin выключен по умолчанию, так что его придётся сначала включить. Правда, можно было бы просто взять rabbitmq:management образ, где это уже сделано, но мы бы сэкономили всего одну команду.
Включаем rabbitmqadmin
$ rabbitmq — plugins enable rabbitmq_management
#The following plugins have been enabled:
# webmachine
# rabbitmq_web_dispatch
# amqp_client
# rabbitmq_management_agent
# rabbitmq_management
Брокер сообщений RabbitMQ | Tutorial для начинающих на русском | Урок 1 | Введение
..и всё. rabbitmqadmin расположен в удивительной глубины и непроизносимости папке, так что его сразу стоит добавить либо в PATH переменную, либо сразу в /usr/local/bin/.
find / var / lib / rabbitmq — name rabbitmqadmin | xargs — I < >sudo ln — s < >/ usr / local / bin / rabbitmqadmin
sudo chmod + x / usr / local / bin / rabbitmqadmin
Теперь попробуем что-нибудь создать.
Играем с очередями и сообщениями
RabbitMQ — сервис-посредник, который создаёт и управляет очередями сообщений. В архитектуре распределенного приложения он будет где-то посередине:
Во-первых, давайте посмотрим, какие очереди в нём есть по-умолчанию:
$ rabbitmqadmin list queues
Никаких. Но это вполне себе поправимо:
$ rabbitmqadmin declare queue name = demoqueue durable = false
#queue declared
$ rabbitmqadmin list queues
| name | messages |
| demoqueue | 0 |
Теперь у нас есть новая очередь с названием «demoqueue». Так как она держит сообщения в памяти ( durable = false ), то падение сервиса похоронит под собой все сообщения, которые он не успел отправить. Если это проблема, то можно сделать durable = true .
Кстати о сообщениях — отправим-ка чего:
$ rabbitmqadmin publish exchange = amq .default routing_key = demoqueue
payload = «Behold! This is the message»
# Message published
$ rabbitmqadmin list queues
| name | messages |
| demoqueue | 1 |
Команда отправки сообщения не содержит ни одного слова, хоть отдалённо напоминающего «отправка» и «сообщение», так что стоит чуть-чуть углубиться в терминологию.
Кто такой AMQP
В мире очередей сообщений есть попытка прийти к общему стандарту, и эта попытка сегодня называется AMQP (Advanced Message Queuing Protocol). По этому стандарту между отправителем сообщения и очередью должен быть еще один игрок — exchange. Отправитель кладёт сообщение в exchange, а уже exchange в зависимости от своего типа и того, какие очереди к нему привязаны, решает, куда оно отправится.
Например, в AMQP есть exchange типа «fanout», который отправляет копии сообщения сразу всем «своим» очередям.
Другой тип exchange — «direct» — отправляет сообщение только одной очереди. Какой именно — определяет маршрутный ключ (routing key), подорожником прикладываемый к сообщению.
Наконец, чтобы полностью соответствовать протоколу AMQP , у брокера должны быть несколько exchange по-умолчанию. Один из них — amq.default — должен иметь тип ‘direct’. Как только создаётся новая очередь, она автоматически к нему привязывается, и routing key будет совпадать с её именем.
Так как RabbitMQ поддерживает AMQP полностью, то в нём есть и exchange, и amq.default, так что отправка сообщения такой странной командой теперь выглядит чуть-чуть более логичной:
Источник: sidmid.ru
RabbitMQ. Часть 1. Introduction. Erlang, AMQP
Добрый день, Хабр! Хочу поделиться учебником-справочником знаний, которые мне удалось собрать по RabbitMQ и сжать в короткие рекомендации и выводы.
Оглавление
- RabbitMQ. Часть 1. Introduction. Erlang, AMQP и RPC
- RabbitMQ. Часть 2. Разбираемся с Exchanges
- RabbitMQ. Часть 3. Разбираемся с Queues и Bindings
- RabbitMQ. Часть 4. Разбираемся с тем, что-такое сообщения и фреймы
- RabbitMQ. Часть 5. Производительность публикации и потребления сообщений
- RabbitMQ. Часть 6. Обзор модулей Federation и Shovel
- RabbitMQ. Часть 7. Подробно про Connection и Chanel
- RabbitMQ. Часть 8. RabbitMQ в .NET
- RabbitMQ. Часть 9. Мониторинг
Кратко про AMQP
AMQP (Advanced Message Queuing Protocol) — открытый протокол для передачи сообщений между компонентами системы. Основная идея состоит в том, что отдельные подсистемы (или независимые приложения) могут обмениваться произвольным образом сообщениями через AMQP-брокер, который осуществляет маршрутизацию, возможно гарантирует доставку, распределение потоков данных, подписку на нужные типы сообщений.
Протокол AMQP вводит три понятия:
- exchange (точка обмена или обмен) — в неё отправляются сообщения. Точка обмена распределяет сообщение в одну или несколько очередей. Она маршрутизирует сообщения в очередь на основе созданных связей ( binding ) между ним и очередью
- queue (очередь) — структура данных на диске или в оперативной памяти, которая хранит ссылки на сообщения и отдает копии сообщений comsumers (потребителям)
- binding (привязка) — правило, которое сообщает точке обмена в какую из очередей эти сообщения должны попадать
Протокол работает поверх TCP/IP.
Кратко про Erlang
Исходный код проекта находится в репозитории на GitHub. Архитектура RabbitMQ-server основана на Erlang и BEAM.
Erlang разработан компанией Ericsson в середине 1980-x как распределенная, отказоустойчивая, система реального времени для приложений, требующих безотказной работы 99,999%. Erlang применяется в различных отраслях и современных приложениям, например в WhatsApp . Подробнее можно прочитать в статье архитектура WhatsApp, которую Facebook купил за $19 миллиардов
Кратко про RabbitMQ
RabbitMQ – это брокер сообщений с открытым исходным кодом. Он маршрутизирует собщения по всем базовым принципам протокола AMQP описанным в спецификации. RabbitMQ реализует и дополняет протокол AMQP .
Основная идея модели обмена сообщениями в RabbitMQ заключается в том, что producer (издатель) не отправляет сообщения непосредственно в очередь. На самом деле и довольно часто издатель даже не знает, будет ли сообщение вообще доставлено в какую-либо очередь.
Вместо этого издатель может отправлять сообщения только на обмен. С одной стороны, обмен получает сообщения от издателей, а с другой — отправляет их в очереди. Обмен должен точно знать, что делать с полученным сообщением. Должно ли оно быть добавлено в определенную очередь? Должно ли оно быть добавлено в несколько очередей?
Или сообщение нужно игнорировать.
Кратко работу RabbitMQ можно описать следующим образом:
- Издатель отправляет сообщение определенному обмену
- Обмен, получив сообщение, маршрутизирует его в одну или несколько очередей в соответствии с правилами привязки между ним и очередью
- Очередь хранит ссылку на это сообщение. Само сообщение хранится в оперативной памяти или на диске
- Как только потребитель готов получить сообщение из очереди, сервер создает копию сообщения по ссылке и отправляет
- Потребитель получает сообщение и отправляет брокеру подтверждение
- Брокер, получив подтверждение, удаляет копию сообщения из очереди. Затем удаляет из оперативной памяти и с диска
RPC
Процесс RPC (remote procedure call) лежит в основе практически всех взаимодействий с ядром RabbitMQ . Например, начальные обсуждения условий клиента с RabbitMQ , демонстрирует определённый процесс RPC . Как только эта последовательность завершится, RabbitMQ будет готов принимать запросы от клиента:
Также в спецификации AMQP и клиент и сервер могут вызывать команды. Это означает, что клиент ожидает взаимодействие с сервером. Команды — это классы и методы. Например, Connection.Start – вызов метода Start класса Connection .
Подключение и каналы
Для такого обмена информацией между клиентом и сервером используются каналы. Каналы создаются в рамках определенного подключения. Каждый канал изолирован от других каналов. В синхронном случае не возможно выполнять следующую команду, пока не получен ответ.
Для того чтобы иметь возможность отправлять команды параллельно приходится открывать несколько каналов. Каждый канал создает отдельный Erlang процесс. Одно подключение может иметь множество каналов (multiplexing). Для каждого канала существуют некие структуры и объекты в памяти. Поэтому чем больше каналов имеется в рамках соединения, тем больше памяти использует RabbitMQ для управления таким соединением.
Простой пример создания подключения и канала при помощи RabbitMQ.Client:
Открывать новое соединение для каждой операции, настоятельно не рекомендуется, поскольку это приведет к большим затратам. Каналы также должны быть постоянными, но многие ошибки протокола приводят к закрытию канала, поэтому срок службы канала может быть короче, чем у соединения.
Где используется RabbitMQ?
В контексте микросервисов протокол AMQP и его реализацию в RabbitMQ часто используют для асинхронного взаимодействия между сервисами.
В контексте IIOT протокол AMQP и его реализацию в RabbitMQ используют для обмена данными между серверами (сервер-сервер). Также используют плагин MQTT Plugin RabbitMQ являющегося реализацией протокола MQTT для передачи данных между датчиком и сервером в низкоскоростных средах с высокой задержкой (полный перечень поддерживаемых протоколов перечислен на сайте проекта).
В следующей статье начнем разбираться подробнее с Exchanges.
Ссылки
- Сайт проекта RabbitMQ
Источник: temofeev.ru
RabbitMQ и Apache Kafka: что выбрать и можно ли интегрировать
RabbitMQ часто сравнивают с другим популярным брокером сообщений — Apache Kafka. Оба инструмента используются для обмена данными между приложениями, но реализуют принципиально разные модели доставки. RabbitMQ — push, когда сообщения отправляются получателям, а Kafka — pull, получатели сами достают сообщения из топика.
В статье обсудим особенности каждого брокера, чтобы понять, под какие задачи лучше использовать RabbitMQ, а под какие — Kafka. Отдельно разберём, можно ли интегрировать эти системы управления очередями.
Принципы работы и сфера применения RabbitMQ
RabbitMQ — распределённый горизонтально масштабируемый брокер сообщений. Он передаёт сообщения между поставщиками и подписчиками через очереди.
- RabbitMQ принимает сообщения от поставщиков, отправляет подтверждение о приёме и перенаправляет сообщение получателям.
- Получатели подтверждают, что сообщение доставлено, или сигнализируют о неудачной доставке. Во втором случае сообщение остаётся в очереди до тех пор, пока не будет доставлено.
- После доставки сообщение удаляется из системы.
Где может применяться: системы бронирования билетов, логистические программы.
Принципы работы и сфера применения Apache Kafka
- Kafka собирает у приложений данные и распределяет их по топикам в своём хранилище.
- Информацию из топиков читают другие программы и микросервисы.
- В отличие от RabbitMQ, Kafka не отслеживает, получил ли подписчик сообщение, платформа просто хранит его в течение установленного промежутка времени. При этом она гарантирует, что сообщения находятся в той же последовательности, в которой поступили.
- Подписчики сами отправляют Kafka запросы о новых сообщениях и указывают, что им нужно прочитать.
Где может применяться: системы аналитики, финансовые системы, социальные сети, онлайн-игры.
RabbitMQ или Kafka — что выбрать?
Выбор брокера сообщений, зависит от требований вашего проекта и конкретных задач. Разберём функциональные особенности RabbitMQ и Kafka, которые помогут принять решение.
Обработка сообщений
В отличие от большинства систем, очередь сообщений в Kafka является постоянной. Отправленные данные хранятся до тех пор, пока не истечет указанные период. Сообщения не удаляются после получения, их можно перечитывать.
В RabbitMQ сообщение хранится до тех пор, пока принимающее приложение не получит его из очереди. Как только подписчик отмечает, что сообщение получено, оно удаляется.
Протокол
RabbitMQ поддерживает несколько стандартизированных протоколов: AMQP, MQTT, STOMP и др. Это позволяет заменить его на любой брокер на основе AMQP.
Kafka использует пользовательский протокол поверх TCP/IP для связи между приложениями и кластером. Вы не сможете так просто удалить или заменить эту платформу, потому что она единственная реализует данный протокол.
Работа с очередями
Очереди RabbitMQ работают быстрее всего, когда пусты. Kafka хранит большие объемы данных с минимальными издержками, поэтому подходит для передачи большого количества сообщений.
RabbitMQ поддерживает постановку сообщений в очередь через AMQP, например, для реализации рабочей очереди, которая доставляет сообщения циклически конкурирующим получателям. Kafka фокусируется на потоковой передаче событий и доставляет сообщения на основе порядка сообщений в разделе.
Потоковая передача данных
Kafka предлагает широкий набор инструментов для потоковой передачи данных. К ним относятся упорядоченная параллельная доставка сообщений, хранилище сообщений, а также возможности для обработки событий и создания потоковых конвейеров. В RabbitMQ отсутствуют свойства упорядоченной параллельной доставки сообщений.
Масштабирование
Kafka подходит для горизонтального масштабирования путём добавления большего количества машин. RabbitMQ в основном предназначается для вертикального масштабирования путём увеличения мощности.
Маршрутизация
Главное преимущество RabbitMQ — гибкая маршрутизация. Сообщения маршрутизируются через обменник (exchange) перед попаданием в очереди. RabbitMQ предлагает несколько видов маршрутизации сообщений на стороне сервера (т.е. на стороне брокера) с помощью ключей, описанных в протоколе AMQP.
У Kafka упрощённый подход к маршрутизации. Возможности, аналогичные RabbitMQ, она предоставляет через Kafka Connect и Kafka Streams. Эти компоненты выполняются на отдельном уровне и не являются функциями по умолчанию.
Что есть у RabbitMQ и чего нет у Kafka
Масштабирование и поддержание порядка сообщений возможно с помощью каждого из брокеров сообщений. При этом у RabbitMQ есть одна интересная особенность, которой нет у Kafka: он позволяет подписчикам создавать произвольные группы событий.
Разберём на примере: разные приложения не могут совместно использовать очередь, потому что тогда они будут конкурировать за получение сообщений. Каждому из них нужна собственная очередь, которую они смогут настраивать так, как считают нужным. Это позволяет приложениям поддерживать порядок связанных событий.
Промежуточные итоги
Apache Kafka подходит для потоковой передачи данных без сложной маршрутизации, но с максимальной пропускной способностью. Систему выбирают, когда важны масштабируемость и доставка сообщений в правильном порядке. Например, когда вы отслеживаете активность пользователей в интернет-магазине, чтобы генерировать для них оптимальные списки товаров, рекомендуемых к покупке.
- хранения, чтения и повторного чтения потоковых данных;
- обработки и анализа данных в режиме реального времени.
- длительных задач;
- высокопроизводительных фоновых заданий;
- интеграции между приложениями и внутри них.
Можно ли использовать RabbitMQ и Kafka вместе
Хотя и RabbitMQ, и Kafka являются брокерами сообщений и решают схожие задачи, сегодня всё чаще встречаются команды, которые используют их на проектах параллельно. Дело в том, что у каждой технологии свои сильные стороны. У Kafka это масштабируемость, потоковая передача данных и возможность интеграции с другими технологиями. У RabbitMQ — гибкая маршрутизация.
Также параллельное использование RabbitMQ и Kafka уместно, если вы планируете перейти с одного брокера на другой. Это повышает безопасность миграции.
Если вы хотите понять, как работать с RabbitMQ так, чтобы не искать сложных решений там, где достаточно целевого хорошо настроенного инструмента, посмотрите видеокурс «RabbitMQ для админов и разработчиков». Он будет полезен тем, кто ещё не знаком с RabbitMQ, и тем, кто давно работает с ним только в базовом исполнении и хочет узнать о новых способах применения, нюансах отказоустойчивости и мониторинга.
Источник: slurm.io
Что такое RabbitMQ
Обновлено: 16.12.2021 Опубликовано: 29.12.2020
программный продукт для реализации брокера сообщений на основе протокола 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). Он распределяет сообщения по нескольким очередям.
Еще немного о RabbitMQ на Википедии.
Источник: www.dmosk.ru
RabbitMQ — установка и управлением брокером сообщений
Admin
02.01.2021 , обновлено: 18.11.2022
Linux, Mac OS, Python
Описание процесса установки и управления брокером сообщения RabbitMQ.
Эта статья связана со статьёй Flask, Celery, RabbitMQ. Была вынесена в отдельную статью из-за объема информации.
Зачем нужен RabbitMQ?
RabbitMQ — это «брокер сообщений», иными словами что-то вроде почтовой службы. Он принимает сообщения (задачи), обрабатывает очередь из этих задач и отправляет результат (например, сохраняя его в бд).
В Redis, который является сервисом хранилища данных в оперативной памяти тоже есть брокер сообщений. Однако RabbitMQ от начала и до конца был создан только для этой цели. Но если на сервере уже установлен Redis, то вероятно будет разумнее использовать его, а не добавлять дополнительные зависимости.
Установка RabbitMQ на Mac OS
Прежде чем отправить работать нашего почтальона на боевом сервере надо где-то все это отладить. Т.к. я использую Mac OS, то буду описывать процесс установки на эту операционную систему.
Как и все сторонние пакеты в Mac OS RabbitMQ устанавливается через менеджер пакетов Homebrew.
brew update
brew install rabbitmq
Потом надо его запустить:
brew services start rabbitmq
Добавить переменную окружения перед вводом команд на Mac OS. В противном случае будут ошибки:
zsh: command not found: rabbitmqctl
Для исправление ввести:
export PATH = $PATH : / usr / local / opt / rabbitmq / sbin
Если потребуется перезагрузкить кролика:
brew services restart rabbitmq
Установка RabbitMQ на Ubuntu 20.04
sudo apt update
sudo apt install rabbitmq-server
После установки сервер RabbitMQ запустится автоматически, а также будет добавлен в автозагрузку.
systemctl status rabbitmq-server.service
Все команды для RabbitMQ на Linux надо вводить или от пользователя root или через sudo.
rabbitmq_management
rabbitmq_management — это веб-панель управления очередями RabbitMQ.
Перед активацией веб-панели rabbitmq должен быть выключенным.
По умолчанию логин и пароль guest. Нет необходимости менять этого пользователя или пароля для него. Он доступен только в localhost.
Источник: ploshadka.net