RabbitMQ в действии: производительность и безопасность

Безопасность RabbitMQ

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

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

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

Через введение вы узнаете:

  • Учет скорости
  • Соображения по поводу памяти и процессов
  • соображения безопасности

Учет скорости

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

сохранение сообщения

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

подтверждение сообщения

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

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

Алгоритмы маршрутизации и правила привязки

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

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

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

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

опубликовать сообщение

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

Когда для обязательного флага установлено значение true, если биржа не может найти квалифицированную очередь в соответствии с собственным типом и сообщением routeKey, будет вызван метод basic.return для возврата сообщения производителю. , описанная выше ситуация произойдет с брокером. Сообщение будет удалено напрямую.

Когда для немедленного флага установлено значение true, если обмен обнаруживает, что в соответствующей очереди нет получателя при маршрутизации сообщения в очередь (очереди), сообщение не будет помещено в очередь. Когда все очереди, связанные с сообщением routeKey, не имеют потребителей, сообщение возвращается производителю с помощью метода basic.return.

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

Есть еще один параметр, на который стоит обратить внимание: auto-ack, после того как потребитель получит сообщение, он сразу же подтвердит сообщение, не дожидаясь обработки логики.

消息路由过程

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

Соображения по поводу памяти и процессов

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

соображения памяти

Относительно использования памяти в книге есть подробные инструкции.Здесь приведены только результаты анализа для справки при оценке емкости: (√ указывает, какие таблицы будут добавлять записи в объявление очереди)

1. Метаданные очереди

队列元数据

2. Обмен метаданными

交换器元数据

3. Привязка метаданных

Привязка постоянной очереди к переходному коммутатору приводит к созданию записи в таблице rabbit_semi_durable_router.

绑定元数据

Количество процессов Erlang

Максимальное количество процессов Erlang, которые могут выполняться на узле Erlang, можно указать при запуске узла.Настройка по умолчанию — 1048576 на узел Erlang или 2^20.

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

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

соображения безопасности

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

Про сертификаты, openssl и ssl в прошлой статье подробно рассказывалось, теперь посмотрим, как их использовать.

Сервер

Просто измените конфигурацию rabbitmq и добавьте элементы конфигурации ssl_listeners и ssl_options в rabbitmq.config:

[
    {rabbit,[
        {ssl_listeners, [5671]},
        {ssl_options, [
            {cacertfile,"/path/to/rmqca/cacert.pem"},
            {certfile,"/path/to/server/cert.pem"},
            {keyfile,"/path/to/server/key.pem"},
            {verify,verify},
            {fail_if_no_peer_cert,false}
        ]}
    ]}

]

Конфигурация указывает сертификат ЦС, сертификат сервера и секретный ключ сервера.

клиент

require_once(__DIR__ . '/../amqp.inc');

define('HOST', 'localhost');
define('PORT', 5671);
define('USER', 'guest');
define('PASS', 'guest');
define('VHOST', '/');
define('AMQP_DEBUG', true);
define('CERTS_PATH',
  '/path/to/ca/folder/');
  
$ssl_options = array(
      'cafile' => CERTS_PATH . '/rmqca/cacert.pem',
      'local_cert' => CERTS_PATH . '/phpcert.pem',
      'verify_peer' => true
  );
$conn = new AMQPSSLConnection(HOST, PORT, USER, PASS, VHOST, $ssl_options);

function shutdown($conn){
    $conn->close();
}
register_shutdown_function('shutdown', $conn);

while(1){}

Код клиента указывает корневой сертификат ЦС, сертификат клиента и секретный ключ.phpcert.pem представляет собой объединенный файл сертификата клиента, секретного ключа и корневого сертификата ЦС.

$ cat client/key.pem > phpcert.pem
$ cat client/cert.pem >> phpcert.pem
$ cat rmqca/cacert.pem >> phpcert.pem

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

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

情情说