Contents
Какую проблему решает RabbitMQ?
Прежде чем мы углубимся в то, что такое RabbitMQ и как его использовать, стоит больше узнать о самой предметной области. Связь между различными службами (также известными как компьютеры) — давняя проблема.
С одной стороны, существуют разные протоколы, определяющие средства транспортировки и свойства связи. Некоторые примеры таких протоколов включают SMTP, FTP, HTTP или WebSockets (и это лишь некоторые из них), все они основаны на TCP/UDP. Они имеют дело с форматированием, надежностью и поиском правильного получателя сообщения.
С другой стороны, мы можем исследовать общение с точки зрения сообщения. Он существует в одной системе, затем транспортируется в другую, трансформируется, то есть имеет жизненный цикл. Когда оно перемещается из одной системы в другую, мы должны знать, где находится сообщение и кому оно принадлежит в любой момент времени.
Упомянутые выше коммуникационные протоколы могут обеспечить передачу права собственности (и «физического» местоположения) сообщения из одной системы в другую (хотя выполнение этой транзакции может занять некоторое время). Мы можем рассматривать передачу как транзакцию между двумя сторонами, когда обе стороны присутствуют. В большинстве случаев желателен такой активный обмен, например запрос статуса услуги и ожидание своевременного и точного ответа. Примером из физического мира может быть звонок кому-то по телефону:
1) мы начинаем разговор,
2) ждем ответа другой стороны,
3) приятно беседуем,
4) кладем трубку.
Но бывают и другие случаи, когда нам не нужен ответ, нам просто нужно, чтобы получатель взял на себя ответственность за сообщение и выполнил свою работу. В этом случае нам нужен агент-посредник, другая система, чтобы взять на себя ответственность за сообщение (временно) и убедиться, что сообщение достигает пункта назначения. Чтобы продвинуть пример с телефоном, другая сторона в данный момент недоступна, поэтому мы оставляем голосовое сообщение. Служба голосовой почты уведомит предполагаемого получателя.
Эта асинхронная (отложенная) доставка сообщений — это то, что обеспечивает RabbitMQ. Очевидно, что он может больше, чем простой автоответчик, поэтому давайте рассмотрим некоторые из его возможностей ниже.
(Если вам интересно узнать больше об истории RabbitMQ, я рекомендую первую главу «RabbitMQ в действии» Альваро Видела и Джейсона Уильямса. Она раскроет ответ на вопрос, почему он назван в честь кроликов).
Что такое RabbitMQ?
RabbitMQ — это бесплатное расширяемое решение для организации очередей сообщений с открытым исходным кодом. Это брокер сообщений, который понимает AMQP (протокол расширенной очереди сообщений), но также может использоваться с другими популярными решениями для обмена сообщениями, такими как MQTT. Он отличается высокой доступностью, отказоустойчивостью и масштабируемостью. Он реализован в Erlang OTP , технологии, предназначенной для создания стабильных, надежных, отказоустойчивых и масштабируемых систем, обладающих собственными возможностями обработки очень большого количества одновременных операций, как в случае с RabbitMQ и другими системами, такими как WhatsApp, MongooseIM, чтобы упомянуть несколько.
На очень высоком уровне это уровень промежуточного программного обеспечения, который позволяет различным службам в вашем приложении взаимодействовать друг с другом, не беспокоясь о потере сообщений, обеспечивая при этом различные требования к качеству обслуживания (QoS). Кроме того, он обеспечивает точную и эффективную маршрутизацию сообщений, что позволяет полностью отделить приложения.
Сценарии использования
Чтобы продемонстрировать универсальность RabbitMQ, мы собираемся использовать три тематических исследования, которые демонстрируют, как RabbitMQ хорошо подходит в качестве подхода к управляемому сервису «черный ящик», поскольку он тесно интегрируется с приложением, обеспечивая хорошо функционирующую микросервисную архитектуру. или как шлюз к другим устаревшим проектам.
RabbitMQ как общая шина сообщений
Когда монолитная система разбивается на отдельные подсистемы, одной из самых больших проблем, требующих решения, является выбор технологии связи. Такие решения, как Mulesoft или MassTransit , могут «связывать» сервисы, объявляя прослушивателей и отправителей HTTP. Такое решение рассматривает RabbitMQ как черный ящик, но все же может использовать возможности RabbitMQ. В качестве примера прямой связи давайте воспользуемся HTTP для «подключения» отдельных сервисов. Хотя это хорошо поддерживаемый и надежный выбор, у него есть некоторые недостатки:
1) Обнаружение сервисов не решено. Возможным решением является использование DNS. По мере масштабирования и роста системы возрастает и сложность поиска и балансировки этой нагрузки. RabbitMQ может снизить повышенную сложность решения.
2) Общение эфемерно. Сообщения могут быть удалены или дублированы на сетевом уровне. Если служба временно недоступна, доставка невозможна.
RabbitMQ может помочь в обоих случаях, используя очереди сообщений в качестве средства транспортировки. Службы могут публиковать и потреблять сообщения, что отделяет сквозную доставку сообщений от доступности целевой службы. Если служба-потребитель временно недоступна, в отличие от HTTP, сообщение безопасно буферизуется и сохраняется в RabbitMQ и в конечном итоге доставляется, когда служба возвращается в оперативный режим.

