Бой RabbitMQ: расширенное введение и краткое изложение серии

задняя часть сервер RabbitMQ Erlang

Эта серия представляет собой краткий обзор книги «RabbitMQ в действии: эффективное развертывание распределенных очередей сообщений».

Эта статья является последней из серии «RabbitMQ в действии». В ней в основном рассказывается о подключаемом модуле RabbitMQ, о том, как его установить и активировать, перечислены некоторые часто используемые подключаемые модули и способы их настройки.

Прежде чем вступить, давайте обобщим основное содержание этой серии и свяжем их воедино.

Краткое изложение серии

Вначале RabbitMQ был определен следующим образом: это брокер сообщений с открытым исходным кодом и сервер очередей, который может обмениваться данными между разрозненными приложениями через базовый протокол и может ставить задания в очередь для обработки распределенными службами.

В этом предложении есть несколько ключевых слов: брокер сообщений, сервер очередей, общие данные, распределенная обработка, которые будут объяснены отдельно для углубления понимания.

Брокер сообщений: RabbitMQ можно рассматривать как прокси-сервер. С одной стороны, он разделяет производителей и потребителей сообщений, что делает его более гибким, с другой стороны, производителям не нужно учитывать способ распространения сообщений. RabbitMQ предоставляет Разнообразие стратегий дистрибуции.

Сервер очереди: сообщение, наконец, кэшируется в очереди, и потребитель потребляет сообщение из указанной очереди, поэтому необходимо управлять очередью и сообщениями в очереди.

Общие данные: в основном означает, что сообщения могут передавать данные между различными приложениями, которые стандартизированы через протокол AMQP для достижения цели обмена данными.

Распределенная обработка: несколько потребителей могут подписаться на одну и ту же очередь, чтобы несколько компьютеров могли одновременно обрабатывать один и тот же пакет данных для достижения эффекта распределенной обработки.

Если вы разбираетесь в основных элементах AMQP и модели сообщений, вы будете хорошо понимать вышеприведенные концепции.Есть 2 статьи, посвященные этому.

В некоторых сценариях доступность RabbitMQ относительно высока, и потеря сообщений недопустима.Необходимо понимать гарантию доступности и реализацию RabbitMQ. Кроме того, необходимо иметь возможность отслеживать работу самого RabbitMQ и его различных компонентов в режиме реального времени, и своевременно сигнализировать о возникновении проблемы, чтобы быстро с ней справиться.

Если количество сообщений и параллелизм относительно велико, необходимо сбалансировать доступность и производительность в соответствии с различными бизнес-сценариями для удовлетворения бизнес-потребностей.

Некоторые сообщения являются конфиденциальными и должны быть зашифрованы во время передачи, что хорошо решается протоколом ssl.

Наконец, RabbitMQ предоставляет ряд подключаемых модулей, которые предоставляют нам множество полезных функций, таких как подключаемые модули интерфейса веб-управления, подключаемые модули репликации между машинными комнатами Shovel и т. д. Он также позволяет нам настраивать подключаемые модули и расширить необходимые функции.

полный индекс:

  1. понимать сообщения
  2. запускать и управлять
  3. Модели обмена сообщениями и лучшие практики
  4. Юзабилити-анализ и реализация
  5. Управление интерфейсом и мониторинг
  6. Введение в безопасность передачи данных
  7. производительность и безопасность

Введение в плагин

Когда требуются какие-то функции, а их нет на сервере, их можно усилить, добавив плагины, которые можно найти в Интернете, или написав плагины самостоятельно.

Что можно сделать с помощью плагинов

Начнем с нескольких простых примеров, которые можно решить установкой плагинов:

  • Поддержка протоколов, отличных от AMQP;
  • Различные механизмы аутентификации (LDAP, пользовательские базы данных);
  • копия сообщения;
  • новые коммутаторы и алгоритмы маршрутизации;
  • журнал сообщения и аудит;

STOMP — это простой текстовый протокол для передачи данных между приложениями. Он может работать с серверами ActiveMQ. Если ваш код основан на ActiveMQ и STOMP, но вы хотите использовать RabbitMQ, вы можете использовать плагин STOMP для адаптации.

Предполагая, что все управление пользователями в вашей системе осуществляется через LDAP, если вы хотите использовать его для аутентификации в RabbitMQ, вы можете использовать плагин rabbitmq-auth-backend-ldap для интеграции.

LDAP — это упрощенный протокол доступа к каталогам, профессиональная распределенная база данных, оптимизированная для запросов, просмотра и поиска, которая организует данные в виде древовидной структуры, как файловый каталог в системах Linux/Unix. В отличие от реляционных баз данных, базы данных-каталоги обладают отличной производительностью чтения, но низкой производительностью записи и не имеют сложных функций, таких как обработка транзакций и откат, поэтому они не подходят для хранения часто изменяемых данных. Таким образом, каталог предназначен для запросов по своей природе, как и его имя.

Вы также можете настроить переключатель правил маршрутизации, о чем будет подробно рассказано ниже.

Поиск и управление плагинами

может просматриватьОфициальная страница сайта, чтобы найти плагины на этапах обслуживания и экспериментов.

