Эта серия представляет собой краткий обзор книги «RabbitMQ в действии: эффективное развертывание распределенных очередей сообщений».
Эта статья является последней из серии «RabbitMQ в действии». В ней в основном рассказывается о подключаемом модуле RabbitMQ, о том, как его установить и активировать, перечислены некоторые часто используемые подключаемые модули и способы их настройки.
Прежде чем вступить, давайте обобщим основное содержание этой серии и свяжем их воедино.
Краткое изложение серии
Вначале RabbitMQ был определен следующим образом: это брокер сообщений с открытым исходным кодом и сервер очередей, который может обмениваться данными между разрозненными приложениями через базовый протокол и может ставить задания в очередь для обработки распределенными службами.
В этом предложении есть несколько ключевых слов: брокер сообщений, сервер очередей, общие данные, распределенная обработка, которые будут объяснены отдельно для углубления понимания.
Брокер сообщений: RabbitMQ можно рассматривать как прокси-сервер. С одной стороны, он разделяет производителей и потребителей сообщений, что делает его более гибким, с другой стороны, производителям не нужно учитывать способ распространения сообщений. RabbitMQ предоставляет Разнообразие стратегий дистрибуции.
Сервер очереди: сообщение, наконец, кэшируется в очереди, и потребитель потребляет сообщение из указанной очереди, поэтому необходимо управлять очередью и сообщениями в очереди.
Общие данные: в основном означает, что сообщения могут передавать данные между различными приложениями, которые стандартизированы через протокол AMQP для достижения цели обмена данными.
Распределенная обработка: несколько потребителей могут подписаться на одну и ту же очередь, чтобы несколько компьютеров могли одновременно обрабатывать один и тот же пакет данных для достижения эффекта распределенной обработки.
Если вы разбираетесь в основных элементах AMQP и модели сообщений, вы будете хорошо понимать вышеприведенные концепции.Есть 2 статьи, посвященные этому.
В некоторых сценариях доступность RabbitMQ относительно высока, и потеря сообщений недопустима.Необходимо понимать гарантию доступности и реализацию RabbitMQ. Кроме того, необходимо иметь возможность отслеживать работу самого RabbitMQ и его различных компонентов в режиме реального времени, и своевременно сигнализировать о возникновении проблемы, чтобы быстро с ней справиться.
Если количество сообщений и параллелизм относительно велико, необходимо сбалансировать доступность и производительность в соответствии с различными бизнес-сценариями для удовлетворения бизнес-потребностей.
Некоторые сообщения являются конфиденциальными и должны быть зашифрованы во время передачи, что хорошо решается протоколом ssl.
Наконец, RabbitMQ предоставляет ряд подключаемых модулей, которые предоставляют нам множество полезных функций, таких как подключаемые модули интерфейса веб-управления, подключаемые модули репликации между машинными комнатами Shovel и т. д. Он также позволяет нам настраивать подключаемые модули и расширить необходимые функции.
полный индекс:
- понимать сообщения
- запускать и управлять
- Модели обмена сообщениями и лучшие практики
- Юзабилити-анализ и реализация
- Управление интерфейсом и мониторинг
- Введение в безопасность передачи данных
- производительность и безопасность
Введение в плагин
Когда требуются какие-то функции, а их нет на сервере, их можно усилить, добавив плагины, которые можно найти в Интернете, или написав плагины самостоятельно.
Что можно сделать с помощью плагинов
Начнем с нескольких простых примеров, которые можно решить установкой плагинов:
- Поддержка протоколов, отличных от 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 и поделиться моей работой, учебой и жизнью ~