Обнаружение также упрощается. Все, что нам нужно знать, это где находится RabbitMQ и как называется очередь. Хотя кажется, что это просто заново изобретает проблему, это масштабируемо. Имя очереди действует как адрес службы. Использование сообщений из очередей отдельными службами обеспечивает возможность масштабирования, т. е. каждая очередь может обслуживать нескольких потребителей и балансировать нагрузку. Нет необходимости изменять конфигурацию очереди, уже встроенную в сервисы.
Эта умеренно статическая конфигурация очереди переводит RabbitMQ на уровень промежуточного программного обеспечения, где надежная структура может гарантировать стабильное качество обслуживания в долгосрочной перспективе.
RabbitMQ как продвинутый уровень маршрутизации для микросервисов
На другом конце спектра находится архитектура, которая является более гибкой и адаптируется к постоянно меняющимся потребностям многих микросервисов. Что делает RabbitMQ лучшим в этой среде, так это очень мощные возможности маршрутизации, которые он предоставляет.
Логика маршрутизации реализована в различных (так называемых) типах обмена, которые при необходимости могут динамически создаваться приложением. Службы назначения создают очереди, из которых они хотят получать сообщения, а затем привязывают их к биржам, указывая шаблон для ключей, которые издатели могут использовать при публикации сообщения. (Думайте об этих ключах как о метаданных, которые биржи могут использовать для маршрутизации и доставки сообщений в одну или несколько очередей.)

RabbitMQ поставляется с четырьмя полезными типами обмена, которые охватывают большинство вариантов использования для обмена сообщениями:
1) Прямой обмен. При этом входящее сообщение будет доставлено в любую очередь, ключ привязки которой точно соответствует ключу маршрутизации сообщения. Если вы связываете очереди с именем очереди в качестве ключей маршрутизации, то вы можете думать об этом как о доставке сообщений один к одному. Одно и то же сообщение можно легко доставить в несколько очередей, используя ключи привязки для нескольких очередей.
2) Обмен темами. При этом входящее сообщение будет доставлено в любую очередь, чей ключ привязки подстановочного знака совпадает с ключом маршрутизации опубликованного сообщения. Ключи привязки могут содержать подстановочные знаки соответствия для составного ключа маршрутизации. (например, ключ привязки logs.*.error
будет соответствовать ключам маршрутизации logs.accounting.error
и logs.ui.error
). Это позволяет нам писать простые сервисы, в которых хорошо продумана логика, и сообщение будет поступать в нужные сервисы с помощью «волшебства» RabbitMQ.
3) Обмен разветвления. Некоторые сообщения должны быть доставлены во все очереди, здесь можно использовать разветвленный обмен вместо того, чтобы писать сложную многоадресную логику в приложении. При разветвленном обмене RabbitMQ каждый сервис привязывает соответствующую очередь к обмену без необходимости указывать ключ привязки, и все это происходит автоматически. Если указан ключ привязки, обмен разветвления просто проигнорирует его и по-прежнему будет направлять/рассылать сообщения во все привязанные к нему очереди.
4) Обмен заголовками. Этот обмен использует структуру сообщений AMQP и поддерживает сложную маршрутизацию на основе заголовков (включая пользовательские) сообщения AMQP. Заголовки — это метаданные, прикрепленные к каждому сообщению, отправляемому через AMQP.
Помимо обменов в RabbitMQ есть и другие полезные функции, которые позволяют реализовать очень сложную логику обмена сообщениями. Некоторые из наиболее важных функций включают в себя:
1) Пользовательские плагины. RabbitMQ расширяем, позволяя пользователям добавлять плагины. Почти каждый аспект RabbitMQ можно настроить, включая управление, аутентификацию и авторизацию, решения для резервного копирования и кластеризацию.
2) Кластеризация. Когда одного сервера RabbitMQ недостаточно, можно подключить несколько брокеров RabbitMQ для совместной работы и масштабирования системы. Это может позволить RabbitMQ обрабатывать больше сообщений или повысить устойчивость к ошибкам.
3) Настройка качества обслуживания. Доставке сообщений, зависящих от времени, можно помочь, присвоив значение TTL (Time-to-Live) либо сообщению, либо очереди. Сообщения с истекшим сроком ожидания могут быть автоматически доставлены в очередь недоставленных сообщений. Комбинируя обычную логику маршрутизации и эти дополнительные функции, можно получить сложную логику маршрутизации. Еще одна полезная функция — использование очередей с приоритетом, где издатель может назначить уровень приоритета для каждого сообщения. Также можно ограничить количество неподтвержденных сообщений, что позволяет настроить производительность потребляющих сервисов, в этом случае RabbitMQ применяет механизм обратного давления.
RabbitMQ интегрирован в устаревшие системы
В предыдущем примере использования я упомянул о возможности использования подключаемых модулей для расширения функциональности RabbitMQ. Эта мощная функция позволяет RabbitMQ действовать как посреднический уровень между вашими собственными службами RabbitMQ (с поддержкой AMQP) и другими устаревшими приложениями. Некоторые известные примеры включают в себя:
1) Использование RabbitMQ в качестве брокера MQTT путем простого включения подключаемого модуля. Это открывает возможности для многих технологий IoT.
2) Подключаемый модуль RabbitMQ JMS (Java Message Service), который позволяет RabbitMQ взаимодействовать с любым решением для обмена сообщениями с поддержкой JMS.
3) Если ваше приложение использует собственный протокол для связи, можно разработать собственный плагин для подключения к любым таким службам.
Вывод
Как показывают приведенные выше примеры, вряд ли существует что-либо, с чем RabbitMQ не может взаимодействовать. Но, как и у всего в жизни, у этого есть цена. Хотя настройка RabbitMQ в основном проста, иногда простое количество функций может быть ошеломляющим. Если у вас возникнут проблемы с проектированием, внедрением или поддержкой брокеров RabbitMQ, обратитесь к нашей команде экспертов здесь. Или, если вы хотите начать свою карьеру в одной из самых востребованных технологий, запишитесь на наш
статья является переводом RabbitMQ