RabbitMQ в действии: понимание обмена сообщениями

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

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

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

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

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

Из этого введения вы узнаете:

  • Концепции обмена сообщениями: потребители, производители и посредники
  • Элементы AMQP: очереди, обмены, привязки
  • веб хостинг
  • сохранение сообщения
  • режим подтверждения отправителя

концепция передачи сообщений

Введение в эту часть будет связано с элементами AMQP. Если вы еще не касались этого, вы можете понять его в сочетании со следующими «элементами AMQP».

Информация

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

Его можно сравнить с протоколом HTTP.Заголовок сообщения HTTP описывает тип и размер тела сообщения.Тело сообщения HTTP представляет собой данные, которые должны быть переданы.Сервер HTTP решает, как обрабатывать запрос и данные через заголовок сообщения.

производитель и потребитель

Производитель создает сообщение и отправляет его на прокси-сервер (сервер RabbitMQ).AMQP будет выражать сообщение только с тегом (имя обмена и необязательный тег темы), а сервер Rabbit отправит сообщение подписавшимся потребителям в соответствии с тег. .

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

Примечание. Сообщение, полученное потребителем, включает в себя только полезную нагрузку, никто не будет знать, откуда оно пришло.

связи и каналы

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

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

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

AMQP-элементы

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

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

AMQP基本模型

Как показано на рисунке выше: P — производитель, X — обмен, тип обмена — прямой, по разным правилам привязки (оранжевый, черный, зеленый) распределяется по разным очередям, C — потребитель, введение сообщений из разных очередей.

очередь

Потребители получают сообщения из определенной очереди двумя способами:

  • basic.consume, который переводит канал в режим приема до тех пор, пока очередь не будет отписана;
  • basic.get, позволяет потребителю активно получать следующее сообщение в очереди;

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

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

Кроме того, каждое сообщение, полученное потребителем, должно быть подтверждено, а подтверждение должно быть отправлено на сервер rabbitmq с помощью команды basic.ack. Вы также можете установить для auto_ack значение true, пока потребитель получит сообщение, оно будет автоматически рассматриваться как подтверждение, но это не рекомендуется, поскольку его получение не означает, что обработка бизнес-логики прошла успешно. После того, как сервер получит подтверждение, он удалит соответствующее сообщение из очереди.

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

  • Отключите потребителя от сервера RabbitMQ, чтобы RabbitMQ автоматически поставил сообщение в очередь и отправил его другому потребителю;
  • Если вы не хотите отправлять его другим потребителям для обработки, вы просто хотите проигнорировать это сообщение, вы можете отправить команду basic.reject;

Наконец, давайте представим, как создать очередь.Во-первых, ясно, создает ли ее производитель или потребитель.Ключевым моментом является то, может ли производитель позволить себе потерянные сообщения, потому что, если отправленные сообщения направляются в несуществующие очереди, Rabbit будет их игнорировать. Поэтому рекомендуется, чтобы и производитель, и потребитель попытались создать очередь.Вы можете определить, существует ли очередь, установив для пассивного параметра queue.declare значение true.Если это не так, будет возвращена ошибка.

Очередь создается командой queue.declare, есть несколько опций, описанных ниже:

  • эксклюзивный: если установлено значение true, очередь станет частной, и только приложение, создавшее очередь, может использовать сообщения очереди;
  • автоматическое удаление: когда последний потребитель отпишется, очередь будет автоматически удалена;
  • прочный: сохраняться ли;
queueDeclare(String queue, 
            boolean durable, 
            boolean exclusive, 
            Map<String, Object> arguments);
Обменники и привязки

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

Первый: прямой обмен

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

channel.exchangeDeclare(EXCHANGE_NAME, "direct");
channel.queueBind(queueName, EXCHANGE_NAME, routingKey);

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

Второй: переключатель разветвления

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

fanout交换器

channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

Третий тип: тематический обмен

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

tipic交换器

channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.queueBind(queueName, EXCHANGE_NAME, "*.orange.*");

Что касается шаблонов, символ # соответствует одному или нескольким словам, а символ * соответствует слову, поэтому kfs.# может соответствовать kfs.session.message, а audit.* будет соответствовать только audit.session.

веб хостинг

Каждый сервер RabbitMQ может создать виртуальный сервер сообщений, называемый виртуальным хостом (vhost).Каждый RabbitMQ, по сути, представляет собой мини-версию сервера RabbitMQ со своими собственными очередями, обменами, привязками и собственным механизмом разрешений.

При подключении должен быть указан виртуальный хост, rabbitmq содержит виртуальный хост по умолчанию: "/". Когда пользователь создается, он закрепляется как минимум за одним vhsot и изолируется друг от друга.

vhost нельзя создать по протоколу AMQP, его необходимо создать с помощью инструмента rabbitmqctl.

Сохраняемость сообщений и шаблоны подтверждения отправителя

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

  • Обмен устанавливается постоянным через атрибут durable;
  • Очередь устанавливается как постоянная с помощью атрибута durable;
  • Режим доставки сообщений установлен на 2;

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

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

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

Благодаря введению этой статьи у меня появилось общее представление о модели сообщений Rabbit.В следующей статье будет написана DEMO и представлена ​​работа и управление RabbitMQ.

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

情情说