Очередь сообщений RabbitMQ
RabbitMQ — наиболее распространенный брокер сообщений в мире с открытым исходным кодом, известный как удобный и надежный брокер сообщений общего назначения. Он используется для связи между приложениями и идеально подходит для длительных задач или когда вам необходимо выполнять надежные фоновые задания. RabbitMQ редко оказывается в центре внимания, поскольку он всегда действует за кулисами. Тем не менее, он играет жизненно важную роль, и ему доверяют крупные компании по всему миру в самых разных отраслях. Причина популярности RabbitMQ заключается в том, что он хорошо масштабируется и его можно легко адаптировать для удовлетворения множества различных потребностей. И последнее, но не менее важное: он имеет открытый исходный код и активное сообщество.
Техническая информация и краткая история
Открытый исходный код: публичная лицензия Mozilla.
Написан на: Эрланг
Выпущена первая версия: 2007 год
- RabbitMQ сохраняет сообщения до тех пор, пока они не будут удалены при подтверждении получения.
- Доступен мониторинг через встроенный пользовательский интерфейс.
- Поддерживается большинство языков.
- Поддерживает несколько протоколов обмена сообщениями.
- Поддерживает стандартную аутентификацию и OAuth2.
- RabbitMQ позволяет клиентам подключаться по ряду различных открытых и стандартизированных протоколов, таких как AMQP, HTTP, STOMP, MQTT и WebSockets/Web-Stomp.
Первоначально RabbitMQ был разработан LShift и CohesiveFT как совместный проект еще в 2007 году. В 2010 году RabbitMQ был приобретен подразделением VMware SpringSource, а позже, в 2013 году, проект стал частью Pivotal Software.
Легкий в использовании
RabbitMQ Management — это удобный интерфейс, который позволяет вам отслеживать и управлять вашим сервером RabbitMQ через веб-браузер. Помимо прочего, очереди, соединения, каналы, обмены, пользователи и разрешения пользователей могут обрабатываться — создаваться, удаляться и перечисляться — в браузере. Вы можете отслеживать скорость сообщений и отправлять/получать сообщения вручную. В этом разделе представлена информация о различных представлениях, имеющихся в интерфейсе управления RabbitMQ. Интерфейс управления RabbitMQ — это плагин, который можно включить для RabbitMQ. Он предоставляет одну статическую HTML-страницу, которая выполняет фоновые запросы к HTTP API для RabbitMQ. Информация из интерфейса управления может быть полезна при отладке приложений или когда вам нужен обзор всей системы. Если вы видите, что количество неподтвержденных сообщений начинает расти, это может означать, что ваши потребители работают медленно. Если вам нужно проверить, работает ли обмен, вы можете попробовать отправить тестовое сообщение через интерфейс.
Огромное, активное и поддерживающее сообщество
Сообщество предлагает различные возможности для поддержки и знаний. После регистрации вы сможете стать частью сообщества RabbitMQ по этим каналам:
- Список рассылки: обсудите RabbitMQ и получите помощь по техническим вопросам, присоединившись к официальному списку рассылки RabbitMQ.
- GitHub: Разработка RabbitMQ ведется на GitHub.
- Саммит RabbitMQ: Саммит RabbitMQ объединяет пользователей и разработчиков со всего мира. Узнайте от докладчиков, что происходит внутри и вокруг RabbitMQ, а также как ведущие компании используют RabbitMQ для поддержки своих сервисов.
- Slack: Существует бесплатный канал Slack сообщества RabbitMQ, где вы можете получить поддержку от сообщества.
- Stack Overflow: Если вам нужны ответы на ваши технические вопросы, многие пользователи RabbitMQ будут готовы помочь вам в Stack Overflow.
- Twitter: Если вы пишете в Твиттере о своем путешествии по RabbitMQ, не забудьте использовать хэш-тег #rabbitmq.
В хорошем состоянии – новый выпуск каждые ~6 месяцев
RabbitMQ — это хорошо поддерживаемое программное обеспечение, новые выпуски которого выходят примерно каждые 6 месяцев. Получите информацию о выпусках и изменениях можно в журнале изменений на веб-сайте RabbitMQ или в примечаниях к выпуску на GitHub.
Обзор протокола AMQP
RabbitMQ реализует стандартный протокол AMQP, сокращенно от Advanced Message Queuing Protocol. С годами RabbitMQ был расширен для поддержки дополнительных протоколов, таких как STOMP, MQTT и других.
AMQP по-прежнему наиболее широко используется и будет в центре внимания этого курса. Протокол — это, по сути, спецификация или стандарт, который позволяет электронным устройствам эффективно взаимодействовать друг с другом.
Это достигается путем объявления того, как данные отправляются в соответствии с набором правил. Эти правила могут включать в себя, какие команды следует использовать при отправке или получении данных, какой тип данных можно передавать и как подтвердить успешную передачу данных.
Мы полагаемся на стандартные протоколы каждый день, когда пользуемся Интернетом, даже не задумываясь об этом. Протоколы — это то, что позволяет компьютеру получить доступ к веб-сайту, размещенному на сервере на базе Unix (HTTP). Это также позволяет смартфону отправлять электронную почту на устройство Android (SMTP).
По сути, протоколы позволяют подключенным устройствам взаимодействовать друг с другом, независимо от каких-либо различий в их внутренних процессах, структуре или конструкции.
Но вернемся к AMQP. AMQP — это протокол, специально предназначенный для отправки сообщений в очередь. Чтобы RabbitMQ был совместимым, он должен соответствовать правилам маршрутизации и хранения сообщений в брокере.
Протокол, например, очень специфичен в отношении того, как устанавливаются соединения, поведение брокера и то, как вы объявляете очереди. Другие определяющие особенности AMQP включают спецификации надежности и безопасности.
Теперь, когда мы понимаем разницу между RabbitMQ (программным обеспечением) и AMQP (протоколом), пришло время погрузиться немного глубже.
Очередь действует как буфер хранения сообщений для еще не использованных сообщений. Между вашим сервисом и брокером AMQP устанавливается соединение. Канал — это виртуальное соединение внутри этого соединения. Все сообщения внутри системы всегда отправляются через канал. Каналы мультиплексированы, что означает, что одно соединение может иметь несколько каналов.
Сообщения на самом деле не публикуются непосредственно в очереди. Вместо этого producer отправляет сообщения через Exchange. Вы можете думать об Exchange как о человеке, доставляющем почту, который следит за тем, чтобы сообщение попало в правильную очередь. Сообщения направляются в очереди в зависимости от привязок между очередями и exchanges, а также ключа маршрутизации.
Ключ маршрутизации — это в основном то, что Exchange ищет при принятии решения о маршрутизации сообщения в очереди.
Сообщения отправляются брокеру и обратно. Помимо основного содержания, каждое сообщение также содержит набор заголовков с определяющими свойствами, такими как долговечность и приоритет.
AMQP очень ясно дает понять, когда ответственность за сообщение передается от одной части системы к другой. Это делается с помощью команд подтверждения — чтобы подтвердить, что сообщение было успешно передано и обработано.
Виртуальные хосты, или vhosts, позволяют разделить приложения в брокере. Права доступа пользователей к разным виртуальным хостам могут различаться, а очереди и exchanges существуют только на одном виртуальном хосте.
Как все это связано
Давайте соединим понятия, которые мы уже изучили. Брокер сообщений действует как посредник между службами, которые хотят взаимодействовать асинхронно, отправляя сообщения.
Сообщения отправляются от производителя(Producer). Сообщения обрабатываются Потребителем(Consumer). Само сообщение содержит информацию различного рода. Сообщение, отправленное от производителя, помещается в очередь сообщений в последовательном порядке внутри брокера, прежде чем оно будет обработано потребителем.
Брокер использует протокол, который состоит из набора возможностей обмена сообщениями. Сообщение отправляется от источника в очередь через соединение и канал.
Exchange гарантирует, что сообщение попадет в правильную очередь.
Привязка соединяет Exchange и очередь.
Vhost предоставляет способ разделения приложений, используя один и тот же экземпляр RabbitMQ.
Потребители извлекают сообщения из очереди и обрабатывают их в последовательном порядке.