Давайте взглянем на некоторые команды управления плагином:

Включите плагин.После включения плагина вам необходимо перезапустить сервер RabbitMQ:

./rabbitmq-plugins enable <plugin-name>

Отключите плагин.После отключения плагина вам необходимо перезапустить сервер RabbitMQ:

./rabbitmq-plugins disable <plugin-name>

Просмотр включенных плагинов:

./rabbitmq-plugins list -e

пользовательский плагин

На конкретном примере познакомить с разработкой кастомных плагинов, есть такой сценарий: с помощью RabbitMQ моделируем чат-приложение, в модели есть глобальный чат, сюда подключаются все пользователи, и у каждого пользователя своя очередь, привязан к глобальному обмену разветвлениями.

Каждый раз, когда сообщение отправляется на биржу, сообщение будет отправлено во все связанные очереди, но если новый клиент подключится к этому чату, он получит только новое сообщение, отправленное в чат, и не сможет понять контекст сеанс перед присоединением.

Если вы можете отправлять последние сообщения новым клиентам, пользовательский опыт будет лучше, и вы можете реализовать эту функцию через пользовательский обмен.

Среда разработки плагинов и инструкции

Разработчики RabbitMQ создали среду разработки, Public Umbrella RabbitMQ, извлекая ее из кодовой базы, а затем добавляя свои собственные подключаемые модули в структуру проекта.

RabbitMQ разработан на языке Erlang. Исходный код Erlang организован в модули. Функции в модулях реализуют функции, которые должно предоставить приложение. Плагину нужен только один модуль для реализации пользовательского интерактора.

В объектно-ориентированном программировании есть понятие интерфейса, и в Erlang есть такое же понятие: поведение.

Поведение Erlang определяет, какие функции модуль должен реализовать и экспортировать, чтобы код, вызывающий модуль, знал, как его использовать.

Еще одно отличие заключается в том, что в Erlang нет концепции видимости, как в java.У него есть список экспорта модулей.Если модуль реализует функции fun1, fun2 и fun3, но экспортирует только fun1, fun2 и fun3 не будут вызываться внешний мир.

Кроме того, существует понятие количества параметров функции, которое может принимать функции с одинаковым именем и разным количеством параметров, поэтому Behavious может определить, что функции fun1/1 и fun1/2 — это две разные функции.

Общие шаги

Во-первых, подтвердите поведение, которое нужно расширить, RabbitMQ предоставляет поведение обмена с именем rabbit_exchange_type, которое указывает, какие функции необходимо реализовать, чтобы стать совместимым обменом.

Затем разберитесь с идеями реализации: то, что мы хотим реализовать, — это расширенная версия обмена типа разветвления, которая кэширует последние 20 сообщений, которую можно реализовать на основе обмена разветвлениями на RabbitMQ.

  • Маршрутизируемые сообщения необходимо кэшировать.Каждый раз, когда коммутатор маршрутизирует сообщение, он сохраняет его в базе данных.Эта функция может быть реализована в функции route/2;
  • Когда очередь привязана к обмену, необходимо доставить кешированное сообщение, эту функцию можно реализовать в функции add_binding/3;
  • При удалении обмена кешированное сообщение нужно отбрасывать.Эта функция может быть реализована в функции delete/3;

Затем, чтобы реализовать поведение переключателя, я не смотрел на соответствующие детали реализации.Если вам интересно, вы можете проверить код реализации:портал.

Наконец, зарегистрируйте обмен с помощью RabbitMQ. RabbitMQ поддерживает реестр и использует эту таблицу для отслеживания всех типов обмена и имен их модулей. Предполагая, что сообщения публикуются на обмене разветвления, RabbitMQ войдет в реестр и проверит, какой модуль реализует переключатель разветвления. , найдя его, он продолжит вызывать функцию маршрутизации модуля.

Поэтому нам нужно найти способ добавить пользовательский переключатель в реестр. RabbitMQ поддерживает концепцию шагов запуска. При запуске сервера будет вызван ряд шагов. Вы можете добавить шаг запуска в модуль. Запуск RabbitMQ то есть он будет автоматически добавлен в реестр Rabbit_registry.

-rabbit_boot_step({rabbit_exchange_type_rh_registry,
[{description, "recent history exchange type: registry"},
  {mfa, {rabbit_registry, register,
          [exchange, <<"x-recent-history">>,
           ?MODULE]}}, //注册自定义交换器
  {requires, rabbit_registry}, 
  {enables, kernel_ready}]}).

Выше настраиваемый переключатель завершен, и можно написать программу для проверки.

require_once('../lib/php-amqplib/amqp.inc');
define('HOST', 'localhost');
define('PORT', 5672);
define('USER', 'guest');
define('PASS', 'guest');
define('VHOST', '/');

$exchange = 'rh-exchange';
$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$ch = $conn->channel();
$ch->exchange_declare($exchange,
        'x-recent-history', //使用自定义交换器
        false,
        true,
        false);

Добро пожаловать, чтобы отсканировать QR-код ниже, подписаться на мою личную общедоступную учетную запись WeChat и поделиться моей работой, учебой и жизнью ~

情情说